[libpostgresql-jdbc-java] 01/04: New upstream version 42.2.2
Christoph Berg
myon at debian.org
Mon Apr 30 21:41:44 BST 2018
This is an automated email from the git hooks/post-receive script.
myon pushed a commit to branch master
in repository libpostgresql-jdbc-java.
commit 783ccf15d9e6776fed0c1b5a3c9645608048b75c
Author: Christoph Berg <myon at debian.org>
Date: Mon Apr 30 22:29:02 2018 +0200
New upstream version 42.2.2
---
.gitignore | 1 +
.travis.yml | 201 +-
.travis/secrets.tar.enc | Bin 0 -> 13344 bytes
.travis/travis_build.sh | 25 +-
.travis/travis_check_postgres_health.sh | 42 +
.travis/travis_configure_replication.sh | 31 +
.travis/travis_configure_ssl.sh | 48 +
.travis/travis_configure_xa.sh | 2 +-
.travis/travis_create_slaves.sh | 76 +
.travis/travis_deploy.sh | 2 +-
.travis/travis_install_head_postgres.sh | 27 +-
.travis/travis_install_openj9.sh | 13 +
.travis/travis_install_postgres.sh | 6 +-
.travis/travis_install_zulu.sh | 11 +
.travis/travis_release.sh | 102 +
.travis/travis_ssl_users.sh | 12 +
.travis/travis_start_postgres.sh | 6 +-
CHANGELOG.md | 136 ++
CONTRIBUTING.md | 29 +-
README.md | 80 +-
appveyor.yml | 36 +
build.properties | 8 +-
certdir/README | 2 +-
certdir/server/pg_hba.conf | 4 +-
codecov.yml | 2 +-
docs/.gitignore | 1 +
docs/_config.yml | 11 +
docs/_includes/submenu_about.html | 9 +
docs/_includes/submenu_community.html | 9 +
docs/_includes/submenu_development.html | 12 +
docs/_includes/submenu_documentation.html | 10 +
docs/_layouts/changes.html | 9 +
docs/_layouts/default.html | 108 +
docs/_layouts/default_docs.html | 91 +
docs/_layouts/documents.html | 18 +
docs/_layouts/downloads.html | 8 +
docs/_layouts/faqs.html | 9 +
docs/_layouts/todos.html | 9 +
docs/_posts/2017-02-20-42.0.0-release.md | 148 ++
docs/_posts/2017-05-04-42.1.0-release.md | 97 +
docs/_posts/2017-05-05-42.1.1-release.md | 27 +
docs/_posts/2017-07-12-42.1.2-release.md | 73 +
docs/_posts/2017-07-14-42.1.3-release.md | 27 +
docs/_posts/2017-08-01-42.1.4-release.md | 54 +
docs/_posts/2018-01-17-42.2.0-release.md | 254 ++
docs/_posts/2018-01-25-42.2.1-release.md | 79 +
docs/_posts/2018-03-15-42.2.2-release.md | 95 +
docs/about/about.html | 29 +
docs/about/extras.html | 43 +
docs/about/license.html | 45 +
docs/community/community.html | 25 +
docs/community/contributors.html | 196 ++
docs/community/mailinglist.html | 89 +
docs/development/development.html | 100 +
docs/development/git.html | 44 +
docs/development/status.html | 63 +
docs/development/todo.md | 110 +
docs/development/translations.html | 132 +
docs/development/website.html | 66 +
docs/documentation/92/binary-data.md | 179 ++
docs/documentation/92/callproc.md | 116 +
docs/documentation/92/classpath.md | 26 +
docs/documentation/92/connect.md | 234 ++
docs/documentation/92/datasource.md | 44 +
docs/documentation/92/ddl.md | 24 +
docs/documentation/92/ds-cpds.md | 93 +
docs/documentation/92/ds-ds.md | 178 ++
docs/documentation/92/escaped-functions.md | 480 ++++
docs/documentation/92/escapes-datetime.md | 23 +
docs/documentation/92/escapes.md | 57 +
docs/documentation/92/ext.md | 36 +
docs/documentation/92/geometric.md | 68 +
docs/documentation/92/index.html | 253 ++
docs/documentation/92/intro.md | 22 +
docs/documentation/92/jndi.md | 68 +
docs/documentation/92/largeobjects.md | 20 +
docs/documentation/92/listennotify.md | 148 ++
docs/documentation/92/load.md | 47 +
docs/documentation/92/media/css/docs.css | 450 ++++
docs/documentation/92/media/css/docs.css~ | 450 ++++
docs/documentation/92/media/css/global.css | 98 +
docs/documentation/92/media/css/table.css | 101 +
docs/documentation/92/media/css/table.css~ | 101 +
docs/documentation/92/media/css/text.css | 162 ++
docs/documentation/92/media/favicon.ico | Bin 0 -> 2550 bytes
docs/documentation/92/media/img/docs/bg_hdr.png | Bin 0 -> 173 bytes
.../92/media/img/layout/hdr_left3a.png | Bin 0 -> 93930 bytes
.../92/media/img/layout/nav_tbl_btm.png | Bin 0 -> 218 bytes
.../92/media/img/layout/nav_tbl_top.png | Bin 0 -> 212 bytes
docs/documentation/92/outer-joins-escape.md | 17 +
docs/documentation/92/prepare.md | 25 +
docs/documentation/92/query.md | 113 +
docs/documentation/92/reading.md | 18 +
docs/documentation/92/resultset.md | 19 +
docs/documentation/92/server-prepare.md | 121 +
docs/documentation/92/setup.md | 44 +
docs/documentation/92/ssl-client.md | 70 +
docs/documentation/92/ssl-factory.md | 29 +
docs/documentation/92/ssl.md | 37 +
docs/documentation/92/statement.md | 25 +
docs/documentation/92/thread.md | 38 +
docs/documentation/92/tomcat.md | 121 +
docs/documentation/92/update.md | 30 +
docs/documentation/92/use.md | 32 +
docs/documentation/92/your-database.md | 20 +
docs/documentation/93/binary-data.md | 179 ++
docs/documentation/93/callproc.md | 116 +
docs/documentation/93/classpath.md | 26 +
docs/documentation/93/connect.md | 234 ++
docs/documentation/93/datasource.md | 44 +
docs/documentation/93/ddl.md | 24 +
docs/documentation/93/ds-cpds.md | 93 +
docs/documentation/93/ds-ds.md | 178 ++
docs/documentation/93/escaped-functions.md | 480 ++++
docs/documentation/93/escapes-datetime.md | 23 +
docs/documentation/93/escapes.md | 57 +
docs/documentation/93/ext.md | 36 +
docs/documentation/93/geometric.md | 68 +
docs/documentation/93/index.html | 253 ++
docs/documentation/93/intro.md | 22 +
docs/documentation/93/jndi.md | 68 +
docs/documentation/93/largeobjects.md | 20 +
docs/documentation/93/listennotify.md | 148 ++
docs/documentation/93/load.md | 47 +
docs/documentation/93/media/css/docs.css | 450 ++++
docs/documentation/93/media/css/docs.css~ | 450 ++++
docs/documentation/93/media/css/global.css | 98 +
docs/documentation/93/media/css/table.css | 101 +
docs/documentation/93/media/css/table.css~ | 101 +
docs/documentation/93/media/css/text.css | 162 ++
docs/documentation/93/media/favicon.ico | Bin 0 -> 2550 bytes
docs/documentation/93/media/img/docs/bg_hdr.png | Bin 0 -> 173 bytes
.../93/media/img/layout/hdr_left3a.png | Bin 0 -> 93930 bytes
.../93/media/img/layout/nav_tbl_btm.png | Bin 0 -> 218 bytes
.../93/media/img/layout/nav_tbl_top.png | Bin 0 -> 212 bytes
docs/documentation/93/outer-joins-escape.md | 17 +
docs/documentation/93/prepare.md | 25 +
docs/documentation/93/query.md | 113 +
docs/documentation/93/reading.md | 18 +
docs/documentation/93/resultset.md | 19 +
docs/documentation/93/server-prepare.md | 121 +
docs/documentation/93/setup.md | 44 +
docs/documentation/93/ssl-client.md | 70 +
docs/documentation/93/ssl-factory.md | 29 +
docs/documentation/93/ssl.md | 37 +
docs/documentation/93/statement.md | 25 +
docs/documentation/93/thread.md | 38 +
docs/documentation/93/tomcat.md | 121 +
docs/documentation/93/update.md | 30 +
docs/documentation/93/use.md | 32 +
docs/documentation/93/your-database.md | 20 +
docs/documentation/94/binary-data.md | 179 ++
docs/documentation/94/callproc.md | 116 +
docs/documentation/94/classpath.md | 26 +
docs/documentation/94/connect.md | 395 +++
docs/documentation/94/datasource.md | 44 +
docs/documentation/94/ddl.md | 24 +
docs/documentation/94/ds-cpds.md | 93 +
docs/documentation/94/ds-ds.md | 178 ++
docs/documentation/94/escaped-functions.md | 480 ++++
docs/documentation/94/escapes-datetime.md | 23 +
docs/documentation/94/escapes.md | 57 +
docs/documentation/94/ext.md | 36 +
docs/documentation/94/geometric.md | 68 +
docs/documentation/94/index.html | 253 ++
docs/documentation/94/intro.md | 22 +
docs/documentation/94/jndi.md | 68 +
docs/documentation/94/largeobjects.md | 20 +
docs/documentation/94/listennotify.md | 148 ++
docs/documentation/94/load.md | 47 +
docs/documentation/94/media/css/docs.css | 450 ++++
docs/documentation/94/media/css/docs.css~ | 450 ++++
docs/documentation/94/media/css/global.css | 98 +
docs/documentation/94/media/css/table.css | 101 +
docs/documentation/94/media/css/table.css~ | 101 +
docs/documentation/94/media/css/text.css | 162 ++
docs/documentation/94/media/favicon.ico | Bin 0 -> 2550 bytes
docs/documentation/94/media/img/docs/bg_hdr.png | Bin 0 -> 173 bytes
.../94/media/img/layout/hdr_left3a.png | Bin 0 -> 93930 bytes
.../94/media/img/layout/nav_tbl_btm.png | Bin 0 -> 218 bytes
.../94/media/img/layout/nav_tbl_top.png | Bin 0 -> 212 bytes
docs/documentation/94/outer-joins-escape.md | 17 +
docs/documentation/94/prepare.md | 25 +
docs/documentation/94/query.md | 113 +
docs/documentation/94/reading.md | 18 +
docs/documentation/94/resultset.md | 19 +
docs/documentation/94/server-prepare.md | 121 +
docs/documentation/94/setup.md | 44 +
docs/documentation/94/ssl-client.md | 70 +
docs/documentation/94/ssl-factory.md | 29 +
docs/documentation/94/ssl.md | 37 +
docs/documentation/94/statement.md | 25 +
docs/documentation/94/thread.md | 38 +
docs/documentation/94/tomcat.md | 121 +
docs/documentation/94/update.md | 30 +
docs/documentation/94/use.md | 32 +
docs/documentation/94/your-database.md | 20 +
docs/documentation/changelog.md | 2540 ++++++++++++++++++++
docs/documentation/documentation.md | 23 +
docs/documentation/faq.md | 154 ++
docs/documentation/head/arrays.md | 29 +
docs/documentation/head/binary-data.md | 190 ++
docs/documentation/head/callproc.md | 124 +
docs/documentation/head/classpath.md | 28 +
docs/documentation/head/connect.md | 459 ++++
docs/documentation/head/datasource.md | 44 +
docs/documentation/head/ddl.md | 26 +
docs/documentation/head/ds-cpds.md | 92 +
docs/documentation/head/ds-ds.md | 180 ++
docs/documentation/head/escaped-functions.md | 480 ++++
docs/documentation/head/escapes-datetime.md | 23 +
docs/documentation/head/escapes.md | 61 +
docs/documentation/head/ext.md | 40 +
docs/documentation/head/geometric.md | 64 +
docs/documentation/head/index.html | 258 ++
docs/documentation/head/intro.md | 29 +
docs/documentation/head/java8-date-time.md | 80 +
docs/documentation/head/jndi.md | 70 +
docs/documentation/head/largeobjects.md | 20 +
docs/documentation/head/listennotify.md | 142 ++
docs/documentation/head/load.md | 30 +
docs/documentation/head/logging.md | 140 ++
docs/documentation/head/media/css/docs.css | 450 ++++
docs/documentation/head/media/css/global.css | 98 +
docs/documentation/head/media/css/syntax.css | 80 +
docs/documentation/head/media/css/table.css | 101 +
docs/documentation/head/media/css/text.css | 162 ++
docs/documentation/head/media/favicon.ico | Bin 0 -> 2550 bytes
docs/documentation/head/media/img/docs/bg_hdr.png | Bin 0 -> 173 bytes
.../head/media/img/layout/hdr_left3a.png | Bin 0 -> 93930 bytes
.../head/media/img/layout/nav_tbl_btm.png | Bin 0 -> 218 bytes
.../head/media/img/layout/nav_tbl_top.png | Bin 0 -> 212 bytes
docs/documentation/head/outer-joins-escape.md | 19 +
docs/documentation/head/prepare.md | 25 +
docs/documentation/head/query.md | 123 +
docs/documentation/head/reading.md | 18 +
docs/documentation/head/replication.md | 363 +++
docs/documentation/head/resultset.md | 19 +
docs/documentation/head/server-prepare.md | 303 +++
docs/documentation/head/setup.md | 44 +
docs/documentation/head/ssl-client.md | 70 +
docs/documentation/head/ssl-factory.md | 29 +
docs/documentation/head/ssl.md | 35 +
docs/documentation/head/statement.md | 31 +
docs/documentation/head/thread.md | 20 +
docs/documentation/head/tomcat.md | 121 +
docs/documentation/head/update.md | 32 +
docs/documentation/head/use.md | 34 +
docs/documentation/head/your-database.md | 20 +
docs/documentation/pgjdbc_changelog-8.0-8.4.tar.gz | Bin 0 -> 104383 bytes
docs/download.md | 404 ++++
docs/index.html | 67 +
docs/media/css/base.css | 7 +
docs/media/css/docs.css | 448 ++++
docs/media/css/docs_large.css | 17 +
docs/media/css/global.css | 98 +
docs/media/css/iefixes.css | 138 ++
docs/media/css/layout.css | 688 ++++++
docs/media/css/navigation.css | 237 ++
docs/media/css/table.css | 101 +
docs/media/css/text.css | 162 ++
docs/media/favicon.ico | Bin 0 -> 2550 bytes
docs/media/img/add.jpg | Bin 0 -> 1142 bytes
docs/media/img/feature/feature_gears.png | Bin 0 -> 22633 bytes
docs/media/img/fix.jpg | Bin 0 -> 932 bytes
docs/media/img/group-logo.png | Bin 0 -> 9342 bytes
docs/media/img/hdr/hdr_latestreleases.png | Bin 0 -> 537 bytes
docs/media/img/hdr/hdr_shortcuts.png | Bin 0 -> 492 bytes
docs/media/img/hdr/hdr_supportus.png | Bin 0 -> 511 bytes
docs/media/img/layout/blt_blu_arrow.png | Bin 0 -> 207 bytes
docs/media/img/layout/blt_gry_arrow.png | Bin 0 -> 190 bytes
docs/media/img/layout/box_bottom.gif | Bin 0 -> 85 bytes
docs/media/img/layout/box_top.gif | Bin 0 -> 85 bytes
docs/media/img/layout/feature_bl.gif | Bin 0 -> 102 bytes
docs/media/img/layout/feature_br.gif | Bin 0 -> 361 bytes
docs/media/img/layout/feature_tl.gif | Bin 0 -> 103 bytes
docs/media/img/layout/feature_tr.gif | Bin 0 -> 106 bytes
docs/media/img/layout/hdr_fill.png | Bin 0 -> 335 bytes
docs/media/img/layout/hdr_left.png | Bin 0 -> 3040 bytes
docs/media/img/layout/hdr_left3.png | Bin 0 -> 7740 bytes
docs/media/img/layout/hdr_right.png | Bin 0 -> 1863 bytes
docs/media/img/layout/nav_fill.png | Bin 0 -> 142 bytes
docs/media/img/layout/nav_lft.png | Bin 0 -> 212 bytes
docs/media/img/layout/nav_rgt.png | Bin 0 -> 208 bytes
docs/media/img/layout/nav_tbl_btm.png | Bin 0 -> 218 bytes
docs/media/img/layout/nav_tbl_top.png | Bin 0 -> 212 bytes
docs/media/img/layout/usr_tbl_btm.png | Bin 0 -> 334 bytes
docs/media/img/layout/usr_tbl_top.png | Bin 0 -> 338 bytes
docs/media/img/project-logo.png | Bin 0 -> 11610 bytes
docs/media/img/remove.jpg | Bin 0 -> 1251 bytes
docs/media/img/rss.png | Bin 0 -> 360 bytes
docs/media/img/slonik_duke.png | Bin 0 -> 29827 bytes
docs/media/img/update.jpg | Bin 0 -> 990 bytes
docs/search/index.html | 33 +
packaging/rpm/.gitignore | 1 +
packaging/rpm/.srpmconfig | 4 +
packaging/rpm/.srpmgen | 10 -
packaging/rpm/fedora-image/Dockerfile | 18 +-
packaging/rpm/fedora-image/build_local | 43 -
packaging/rpm/fedora-image/copr-ci-git | 20 +-
packaging/rpm/fedora-image/srpmgen | 68 -
packaging/rpm/postgresql-jdbc.spec.tpl | 195 +-
packaging/rpm_ci | 10 +-
pgjdbc/pom.xml | 68 +-
pgjdbc/src/main/checkstyle/checks.xml | 27 +-
pgjdbc/src/main/checkstyle/suppressions.xml | 9 +
pgjdbc/src/main/java/org/postgresql/Driver.java | 224 +-
.../src/main/java/org/postgresql/PGConnection.java | 49 +-
.../src/main/java/org/postgresql/PGProperty.java | 104 +-
.../java/org/postgresql/PGRefCursorResultSet.java | 2 +
.../java/org/postgresql/PGResultSetMetaData.java | 2 +-
.../src/main/java/org/postgresql/PGStatement.java | 1 +
.../main/java/org/postgresql/copy/CopyDual.java | 16 +
.../main/java/org/postgresql/copy/CopyManager.java | 13 +-
.../src/main/java/org/postgresql/copy/CopyOut.java | 17 +
.../org/postgresql/copy/PGCopyInputStream.java | 5 +
.../java/org/postgresql/core/BaseConnection.java | 66 +-
.../postgresql/core/CachedQueryCreateAction.java | 4 +-
.../java/org/postgresql/core/CallableQueryKey.java | 9 +-
.../org/postgresql/core/ConnectionFactory.java | 15 +-
.../main/java/org/postgresql/core/Encoding.java | 97 +-
.../org/postgresql/core/EncodingPredictor.java | 2 +-
.../main/java/org/postgresql/core/JavaVersion.java | 46 +
.../src/main/java/org/postgresql/core/Keyword.java | 31 -
.../src/main/java/org/postgresql/core/Logger.java | 98 -
.../main/java/org/postgresql/core/NativeQuery.java | 6 +-
pgjdbc/src/main/java/org/postgresql/core/Oid.java | 58 +-
.../main/java/org/postgresql/core/PGStream.java | 88 +-
.../java/org/postgresql/core/ParameterList.java | 12 +
.../src/main/java/org/postgresql/core/Parser.java | 180 +-
.../java/org/postgresql/core/QueryExecutor.java | 21 +
.../org/postgresql/core/QueryExecutorBase.java | 41 +-
.../core/QueryWithReturningColumnsKey.java | 2 +-
.../org/postgresql/core/ReplicationProtocol.java | 33 +
.../java/org/postgresql/core/ServerVersion.java | 19 +-
.../main/java/org/postgresql/core/SqlCommand.java | 6 +
.../java/org/postgresql/core/UTF8Encoding.java | 23 +-
.../src/main/java/org/postgresql/core/Utils.java | 56 +-
.../core/VisibleBufferedInputStream.java | 2 +-
.../postgresql/core/v3/CompositeParameterList.java | 9 +-
.../org/postgresql/core/v3/CompositeQuery.java | 2 +-
.../postgresql/core/v3/ConnectionFactoryImpl.java | 350 +--
.../java/org/postgresql/core/v3/CopyDualImpl.java | 54 +
.../java/org/postgresql/core/v3/CopyInImpl.java | 8 +
.../org/postgresql/core/v3/CopyOperationImpl.java | 10 +-
.../java/org/postgresql/core/v3/CopyOutImpl.java | 9 +-
.../org/postgresql/core/v3/DescribeRequest.java | 2 +-
.../org/postgresql/core/v3/ExecuteRequest.java | 2 +-
.../org/postgresql/core/v3/QueryExecutorImpl.java | 689 +++---
.../postgresql/core/v3/SimpleParameterList.java | 26 +-
.../java/org/postgresql/core/v3/SimpleQuery.java | 80 +-
.../core/v3/replication/V3PGReplicationStream.java | 285 +++
.../core/v3/replication/V3ReplicationProtocol.java | 139 ++
.../postgresql/ds/PGConnectionPoolDataSource.java | 8 +-
.../java/org/postgresql/ds/PGPooledConnection.java | 16 +-
.../org/postgresql/ds/PGPoolingDataSource.java | 11 +-
.../java/org/postgresql/ds/PGSimpleDataSource.java | 7 +-
.../org/postgresql/ds/common/BaseDataSource.java | 209 +-
.../java/org/postgresql/fastpath/Fastpath.java | 11 +-
.../java/org/postgresql/fastpath/FastpathArg.java | 4 +-
.../main/java/org/postgresql/geometric/PGbox.java | 2 +-
.../main/java/org/postgresql/geometric/PGlseg.java | 2 +-
.../main/java/org/postgresql/geometric/PGpath.java | 2 +-
.../java/org/postgresql/geometric/PGpolygon.java | 2 +-
.../main/java/org/postgresql/gss/GssAction.java | 69 +-
.../src/main/java/org/postgresql/gss/MakeGSS.java | 17 +-
.../org/postgresql/hostchooser/CandidateHost.java | 22 +
.../hostchooser/GlobalHostStatusTracker.java | 44 +-
.../org/postgresql/hostchooser/HostChooser.java | 7 +-
.../postgresql/hostchooser/HostChooserFactory.java | 2 +-
.../postgresql/hostchooser/HostRequirement.java | 25 +-
.../org/postgresql/hostchooser/HostStatus.java | 2 +-
.../postgresql/hostchooser/MultiHostChooser.java | 159 +-
.../postgresql/hostchooser/SingleHostChooser.java | 13 +-
.../java/org/postgresql/jdbc/AbstractBlobClob.java | 6 +-
.../java/org/postgresql/jdbc/BooleanTypeUtil.java | 103 +
.../java/org/postgresql/jdbc/EscapedFunctions.java | 140 +-
.../org/postgresql/jdbc/PSQLWarningWrapper.java | 35 +
.../src/main/java/org/postgresql/jdbc/PgArray.java | 65 +-
.../org/postgresql/jdbc/PgCallableStatement.java | 18 +-
.../java/org/postgresql/jdbc/PgConnection.java | 416 ++--
.../org/postgresql/jdbc/PgDatabaseMetaData.java | 1791 +++++---------
.../org/postgresql/jdbc/PgParameterMetaData.java | 4 +-
.../org/postgresql/jdbc/PgPreparedStatement.java | 337 +--
.../main/java/org/postgresql/jdbc/PgResultSet.java | 479 ++--
.../org/postgresql/jdbc/PgResultSetMetaData.java | 14 +-
.../main/java/org/postgresql/jdbc/PgStatement.java | 340 +--
.../java/org/postgresql/jdbc/PreferQueryMode.java | 2 +-
.../org/postgresql/jdbc/PrimitiveArraySupport.java | 488 ++++
.../java/org/postgresql/jdbc/TimestampUtils.java | 211 +-
.../java/org/postgresql/jdbc/TypeInfoCache.java | 92 +-
.../postgresql/jdbc2/optional/ConnectionPool.java | 4 +
.../jdbc2/optional/PoolingDataSource.java | 4 +
.../jdbc2/optional/SimpleDataSource.java | 4 +
.../org/postgresql/jdbc3/Jdbc3ConnectionPool.java | 4 +
.../postgresql/jdbc3/Jdbc3PoolingDataSource.java | 4 +
.../postgresql/jdbc3/Jdbc3SimpleDataSource.java | 4 +
.../postgresql/jre8/sasl/ScramAuthenticator.java | 166 ++
.../postgresql/largeobject/BlobInputStream.java | 17 +-
.../postgresql/largeobject/BlobOutputStream.java | 2 +-
.../org/postgresql/largeobject/LargeObject.java | 37 +-
.../postgresql/largeobject/LargeObjectManager.java | 8 +-
.../org/postgresql/osgi/PGBundleActivator.java | 4 +-
.../org/postgresql/osgi/PGDataSourceFactory.java | 2 +-
.../postgresql/replication/LogSequenceNumber.java | 108 +
.../replication/PGReplicationConnection.java | 44 +
.../replication/PGReplicationConnectionImpl.java | 47 +
.../replication/PGReplicationStream.java | 130 +
.../postgresql/replication/ReplicationType.java | 11 +
.../fluent/AbstractCreateSlotBuilder.java | 20 +
.../replication/fluent/AbstractStreamBuilder.java | 38 +
.../fluent/ChainedCommonCreateSlotBuilder.java | 30 +
.../fluent/ChainedCommonStreamBuilder.java | 47 +
.../ChainedCreateReplicationSlotBuilder.java | 81 +
.../replication/fluent/ChainedStreamBuilder.java | 75 +
.../replication/fluent/CommonOptions.java | 37 +
.../fluent/ReplicationCreateSlotBuilder.java | 30 +
.../fluent/ReplicationStreamBuilder.java | 53 +
.../logical/ChainedLogicalCreateSlotBuilder.java | 27 +
.../logical/ChainedLogicalStreamBuilder.java | 56 +
.../fluent/logical/LogicalCreateSlotBuilder.java | 53 +
.../fluent/logical/LogicalReplicationOptions.java | 27 +
.../fluent/logical/LogicalStreamBuilder.java | 92 +
.../logical/StartLogicalReplicationCallback.java | 14 +
.../physical/ChainedPhysicalCreateSlotBuilder.java | 15 +
.../physical/ChainedPhysicalStreamBuilder.java | 23 +
.../fluent/physical/PhysicalCreateSlotBuilder.java | 41 +
.../physical/PhysicalReplicationOptions.java | 11 +
.../fluent/physical/PhysicalStreamBuilder.java | 51 +
.../physical/StartPhysicalReplicationCallback.java | 14 +
.../postgresql/ssl/DbKeyStoreSocketFactory.java | 6 +-
.../src/main/java/org/postgresql/ssl/MakeSSL.java | 11 +-
.../org/postgresql/ssl/jdbc4/LibPQFactory.java | 74 +-
.../src/main/java/org/postgresql/sspi/NTDSAPI.java | 2 +-
.../main/java/org/postgresql/sspi/SSPIClient.java | 36 +-
.../src/main/java/org/postgresql/translation/bg.po | 2106 ++++++++--------
.../src/main/java/org/postgresql/translation/cs.po | 2078 ++++++++--------
.../src/main/java/org/postgresql/translation/de.po | 2125 ++++++++--------
.../src/main/java/org/postgresql/translation/es.po | 1851 +++++++-------
.../src/main/java/org/postgresql/translation/fr.po | 2076 ++++++++--------
.../src/main/java/org/postgresql/translation/it.po | 2091 ++++++++--------
.../src/main/java/org/postgresql/translation/ja.po | 2105 ++++++++--------
.../java/org/postgresql/translation/messages.pot | 1735 ++++++-------
.../src/main/java/org/postgresql/translation/nl.po | 1984 +++++++--------
.../src/main/java/org/postgresql/translation/pl.po | 2062 ++++++++--------
.../main/java/org/postgresql/translation/pt_BR.po | 2086 ++++++++--------
.../src/main/java/org/postgresql/translation/ru.po | 2158 +++++++++--------
.../src/main/java/org/postgresql/translation/sr.po | 2046 ++++++++--------
.../src/main/java/org/postgresql/translation/tr.po | 2085 ++++++++--------
.../main/java/org/postgresql/translation/zh_CN.po | 1977 ++++++++-------
.../main/java/org/postgresql/translation/zh_TW.po | 1977 ++++++++-------
.../src/main/java/org/postgresql/util/Base64.java | 26 +-
.../java/org/postgresql/util/ByteConverter.java | 27 +
.../main/java/org/postgresql/util/DriverInfo.java | 33 +
.../org/postgresql/util/ExpressionProperties.java | 95 +
pgjdbc/src/main/java/org/postgresql/util/GT.java | 11 +-
.../main/java/org/postgresql/util/HostSpec.java | 54 +
.../main/java/org/postgresql/util/LruCache.java | 4 +-
.../main/java/org/postgresql/util/MD5Digest.java | 4 +-
.../main/java/org/postgresql/util/PGInterval.java | 2 +-
.../main/java/org/postgresql/util/PGJDBCMain.java | 20 +-
.../src/main/java/org/postgresql/util/PGmoney.java | 1 -
.../org/postgresql/util/PSQLDriverVersion.java | 25 -
.../main/java/org/postgresql/util/PSQLState.java | 136 +-
.../main/java/org/postgresql/util/PSQLWarning.java | 9 +-
.../org/postgresql/util/ReaderInputStream.java | 162 ++
.../org/postgresql/util/ServerErrorMessage.java | 17 +-
.../main/java/org/postgresql/util/SharedTimer.java | 20 +-
.../main/java/org/postgresql/util/UnixCrypt.java | 590 -----
.../java/org/postgresql/util/WriterHandler.java | 125 +
.../java/org/postgresql/xa/PGXAConnection.java | 251 +-
.../java/org/postgresql/xa/PGXADataSource.java | 9 +-
.../org/postgresql/translation/messages_bg.class | Bin 41250 -> 39612 bytes
.../org/postgresql/translation/messages_cs.class | Bin 14019 -> 13037 bytes
.../org/postgresql/translation/messages_de.class | Bin 27324 -> 24078 bytes
.../org/postgresql/translation/messages_es.class | Bin 4225 -> 3759 bytes
.../org/postgresql/translation/messages_fr.class | Bin 27117 -> 24001 bytes
.../org/postgresql/translation/messages_it.class | Bin 26160 -> 22890 bytes
.../org/postgresql/translation/messages_ja.class | Bin 39729 -> 38424 bytes
.../org/postgresql/translation/messages_nl.class | Bin 2635 -> 2329 bytes
.../org/postgresql/translation/messages_pl.class | Bin 12139 -> 11459 bytes
.../postgresql/translation/messages_pt_BR.class | Bin 28937 -> 27652 bytes
.../org/postgresql/translation/messages_ru.class | Bin 18193 -> 19976 bytes
.../org/postgresql/translation/messages_sr.class | Bin 28131 -> 26960 bytes
.../org/postgresql/translation/messages_tr.class | Bin 28091 -> 26974 bytes
.../postgresql/translation/messages_zh_CN.class | Bin 18511 -> 17377 bytes
.../postgresql/translation/messages_zh_TW.class | Bin 18512 -> 17372 bytes
.../java/org/postgresql/core/OidToStringTest.java | 37 +
.../java/org/postgresql/core/OidValueOfTest.java | 38 +
.../test/java/org/postgresql/core/ParserTest.java | 166 +-
.../org/postgresql/core/ReturningParserTest.java | 69 +
.../postgresql/core/v3/V3ParameterListTests.java | 45 +-
.../jdbc/DeepBatchedInsertStatementTest.java | 20 +-
.../postgresql/jdbc/PrimitiveArraySupportTest.java | 253 ++
.../replication/LogSequenceNumberTest.java | 100 +
.../replication/LogicalReplicationStatusTest.java | 535 +++++
.../replication/LogicalReplicationTest.java | 957 ++++++++
.../replication/PhysicalReplicationTest.java | 304 +++
.../replication/ReplicationConnectionTest.java | 121 +
.../replication/ReplicationSlotTest.java | 223 ++
.../replication/ReplicationTestSuite.java | 80 +
.../org/postgresql/test/CursorFetchBinaryTest.java | 21 -
pgjdbc/src/test/java/org/postgresql/test/README.md | 51 +-
.../test/java/org/postgresql/test/TestUtil.java | 184 +-
.../org/postgresql/test/core/JavaVersionTest.java | 24 +
.../test/extensions/ExtensionsTestSuite.java | 50 +-
.../org/postgresql/test/extensions/HStoreTest.java | 31 +-
.../test/hostchooser/MultiHostTestSuite.java | 44 +-
.../test/hostchooser/MultiHostsConnectionTest.java | 179 +-
.../java/org/postgresql/test/jdbc2/ANTTest.java | 15 +-
.../java/org/postgresql/test/jdbc2/ArrayTest.java | 161 +-
.../test/jdbc2/AutoRollbackTestSuite.java | 90 +-
.../java/org/postgresql/test/jdbc2/BaseTest.java | 57 -
.../java/org/postgresql/test/jdbc2/BaseTest4.java | 54 +
.../postgresql/test/jdbc2/BatchExecuteTest.java | 100 +
.../jdbc2/BatchedInsertReWriteEnabledTest.java | 10 +-
.../java/org/postgresql/test/jdbc2/BlobTest.java | 74 +-
.../postgresql/test/jdbc2/BlobTransactionTest.java | 21 +-
.../postgresql/test/jdbc2/CallableStmtTest.java | 60 +-
.../postgresql/test/jdbc2/ClientEncodingTest.java | 85 +
.../test/jdbc2/ColumnSanitiserDisabledTest.java | 30 +-
.../test/jdbc2/ColumnSanitiserEnabledTest.java | 27 +-
.../test/jdbc2/ConcurrentStatementFetch.java | 81 +
.../postgresql/test/jdbc2/ConnectTimeoutTest.java | 15 +-
.../org/postgresql/test/jdbc2/ConnectionTest.java | 42 +-
.../test/jdbc2/CopyBothResponseTest.java | 208 ++
.../postgresql/test/jdbc2/CopyLargeFileTest.java | 21 +-
.../java/org/postgresql/test/jdbc2/CopyTest.java | 88 +-
.../org/postgresql/test/jdbc2/CursorFetchTest.java | 56 +-
.../test/jdbc2/DatabaseEncodingTest.java | 30 +-
.../test/jdbc2/DatabaseMetaDataPropertiesTest.java | 100 +-
.../test/jdbc2/DatabaseMetaDataTest.java | 625 +++--
.../org/postgresql/test/jdbc2/DateStyleTest.java | 62 +
.../java/org/postgresql/test/jdbc2/DateTest.java | 23 +-
.../java/org/postgresql/test/jdbc2/DriverTest.java | 123 +-
.../org/postgresql/test/jdbc2/EncodingTest.java | 19 +-
.../org/postgresql/test/jdbc2/GeometricTest.java | 33 +-
.../java/org/postgresql/test/jdbc2/GetXXXTest.java | 31 +-
.../org/postgresql/test/jdbc2/IntervalTest.java | 67 +-
.../org/postgresql/test/jdbc2/JBuilderTest.java | 19 +-
.../org/postgresql/test/jdbc2/Jdbc2TestSuite.java | 233 +-
.../postgresql/test/jdbc2/LoginTimeoutTest.java | 19 +-
.../java/org/postgresql/test/jdbc2/MiscTest.java | 18 +-
.../java/org/postgresql/test/jdbc2/NotifyTest.java | 207 +-
.../java/org/postgresql/test/jdbc2/OID74Test.java | 78 -
.../org/postgresql/test/jdbc2/PGPropertyTest.java | 133 +-
.../java/org/postgresql/test/jdbc2/PGTimeTest.java | 7 +-
.../org/postgresql/test/jdbc2/PGTimestampTest.java | 37 +-
.../test/jdbc2/PreparedStatementTest.java | 643 ++++-
.../org/postgresql/test/jdbc2/QuotationTest.java | 4 +-
.../org/postgresql/test/jdbc2/RefCursorTest.java | 17 +-
.../test/jdbc2/ResultSetMetaDataTest.java | 58 +-
.../org/postgresql/test/jdbc2/ResultSetTest.java | 205 +-
.../test/jdbc2/SearchPathLookupTest.java | 24 +-
.../org/postgresql/test/jdbc2/ServerErrorTest.java | 32 +-
.../org/postgresql/test/jdbc2/StatementTest.java | 434 +++-
.../test/jdbc2/StringTypeUnspecifiedArrayTest.java | 48 +
.../java/org/postgresql/test/jdbc2/TestACL.java | 17 +-
.../java/org/postgresql/test/jdbc2/TimeTest.java | 41 +-
.../org/postgresql/test/jdbc2/TimestampTest.java | 230 +-
.../org/postgresql/test/jdbc2/TimezoneTest.java | 145 +-
.../test/jdbc2/TypeCacheDLLStressTest.java | 2 +-
.../test/jdbc2/UpdateableResultTest.java | 60 +-
.../postgresql/test/jdbc2/UpsertBinaryTest.java | 22 -
.../java/org/postgresql/test/jdbc2/UpsertTest.java | 137 +-
.../test/jdbc2/optional/BaseDataSourceTest.java | 74 +-
.../optional/CaseOptimiserDataSourceTest.java | 36 +-
.../test/jdbc2/optional/ConnectionPoolTest.java | 141 +-
.../test/jdbc2/optional/OptionalTestSuite.java | 26 +-
.../test/jdbc2/optional/PoolingDataSourceTest.java | 32 +-
.../test/jdbc2/optional/SimpleDataSourceTest.java | 7 +-
.../optional/SimpleDataSourceWithSetURLTest.java | 62 +
.../optional/SimpleDataSourceWithUrlTest.java | 8 +-
.../test/jdbc3/CompositeQueryParseTest.java | 52 +-
.../org/postgresql/test/jdbc3/CompositeTest.java | 28 +-
.../test/jdbc3/DatabaseMetaDataTest.java | 40 +-
.../postgresql/test/jdbc3/GeneratedKeysTest.java | 79 +-
.../org/postgresql/test/jdbc3/Jdbc3BlobTest.java | 54 +-
.../test/jdbc3/Jdbc3CallableStatementTest.java | 105 +-
.../postgresql/test/jdbc3/Jdbc3SavepointTest.java | 30 +-
.../org/postgresql/test/jdbc3/Jdbc3TestSuite.java | 52 +-
.../test/jdbc3/ParameterMetaDataTest.java | 16 -
.../org/postgresql/test/jdbc3/ResultSetTest.java | 20 +-
.../test/jdbc3/SendRecvBufferSizeTest.java | 17 +-
.../postgresql/test/jdbc3/SqlCommandParseTest.java | 54 +
.../test/jdbc3/StringTypeParameterTest.java | 164 +-
.../java/org/postgresql/test/jdbc4/ArrayTest.java | 112 +-
.../java/org/postgresql/test/jdbc4/BlobTest.java | 30 +-
.../postgresql/test/jdbc4/CharacterStreamTest.java | 246 ++
.../org/postgresql/test/jdbc4/ClientInfoTest.java | 69 +-
.../test/jdbc4/DatabaseMetaDataTest.java | 183 +-
.../org/postgresql/test/jdbc4/IsValidTest.java | 65 +-
.../org/postgresql/test/jdbc4/Jdbc4TestSuite.java | 77 +-
.../java/org/postgresql/test/jdbc4/JsonbTest.java | 6 +-
.../test/jdbc4/LibPQFactoryHostNameTest.java | 57 +
.../java/org/postgresql/test/jdbc4/LogTest.java | 78 +
.../test/jdbc4/PGCopyInputStreamTest.java | 22 +-
.../java/org/postgresql/test/jdbc4/UUIDTest.java | 55 +-
.../org/postgresql/test/jdbc4/WrapperTest.java | 36 +-
.../java/org/postgresql/test/jdbc4/XmlTest.java | 151 +-
.../postgresql/test/jdbc4/jdbc41/AbortTest.java | 36 +-
.../test/jdbc4/jdbc41/CloseOnCompletionTest.java | 24 +-
.../test/jdbc4/jdbc41/GetObjectTest.java | 173 +-
.../test/jdbc4/jdbc41/Jdbc41TestSuite.java | 29 +-
.../test/jdbc4/jdbc41/NetworkTimeoutTest.java | 77 +
.../postgresql/test/jdbc4/jdbc41/SchemaTest.java | 29 +-
.../jdbc41}/SharedTimerClassLoaderLeakTest.java | 6 +-
.../test/jdbc42/GetObject310BinaryTest.java | 21 -
.../test/jdbc42/GetObject310InfinityTests.java | 98 +
.../postgresql/test/jdbc42/GetObject310Test.java | 107 +-
.../test/jdbc42/Jdbc42CallableStatementTest.java | 94 +
.../postgresql/test/jdbc42/Jdbc42TestSuite.java | 3 +-
.../test/jdbc42/PreparedStatementTest.java | 49 +-
.../postgresql/test/jdbc42/SetObject310Test.java | 120 +-
.../postgresql/test/jdbc42/SimpleJdbc42Test.java | 22 +-
.../postgresql/test/jre8/core/Jre8TestSuite.java | 18 +
.../postgresql/test/jre8/core/SocksProxyTest.java | 48 +
.../ssl/SingleCertValidatingFactoryTestSuite.java | 19 +-
.../test/java/org/postgresql/test/ssl/SslTest.java | 162 +-
.../java/org/postgresql/test/ssl/SslTestSuite.java | 3 -
.../org/postgresql/test/sspi/SSPITestSuite.java | 7 +-
.../org/postgresql/test/util/BufferGenerator.java | 2 +-
.../test/util/ExpressionPropertiesTest.java | 63 +
.../org/postgresql/test/util/HostSpecTest.java | 86 +
.../org/postgresql/test/util/LruCacheTest.java | 19 +-
.../test/util/ServerVersionParseTest.java | 5 +
.../postgresql/test/util/ServerVersionTest.java | 1 +
.../test/util/rules/ServerVersionRule.java | 103 +
.../rules/annotation/HaveMinimalServerVersion.java | 26 +
.../org/postgresql/test/xa/XADataSourceTest.java | 404 +++-
.../java/org/postgresql/test/xa/XATestSuite.java | 37 +-
.../java/org/postgresql/util/NullOutputStream.java | 29 +
.../java/org/postgresql/util/PSQLWarningTest.java | 37 +
.../org/postgresql/util/ReaderInputStreamTest.java | 227 ++
pom.xml | 6 +-
release_notes.sh | 50 +-
release_notes_filter.pl | 106 +-
release_stage.sh | 69 +
settings.xml | 6 +-
ssltest.properties | 28 +-
ubenchmark/pom.xml | 14 +-
.../benchmark/encoding/UTF8Decoding.java | 107 +
.../postgresql/benchmark/statement/BindArray.java | 97 +
.../benchmark/statement/ProcessBoolean.java | 97 +
.../benchmark/statement/ProcessResultSet.java | 7 +
645 files changed, 61090 insertions(+), 22960 deletions(-)
diff --git a/.gitignore b/.gitignore
index acfd0ac..ec662f4 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,6 +1,7 @@
.classpath
.settings
.project
+.checkstyle
.DS_Store
.externalToolBuilders
build
diff --git a/.travis.yml b/.travis.yml
index ae2f115..561abca 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,34 +1,68 @@
sudo: false
language: java
+dist: trusty
+
+branches:
+ except:
+ - /^tmp\/.*/
+ - /^REL.*/
+
+stages:
+ - name: test
+ if: not branch =~ ^release\/.*$
+ - name: release
+ # releases pgjdbc for Java 8
+ # It does set release tag and update pom.xml versions
+ if: branch =~ ^release\/.*$
+ - name: release_prev
+ # releases pgjdbc for Java 6, Java 7
+ # pgjdbc-jreX requires release pom.xml versions of the main project, so pgjdbc-jreX should be
+ # released after the release of the main version, thus second stage
+ if: branch =~ ^release\/.*$
before_script:
+ - test $(grep "after_n_builds" codecov.yml | tr -d '[:space:]' | cut -d":" -f2) -eq $(grep -e "COVERAGE=Y$" .travis.yml | wc -l) || exit 1
- export PG_DATADIR="/etc/postgresql/${PG_VERSION}/main"
+ - export PG_SLAVE1_DATADIR="/etc/postgresql/${PG_VERSION}/slave1"
+ - export PG_SLAVE2_DATADIR="/etc/postgresql/${PG_VERSION}/slave2"
- ./.travis/travis_install_postgres.sh
- test "x$XA" == 'x' || ./.travis/travis_configure_xa.sh
+ - test "x$REPLICATION" == 'x' || ./.travis/travis_configure_replication.sh
+ - test "x$SSLTEST" == 'x' || ./.travis/travis_configure_ssl.sh
- ./.travis/travis_start_postgres.sh
- - psql -U postgres -c "create user test with password 'test';"
+ - test "x$PG_VERSION" != 'xHEAD' || psql -U postgres -c "set password_encryption='scram-sha-256'; create user test with password 'test';"
+ - test "x$PG_VERSION" = 'xHEAD' || psql -U postgres -c "create user test with password 'test';"
+ - test "x$REPLICATION" == 'x' || psql -U postgres -c "alter user test with replication;"
- psql -c 'create database test owner test;' -U postgres
- - echo "MAVEN_OPTS='-Xmx1g -Dgpg.skip=true'" > ~/.mavenrc
- - test "x$PG_VERSION" == 'x' || test $PG_VERSION == '8.4' || test $PG_VERSION == '9.0' || psql test -c 'CREATE EXTENSION hstore;' -U postgres
- - test "x$PG_VERSION" == 'x' || test $PG_VERSION != '8.4' || createlang -U postgres plpgsql test
- - if [[ "x$JDK" == *'x9'* ]]; then remove_dir_from_path $JAVA_HOME/bin; export JAVA_HOME=/usr/lib/jvm/java-9-oracle; export PATH=$JAVA_HOME/bin:$PATH; java -Xmx32m -version; fi
+ - test "x$SSLTEST" == 'x' || ./.travis/travis_ssl_users.sh
+ - test "x$REPLICATION" == 'x' || ./.travis/travis_create_slaves.sh
+ - if [[ $TRAVIS_BRANCH == release/* ]]; then echo "MAVEN_OPTS='-Xmx1g'" > ~/.mavenrc; else echo "MAVEN_OPTS='-Xmx1g -Dgpg.skip=true'" > ~/.mavenrc; fi
+ - test "x$PG_VERSION" == 'x' || test "x$NO_HSTORE" == 'xY' || psql test -c 'CREATE EXTENSION hstore;' -U postgres
+ - test "x$PG_VERSION" == 'x' || test "x$CREATE_PLPGSQL" == 'x' || createlang -U postgres plpgsql test
env:
global:
- - secure: "3HRd+UJQzXoxmBAiJ8SLFuYK8NvMVgIs0erfcPdgvtfFGTPkH3XMONfNr2VE2uz6qwUB5GWkVzvS4c9CPbnnft9QhyYeeUINiqQMN5+6AN5re3C2D7VQMm3NSB+T2R6zS/18UZW5tIoTJILgl5oRCQFI7RSpqhvZ8nqPxJ4gptI="
- - secure: "VrNgbyKQi5HjSMZfkt/zwG+AHk1NW1b+f3Jo1ZH7DCqcgLApwvp4MNsw+XamqHxudjj3Z8+4bYBxG2H6zIOobIyYhBvxUwMq7HTjM4jH8m5phqvQIWZOzZzqguYNNS7JJQUpIMwR7wTuHqucVfMxljoSuXQbs+0BUxo4Eh+FScQ="
- secure: "NI+aqwRLLVt2feJdk/2ZEZnsaPyu+vOx8MahVxjz0UUVvRHVqxM5O1M0R53NJfEeIjflOzgZJwRLqgyl6dkdfjytRhaHWGptQdehV4cwNb+4epnn8WlpRzMac65zTQqnbGVtw9jissDQv6/Zl/+D+DMcU65BbFZkix40whILXG0="
+before_install:
+ - ./.travis/travis_install_zulu.sh
+ - test -z "${ZULU_JDK}" || export JDK${ZULU_JDK}_HOME=/usr/lib/jvm/zulu-${ZULU_JDK}-amd64
+ - ./.travis/travis_install_openj9.sh
+ - test -z "${OPENJ9}" || export JDK${JDK}_HOME=${HOME}/jdk-9+${OPENJ9}
+
script:
# make sure previous build artifacts are not used for subsequent builds
- rm -rf $HOME/.m2/repository/org/postgresql || true
- - export JDK6_HOME=$(jdk_switcher home openjdk6)
- - export JDK7_HOME=$(jdk_switcher home openjdk7)
- - export JDK8_HOME=$(jdk_switcher home oraclejdk8)
- - export JDK9_HOME=/usr/lib/jvm/java-9-oracle
- - test -d "${JDK9_HOME}" || export JDK9_HOME=$(jdk_switcher home oraclejdk8)
+ - test -d "${JDK6_HOME}" || export JDK6_HOME=$(jdk_switcher home openjdk6)
+ - test -d "${JDK7_HOME}" || export JDK7_HOME=$(jdk_switcher home openjdk7)
+ - test -d "${JDK8_HOME}" || export JDK8_HOME=$(jdk_switcher home oraclejdk8)
+ - test -d "${JDK9_HOME}" || export JDK9_HOME=$(jdk_switcher home oraclejdk9)
+ - test -d "${JDK9_HOME}" || export JDK9_HOME=$(jdk_switcher home oraclejdk8) # JDK9 missing on precise, fallback to JDK8
- envsubst < toolchains.xml > ~/.m2/toolchains.xml
- - ./.travis/travis_build.sh
+ - test ${JDK} -eq 9 || jdk_switcher use oraclejdk8 # Run Maven with Java 8, build with Toolchains.
+ - test -z "${ZULU_JDK}" || export TRAVIS_JDK_VERSION=zulujdk${ZULU_JDK} # trick codecov to use correct jdk version
+ - if [[ $TRAVIS_BRANCH == release/* ]]; then .travis/travis_release.sh; else ./.travis/travis_build.sh; fi
+ - ./.travis/travis_check_postgres_health.sh
# To avoid useless S3 cache updates (https://github.com/travis-ci/travis-ci/issues/1441#issuecomment-67607074)
#- mkdir /tmp/cache-trick
#- mv $HOME/.m2/repository/org/postgresql /tmp/cache-trick/
@@ -52,119 +86,158 @@ cache:
matrix:
fast_finish: true
include:
+ - stage: test
+ jdk: oraclejdk8
+ env: RUN_CHECKSTYLE=true
+ script: mvn checkstyle:check
- env:
- FEDORA_CI=Y
services:
- docker
+ if: type != pull_request
+ - jdk: oraclejdk9
+ addons:
+ postgresql: "9.6"
+ env:
+ - PG_VERSION=9.6
+ - JDK=9
+ - jdk: oraclejdk9
+ sudo: required
+ env:
+ - PG_VERSION=10
+ - JDK=9
+ - OPENJ9=181
+ - TZ=America/New_York # flips between −05:00 and −04:00
- jdk: oraclejdk8
sudo: required
- dist: trusty
env:
- - PG_VERSION=9.6
+ - PG_VERSION=HEAD
- XA=true
+ - REPLICATION=Y
- COVERAGE=Y
+ - TEST_CLIENTS=Y
+ - TZ=Pacific/Chatham # flips between +12:45 and +13:45
- jdk: oraclejdk8
sudo: required
- dist: trusty
addons:
- postgresql: "9.5"
+ postgresql: "9.6"
env:
- - PG_VERSION=9.5
+ - PG_VERSION=9.6
+ - ZULU_JDK=8
- XA=true
+ - REPLICATION=Y
- COVERAGE=Y
+ - MCENTRAL=Y
+ - JDOC=Y
- jdk: oraclejdk8
sudo: required
- dist: trusty
+ addons:
+ postgresql: "9.5"
env:
- - PG_VERSION=8.4
+ - PG_VERSION=9.5
- XA=true
- - COVERAGE=Y
- - jdk: oraclejdk8
- env: RUN_CHECKSTYLE=true
- script: mvn checkstyle:check
+ - REPLICATION=Y
- jdk: oraclejdk8
addons:
postgresql: "9.4"
- apt:
- packages:
- - oracle-java8-installer
env:
- PG_VERSION=9.4
- - COVERAGE=Y
- - MCENTRAL=Y
- - JDOC=Y
+ - QUERY_MODE=extendedCacheEverything
+ - COVERAGE=N
+ - TZ=Europe/Moscow # +03:00, no DST
- jdk: oraclejdk8
sudo: required
- dist: trusty
+ addons:
+ postgresql: "9.6"
env:
- - PG_VERSION=HEAD
- - XA=true
+ - PG_VERSION=9.6
+ - SSLTEST=Y
+ - COVERAGE=Y
- jdk: openjdk7
+ sudo: required
addons:
- postgresql: "9.4"
+ postgresql: "9.2"
env:
- - PG_VERSION=9.4
+ - PG_VERSION=9.2
+ - ZULU_JDK=7
- MCENTRAL=Y
+ - COVERAGE=Y
+ - TZ=UTC
- jdk: openjdk6
+ sudo: required
addons:
- postgresql: "9.4"
+ postgresql: "9.1"
env:
- - PG_VERSION=9.4
+ - PG_VERSION=9.1
+ - ZULU_JDK=6
- MCENTRAL=Y
- jdk: oraclejdk8
- addons:
- postgresql: "9.4"
+ sudo: required
env:
- - PG_VERSION=9.4
- - TEST_CLIENTS=Y
- - jdk: oraclejdk8 # this will be overwritten by before_install above
- addons:
- postgresql: "9.4"
- apt:
- packages:
- - oracle-java9-installer
+ - PG_VERSION=8.4
+ - XA=true
+ - COVERAGE=Y
+ - NO_HSTORE=Y
+ - CREATE_PLPGSQL=Y
+ - jdk: oraclejdk8
+ sudo: required
+ dist: precise
env:
- - PG_VERSION=9.4
- - JDK=9
+ - PG_VERSION=8.3
+ - XA=true
+ - COVERAGE=Y
+ - NO_HSTORE=Y
+ - CREATE_PLPGSQL=Y
+ - jdk: oraclejdk8
+ sudo: required
+ dist: precise
+ env:
+ - PG_VERSION=8.2
+ - XA=true
+ - COVERAGE=Y
+ - NO_HSTORE=Y
+ - CREATE_PLPGSQL=Y
- jdk: oraclejdk8
addons:
- postgresql: "9.4"
+ postgresql: "9.6"
env:
- - PG_VERSION=9.4
+ - PG_VERSION=9.6
- QUERY_MODE=simple
- COVERAGE=Y
- - ANORM_SBT=Y
+ - TEST_CLIENTS=Y
- jdk: oraclejdk8
addons:
- postgresql: "9.4"
+ postgresql: "9.3"
env:
- - PG_VERSION=9.4
+ - PG_VERSION=9.3
- QUERY_MODE=extendedForPrepared
+ - COVERAGE=Y
- jdk: oraclejdk8
addons:
postgresql: "9.4"
env:
- PG_VERSION=9.4
- NO_WAFFLE_NO_OSGI=Y
- - JDOC=Y
- - jdk: openjdk7
- addons:
- postgresql: "9.3"
+ - stage: release
+ jdk: oraclejdk8
env:
- - PG_VERSION=9.3
- - COVERAGE=Y
- - jdk: openjdk6
+ - PG_VERSION=9.6
+ - stage: release_prev
+ jdk: openjdk7
+ sudo: required
addons:
postgresql: "9.2"
env:
- PG_VERSION=9.2
- - COVERAGE=Y
- - jdk: oraclejdk8
+ - ZULU_JDK=7
+ - stage: release_prev
+ jdk: openjdk6
+ sudo: required
addons:
postgresql: "9.1"
env:
- PG_VERSION=9.1
- - COVERAGE=Y
+ - ZULU_JDK=6
# Deploy snapshots to Maven Central
after_success:
diff --git a/.travis/secrets.tar.enc b/.travis/secrets.tar.enc
new file mode 100644
index 0000000..762d508
Binary files /dev/null and b/.travis/secrets.tar.enc differ
diff --git a/.travis/travis_build.sh b/.travis/travis_build.sh
index e003008..0ccc687 100755
--- a/.travis/travis_build.sh
+++ b/.travis/travis_build.sh
@@ -3,8 +3,11 @@ set -x -e
if [[ "${FEDORA_CI}" == *"Y" ]];
then
- PARENT_VERSION=$(mvn -B -N org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate -Dexpression=project.parent.version | grep -v '\[')
- sed -i "s/^%global parent_ver .*/%global parent_ver ${PARENT_VERSION}/" packaging/rpm/postgresql-jdbc.spec.tpl
+ # Try to prevent "stdout: write error"
+ # WA is taken from https://github.com/travis-ci/travis-ci/issues/4704#issuecomment-348435959
+ python -c 'import os,sys,fcntl; flags = fcntl.fcntl(sys.stdout, fcntl.F_GETFL); fcntl.fcntl(sys.stdout, fcntl.F_SETFL, flags&~os.O_NONBLOCK);'
+ export PROJECT_VERSION=$(mvn -B -N org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate -Dexpression=project.version | grep -v '\[')
+ export PARENT_VERSION=$(mvn -B -N org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate -Dexpression=project.parent.version | grep -v '\[')
exec ./packaging/rpm_ci
fi
@@ -33,10 +36,7 @@ then
MVN_ARGS="$MVN_ARGS -Dcurrent.jdk=1.9 -Djavac.target=1.9"
fi
-if [[ "$TEST_CLIENTS" ]];
-then
- mvn clean install -B -V -DskipTests $MVN_CUSTOM_ARGS
-elif [[ "$JDOC" == *"Y"* ]];
+if [[ "$JDOC" == *"Y"* ]];
then
# Build javadocs for Java 8 only
mvn ${MVN_ARGS} -P ${MVN_PROFILES},release-artifacts
@@ -54,9 +54,16 @@ else
mvn ${MVN_ARGS} -P ${MVN_PROFILES}
fi
+if [[ "${COVERAGE}" == "Y" ]];
+then
+ pip install --user codecov
+ codecov
+fi
+
# Run Scala-based and Clojure-based tests
if [[ "${TEST_CLIENTS}" == *"Y" ]];
then
+ # Pgjdbc should be in "local maven repository" so the clients can use it. Mvn commands above just package it.
mvn -DskipTests install
mkdir -p $HOME/.sbt/launchers/0.13.12
@@ -75,9 +82,3 @@ then
#cd java.jdbc
#TEST_DBS=postgres TEST_POSTGRES_USER=test TEST_POSTGRES_DBNAME=test mvn test -Djava.jdbc.test.pgjdbc.version=$PROJECT_VERSION
fi
-
-if [[ "${COVERAGE}" == "Y" ]];
-then
- pip install --user codecov
- codecov
-fi
diff --git a/.travis/travis_check_postgres_health.sh b/.travis/travis_check_postgres_health.sh
new file mode 100755
index 0000000..689e2f3
--- /dev/null
+++ b/.travis/travis_check_postgres_health.sh
@@ -0,0 +1,42 @@
+#!/usr/bin/env bash
+
+check_core_dump() {
+ local command_to_find="find ${PG_DATADIR} -type f -iname core*"
+ if [ ! -r "${PG_DATADIR}" ]
+ then
+ command_to_find="sudo ${command_to_find}"
+ fi
+
+ local status=0
+ while IFS= read -r core_dump_file
+ do
+ status=1
+ echo "Detected core dump: ${core_dump_file}"
+ echo bt full | sudo gdb --quiet /usr/local/pgsql/bin/postgres "${core_dump_file}"
+ done < <(${command_to_find})
+ return ${status}
+}
+
+print_logs() {
+ local log_file
+ if [[ "${PG_VERSION}" = "HEAD" ]]
+ then
+ log_file="/tmp/postgres.log"
+ else
+ log_file="/var/log/postgresql/postgresql-${PG_VERSION}-main.log"
+ fi
+
+ if [ -r "${log_file}" ]
+ then
+ cat "${log_file}"
+ else
+ sudo cat "${log_file}"
+ fi
+}
+
+check_core_dump
+if [[ $? -ne 0 ]]
+then
+ print_logs
+ exit 1
+fi
\ No newline at end of file
diff --git a/.travis/travis_configure_replication.sh b/.travis/travis_configure_replication.sh
new file mode 100755
index 0000000..2bfda32
--- /dev/null
+++ b/.travis/travis_configure_replication.sh
@@ -0,0 +1,31 @@
+#!/usr/bin/env bash
+set -x -e
+
+set_conf_property() {
+ local key=${1}
+ local value=${2}
+
+ sudo sed -i -e "s/^#\?${key}.*/${key} = ${value}/g" ${PG_DATADIR}/postgresql.conf
+}
+
+if [ "${REPLICATION}" = "Y" ]
+then
+ if [ "${PG_VERSION}" = "HEAD" ]
+ then
+ PG_VERSION="9.5"
+ fi
+
+ if (( $(echo "${PG_VERSION} >= 9.1" | bc -l)))
+ then
+ set_conf_property "max_wal_senders" "10"
+ set_conf_property "wal_keep_segments" "10"
+ set_conf_property "wal_sender_timeout" "5s"
+ sudo sed -i -e 's/^#local\s\+replication\s\+postgres\s\+\(.*\)/local replication all \1/g' ${PG_DATADIR}/pg_hba.conf
+ sudo sed -i -e 's/^#host\s\+replication\s\+postgres\s\+\(.*\)\s\+\(.*\)/host replication all \1 \2/g' ${PG_DATADIR}/pg_hba.conf
+ if (( $(echo "${PG_VERSION} >= 9.4" | bc -l)))
+ then
+ set_conf_property "wal_level" "logical"
+ set_conf_property "max_replication_slots" "10"
+ fi
+ fi
+fi
diff --git a/.travis/travis_configure_ssl.sh b/.travis/travis_configure_ssl.sh
new file mode 100755
index 0000000..c01affe
--- /dev/null
+++ b/.travis/travis_configure_ssl.sh
@@ -0,0 +1,48 @@
+#!/usr/bin/env bash
+
+set -x -e
+set_conf_property() {
+ local key=${1}
+ local value=${2}
+
+ sudo sed -i -e "s/^#\?${key}.*/${key} = '\/etc\/postgresql\/${PG_VERSION}\/main\/${value}'/" /etc/postgresql/${PG_VERSION}/main/postgresql.conf
+}
+
+enable_ssl_property() {
+ local property=${1}
+ sed -i -e "s/^#${property}\(.*\)/${property}\1/" ssltest.properties
+}
+
+if [ -z "$PG_VERSION" ]
+then
+ echo "env PG_VERSION is not defined";
+
+else
+set_conf_property "ssl_cert_file" "server.crt"
+set_conf_property "ssl_key_file" "server.key"
+set_conf_property "ssl_ca_file" "root.crt"
+
+enable_ssl_property "testsinglecertfactory"
+enable_ssl_property "sslhostnossl9"
+enable_ssl_property "sslhostgh9"
+enable_ssl_property "sslhostbh9"
+enable_ssl_property "sslhostsslgh9"
+enable_ssl_property "sslhostsslbh9"
+enable_ssl_property "sslhostsslcertgh9"
+enable_ssl_property "sslhostsslcertbh9"
+enable_ssl_property "sslcertgh9"
+enable_ssl_property "sslcertbh9"
+
+PG_DATA_DIR="/etc/postgresql/${PG_VERSION}/main/"
+sudo cp certdir/server/pg_hba.conf "/etc/postgresql/${PG_VERSION}/main/pg_hba.conf"
+sudo cp certdir/server/root.crt "${PG_DATA_DIR}"
+sudo chmod 0600 "${PG_DATA_DIR}/root.crt"
+sudo chown postgres:postgres "${PG_DATA_DIR}/root.crt"
+sudo cp certdir/server/server.crt "${PG_DATA_DIR}"
+sudo chmod 0600 "${PG_DATA_DIR}/server.crt"
+sudo chown postgres:postgres "${PG_DATA_DIR}/server.crt"
+sudo cp certdir/server/server.key "${PG_DATA_DIR}"
+sudo chmod 0600 "${PG_DATA_DIR}/server.key"
+sudo chown postgres:postgres "${PG_DATA_DIR}/server.key"
+
+fi
diff --git a/.travis/travis_configure_xa.sh b/.travis/travis_configure_xa.sh
index 58c82a6..683ae53 100755
--- a/.travis/travis_configure_xa.sh
+++ b/.travis/travis_configure_xa.sh
@@ -1,4 +1,4 @@
#!/usr/bin/env bash
set -x -e
-sudo sed -i -e 's/#max_prepared_transactions = 0/max_prepared_transactions = 64/g' /etc/postgresql/${PG_VERSION}/main/postgresql.conf
+sudo sed -i -e 's/#max_prepared_transactions = 0/max_prepared_transactions = 64/g' ${PG_DATADIR}/postgresql.conf
diff --git a/.travis/travis_create_slaves.sh b/.travis/travis_create_slaves.sh
new file mode 100755
index 0000000..2eba245
--- /dev/null
+++ b/.travis/travis_create_slaves.sh
@@ -0,0 +1,76 @@
+#!/usr/bin/env bash
+set -x -e
+
+if [ -z "$PG_VERSION" ]
+then
+ echo "env PG_VERSION not define";
+elif [ "x${PG_VERSION}" = "xHEAD" ]
+then
+ PG_CTL="/usr/local/pgsql/bin/pg_ctl"
+ PG_BASEBACKUP="/usr/local/pgsql/bin/pg_basebackup"
+else
+ PG_CTL="/usr/lib/postgresql/${PG_VERSION}/bin/pg_ctl"
+ PG_BASEBACKUP="/usr/lib/postgresql/${PG_VERSION}/bin/pg_basebackup"
+fi
+
+#Create Slave 1
+sudo rm -rf ${PG_SLAVE1_DATADIR}
+sudo mkdir -p ${PG_SLAVE1_DATADIR}
+sudo chmod 700 ${PG_SLAVE1_DATADIR}
+sudo chown -R postgres:postgres ${PG_SLAVE1_DATADIR}
+
+sudo su postgres -c "$PG_BASEBACKUP -Upostgres -D ${PG_SLAVE1_DATADIR} -X stream"
+
+sudo su postgres -c "echo standby_mode = \'on\' >${PG_SLAVE1_DATADIR}/recovery.conf"
+sudo su postgres -c "echo primary_conninfo = \'host=localhost port=5432 user=test password=test\' >>${PG_SLAVE1_DATADIR}/recovery.conf"
+sudo su postgres -c "echo recovery_target_timeline = \'latest\' >>${PG_SLAVE1_DATADIR}/recovery.conf"
+
+if [[ "x${PG_VERSION}" != "xHEAD" ]]
+then
+ sudo su postgres -c "echo 'local all all trust' > ${PG_SLAVE1_DATADIR}/pg_hba.conf"
+ sudo su postgres -c "echo 'host all all 127.0.0.1/32 trust' >> ${PG_SLAVE1_DATADIR}/pg_hba.conf"
+ sudo su postgres -c "echo 'host all all ::1/128 trust' >> ${PG_SLAVE1_DATADIR}/pg_hba.conf"
+
+ sudo su postgres -c "touch ${PG_SLAVE1_DATADIR}/pg_ident.conf"
+
+ sudo su postgres -c "cp -f ${PG_DATADIR}/postgresql.conf ${PG_SLAVE1_DATADIR}/postgresql.conf"
+ sudo sed -i -e "/^[ \t]*data_directory.*/d" ${PG_SLAVE1_DATADIR}/postgresql.conf
+ sudo sed -i -e "/^[ \t]*hba_file.*/d" ${PG_SLAVE1_DATADIR}/postgresql.conf
+ sudo sed -i -e "/^[ \t]*ident_file.*/d" ${PG_SLAVE1_DATADIR}/postgresql.conf
+ sudo sed -i -e "s/^#\?hot_standby.*/hot_standby = on/g" ${PG_SLAVE1_DATADIR}/postgresql.conf
+fi
+
+#Start Slave 1
+sudo su postgres -c "$PG_CTL -D ${PG_SLAVE1_DATADIR} -w -t 300 -c -o '-p 5433' -l /tmp/postgres_slave1.log start" || (sudo tail /tmp/postgres_slave1.log ; exit 1)
+sudo tail /tmp/postgres_slave1.log
+
+#Create Slave 2
+sudo rm -rf ${PG_SLAVE2_DATADIR}
+sudo mkdir -p ${PG_SLAVE2_DATADIR}
+sudo chmod 700 ${PG_SLAVE2_DATADIR}
+sudo chown -R postgres:postgres ${PG_SLAVE2_DATADIR}
+
+sudo su postgres -c "$PG_BASEBACKUP -Upostgres -D ${PG_SLAVE2_DATADIR} -X stream"
+
+sudo su postgres -c "echo standby_mode = \'on\' >${PG_SLAVE2_DATADIR}/recovery.conf"
+sudo su postgres -c "echo primary_conninfo = \'host=localhost port=5432 user=test password=test\' >>${PG_SLAVE2_DATADIR}/recovery.conf"
+sudo su postgres -c "echo recovery_target_timeline = \'latest\' >>${PG_SLAVE2_DATADIR}/recovery.conf"
+
+if [[ "x${PG_VERSION}" != "xHEAD" ]]
+then
+ sudo su postgres -c "echo 'local all all trust' > ${PG_SLAVE2_DATADIR}/pg_hba.conf"
+ sudo su postgres -c "echo 'host all all 127.0.0.1/32 trust' >> ${PG_SLAVE2_DATADIR}/pg_hba.conf"
+ sudo su postgres -c "echo 'host all all ::1/128 trust' >> ${PG_SLAVE2_DATADIR}/pg_hba.conf"
+
+ sudo su postgres -c "touch ${PG_SLAVE2_DATADIR}/pg_ident.conf"
+
+ sudo su postgres -c "cp -f ${PG_DATADIR}/postgresql.conf ${PG_SLAVE2_DATADIR}/postgresql.conf"
+ sudo sed -i -e "/^[ \t]*data_directory.*/d" ${PG_SLAVE2_DATADIR}/postgresql.conf
+ sudo sed -i -e "/^[ \t]*hba_file.*/d" ${PG_SLAVE2_DATADIR}/postgresql.conf
+ sudo sed -i -e "/^[ \t]*ident_file.*/d" ${PG_SLAVE2_DATADIR}/postgresql.conf
+ sudo sed -i -e "s/^#\?hot_standby.*/hot_standby = on/g" ${PG_SLAVE2_DATADIR}/postgresql.conf
+fi
+
+#Start Slave 2
+sudo su postgres -c "$PG_CTL -D ${PG_SLAVE2_DATADIR} -w -t 300 -c -o '-p 5434' -l /tmp/postgres_slave2.log start" || (sudo tail /tmp/postgres_slave2.log ; exit 1)
+sudo tail /tmp/postgres_slave2.log
diff --git a/.travis/travis_deploy.sh b/.travis/travis_deploy.sh
index f85c7ca..4f9ae52 100755
--- a/.travis/travis_deploy.sh
+++ b/.travis/travis_deploy.sh
@@ -13,5 +13,5 @@ then
cd pgjdbc-jre7
mvn ${MVN_ARGS} -P release-artifacts,release,skip-unzip-jdk
else
- mvn ${MVN_ARGS} -P release-artifacts,release
+ mvn ${MVN_ARGS} -P release-artifacts,release -Dskip.unzip-jdk-src=false
fi
diff --git a/.travis/travis_install_head_postgres.sh b/.travis/travis_install_head_postgres.sh
index 24c0ea3..0e73f2d 100755
--- a/.travis/travis_install_head_postgres.sh
+++ b/.travis/travis_install_head_postgres.sh
@@ -4,13 +4,29 @@ set -x -e
sudo service postgresql stop
sudo apt-get remove postgresql libpq-dev libpq5 postgresql-client-common postgresql-common -qq --purge
sudo apt-get -y install libxml2
+sudo apt-get -y install gdb
-git clone --depth=1 https://github.com/postgres/postgres.git
-cd postgres
+if [[ -z ${POSTGRES_SOURCE_SHA} ]]
+then
+ git clone --depth=1 https://github.com/postgres/postgres.git
+ cd postgres
+else
+ git clone https://github.com/postgres/postgres.git
+ cd postgres
+ git checkout ${POSTGRES_SOURCE_SHA}
+fi
# Build PostgreSQL from source
-sudo ./configure --with-libxml && sudo make && sudo make install
-sudo ln -s /usr/local/pgsql/bin/psql /usr/bin/psql
+if [[ "${COMPILE_PG_WITH_DEBUG_FLAG}" == "Y" ]]
+then
+ sudo ./configure --enable-debug --with-libxml CFLAGS="-ggdb"
+else
+ sudo ./configure --with-libxml CFLAGS="-ggdb"
+fi
+
+sudo make && sudo make install
+sudo ln -sf /usr/local/pgsql/bin/psql /usr/bin/psql
+
# Build contrib from source
cd contrib
sudo make all && sudo make install
@@ -20,8 +36,9 @@ LD_LIBRARY_PATH=/usr/local/pgsql/lib
export LD_LIBRARY_PATH
sudo /sbin/ldconfig /usr/local/pgsql/lib
+sudo rm -rf ${PG_DATADIR}
sudo mkdir -p ${PG_DATADIR}
sudo chmod 777 ${PG_DATADIR}
sudo chown -R postgres:postgres ${PG_DATADIR}
-sudo su postgres -c "/usr/local/pgsql/bin/pg_ctl -D ${PG_DATADIR} -U postgres initdb"
\ No newline at end of file
+sudo su postgres -c "/usr/local/pgsql/bin/pg_ctl -D ${PG_DATADIR} -U postgres initdb"
diff --git a/.travis/travis_install_openj9.sh b/.travis/travis_install_openj9.sh
new file mode 100755
index 0000000..2dad4b4
--- /dev/null
+++ b/.travis/travis_install_openj9.sh
@@ -0,0 +1,13 @@
+#!/usr/bin/env bash
+
+set -o xtrace -o errexit
+
+if [[ "${TRAVIS_SUDO}" == "true" && -n "${OPENJ9}" ]]
+then
+ # Build to Download
+ BUILD=${OPENJ9}
+ # Download from AdoptOpenJDK
+ wget --quiet -O /tmp/openj9.tar.gz https://github.com/AdoptOpenJDK/openjdk9-openj9-releases/releases/download/jdk-9%2B${BUILD}/OpenJDK9-OPENJ9_x64_Linux_jdk-9.${BUILD}.tar.gz
+ tar xfz /tmp/openj9.tar.gz -C ${HOME} # extract to ${HOME}/jdk-9+${BUILD}/
+ ${HOME}/jdk-9+${BUILD}/bin/java -version
+fi
diff --git a/.travis/travis_install_postgres.sh b/.travis/travis_install_postgres.sh
index cd69101..17a248c 100755
--- a/.travis/travis_install_postgres.sh
+++ b/.travis/travis_install_postgres.sh
@@ -10,7 +10,6 @@ then
./.travis/travis_install_head_postgres.sh
elif [ ! -d "${PG_DATADIR}" ]
then
- sudo cp /etc/postgresql/9.1/main/pg_hba.conf ./
sudo apt-get remove postgresql libpq-dev libpq5 postgresql-client-common postgresql-common -qq --purge
source /etc/lsb-release
echo "deb http://apt.postgresql.org/pub/repos/apt/ $DISTRIB_CODENAME-pgdg main ${PG_VERSION}" > pgdg.list
@@ -19,7 +18,10 @@ then
sudo apt-get update
sudo apt-get -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confnew" install postgresql-${PG_VERSION} postgresql-contrib-${PG_VERSION} -qq
- sudo cp ./pg_hba.conf /etc/postgresql/${PG_VERSION}/main
+ sudo sh -c "echo 'local all postgres trust' > /etc/postgresql/${PG_VERSION}/main/pg_hba.conf"
+ sudo sh -c "echo 'local all all trust' >> /etc/postgresql/${PG_VERSION}/main/pg_hba.conf"
+ sudo sh -c "echo -n 'host all all 127.0.0.1/32 trust' >> /etc/postgresql/${PG_VERSION}/main/pg_hba.conf"
+
if [ ${PG_VERSION} = '8.4' ]
then
sudo sed -i -e 's/port = 5433/port = 5432/g' /etc/postgresql/8.4/main/postgresql.conf
diff --git a/.travis/travis_install_zulu.sh b/.travis/travis_install_zulu.sh
new file mode 100755
index 0000000..9070331
--- /dev/null
+++ b/.travis/travis_install_zulu.sh
@@ -0,0 +1,11 @@
+#!/usr/bin/env bash
+
+set -o xtrace -o errexit
+
+if [[ "${TRAVIS_SUDO}" == "true" && -n "${ZULU_JDK}" ]]
+then
+ # Install OpenJDK Zulu from repository
+ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 0x219BD9C9
+ sudo apt-add-repository 'deb http://repos.azulsystems.com/ubuntu stable main'
+ sudo apt-get update -qq && sudo apt-get install zulu-${ZULU_JDK} -y
+fi
diff --git a/.travis/travis_release.sh b/.travis/travis_release.sh
new file mode 100755
index 0000000..f8a531b
--- /dev/null
+++ b/.travis/travis_release.sh
@@ -0,0 +1,102 @@
+#!/usr/bin/env bash
+
+# Fail script on error
+set -e
+
+cd .travis
+mkdir secrets
+
+# GPG is required for artifact signing
+openssl aes-256-cbc -k "$SUPER_SECRET_KEY" -in secrets.tar.enc -out secrets/secrets.tar -d
+
+cd secrets
+tar xvf secrets.tar
+
+gpg --import gpg-secret.key
+gpg --import-ownertrust gpg-ownertrust
+
+# Decrypt GitHub SSH key
+chmod 600 github_deploy
+eval $(ssh-agent -s)
+ssh-add ./github_deploy
+
+cd ..
+rm -rf ./secrets
+
+cd ..
+
+git config --global user.name "pgjdbc CI"
+git config --global user.email "pgsql-jdbc at postgresql.org"
+
+# By default Travis checks out commit, and maven-release-plugin wants to know branch name
+# On top of that, maven-release-plugin publishes branch, and it would terminate Travis job (current one!),
+# so we checkout a non-existing branch, so it won't get published
+# Note: at the end, we need to update "master" branch accordingly" (see $ORIGINAL_BRANCH)
+TMP_BRANCH=tmp/$TRAVIS_BRANCH
+
+CURRENT_VERSION=$(mvn -B -N org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate -Dexpression=project.version | grep -v '\[')
+RELEASE_VERSION=${CURRENT_VERSION/-SNAPSHOT}
+
+ORIGINAL_BRANCH=${TRAVIS_BRANCH#release/}
+
+REPO=$TRAVIS_REPO_SLUG
+JRE=
+if [[ "${TRAVIS_JDK_VERSION}" == *"jdk7"* ]]; then
+ JRE=-jre7
+elif [[ "${TRAVIS_JDK_VERSION}" == *"jdk6"* ]]; then
+ JRE=-jre6
+fi
+
+# Remove tmp branch if exists
+git push git at github.com:$TRAVIS_REPO_SLUG$JRE.git ":$TMP_BRANCH" || true
+
+set -x
+
+RELEASE_TAG=REL$RELEASE_VERSION
+if [[ "x$JRE" == "x" ]]; then
+ # Note: release should be a fast-forward for the "master" branch
+ # If push dry-run fails, the script just terminates
+ git push --dry-run git at github.com:$TRAVIS_REPO_SLUG.git "HEAD:$ORIGINAL_BRANCH"
+
+ git checkout -b "$TMP_BRANCH"
+else
+ git fetch --unshallow
+ # Use RELx.y.z.jreN
+ RELEASE_TAG=$RELEASE_TAG.${JRE#-}
+ # The following updates pgjdbc submodule of pgjdbc-jreX to the relevant RELx.y.z release tag
+ git clone -b "$ORIGINAL_BRANCH" --depth=50 https://github.com/$TRAVIS_REPO_SLUG$JRE.git pgjdbc$JRE
+
+ cd pgjdbc$JRE
+
+ # Use tmp branch for the release, so mvn release would use that
+ git checkout -b "$TMP_BRANCH"
+
+ git submodule update --init
+
+ # Force relevant version for jreN repository
+ mvn -DnewVersion=$RELEASE_VERSION.${JRE#-}-SNAPSHOT versions:set versions:commit
+ # Add all known pom.xml files in the repository
+ git add -u \*pom.xml
+
+ cd pgjdbc
+ git fetch
+ git checkout "$ORIGINAL_BRANCH"
+ git reset --hard REL$RELEASE_VERSION
+ cd ..
+ git add pgjdbc
+ git commit -m "Update pgjdbc to $RELEASE_VERSION"
+
+ # Note: we are IN pgjdbc-jreX sub-folder, and the subsequent release would release "jre-specific" version
+fi
+
+# Remove release tag if exists just in case
+git push git at github.com:$TRAVIS_REPO_SLUG$JRE.git :$RELEASE_TAG || true
+
+# -Darguments here is for maven-release-plugin
+MVN_SETTINGS=$(pwd)/settings.xml
+mvn -B --settings settings.xml -Darguments="--settings '${MVN_SETTINGS}' -Dskip.unzip-jdk-src=false" -Dskip.unzip-jdk-src=false release:prepare release:perform
+
+# Point "master" branch to "next development snapshot commit"
+git push git at github.com:$TRAVIS_REPO_SLUG$JRE.git "HEAD:$ORIGINAL_BRANCH"
+# Removal of the temporary branch is a separate command, so it left behind for the analysis in case "push to master" fails
+git push git at github.com:$TRAVIS_REPO_SLUG$JRE.git ":$TMP_BRANCH"
diff --git a/.travis/travis_ssl_users.sh b/.travis/travis_ssl_users.sh
new file mode 100755
index 0000000..0f95752
--- /dev/null
+++ b/.travis/travis_ssl_users.sh
@@ -0,0 +1,12 @@
+#!/usr/bin/env bash
+
+create_databases() {
+ for db in hostdb hostssldb hostnossldb certdb hostsslcertdb; do
+ createdb -U postgres $db
+ psql -U postgres $db -c "create extension sslinfo"
+ done
+}
+
+create_databases
+
+psql -U postgres test -c "create extension sslinfo"
\ No newline at end of file
diff --git a/.travis/travis_start_postgres.sh b/.travis/travis_start_postgres.sh
index 1f8a000..b996074 100755
--- a/.travis/travis_start_postgres.sh
+++ b/.travis/travis_start_postgres.sh
@@ -7,11 +7,11 @@ then
elif [ "x${PG_VERSION}" = "xHEAD" ]
then
#Start head postgres
- sudo su postgres -c "/usr/local/pgsql/bin/pg_ctl -D ${PG_DATADIR} -w -t 300 -o '-p 5432' -l /tmp/postgres.log start"
+ sudo su postgres -c "/usr/local/pgsql/bin/pg_ctl -D ${PG_DATADIR} -w -t 300 -c -o '-p 5432' -l /tmp/postgres.log start"
sudo tail /tmp/postgres.log
-elif [ "$XA" = "true" ]
+elif [ "$XA" = "true" ] || [ "${REPLICATION}" = "Y" ] || [ "${SSLTEST}" = "Y" ]
then
sudo service postgresql stop
sudo service postgresql start ${PG_VERSION}
sudo tail /var/log/postgresql/postgresql-${PG_VERSION}-main.log
-fi
\ No newline at end of file
+fi
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 0000000..7b5e8de
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,136 @@
+# Changelog
+Notable changes since version 42.0.0, read the complete [History of Changes](https://jdbc.postgresql.org/documentation/changelog.html).
+
+The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/).
+
+## [Unreleased]
+
+## [42.2.2] (2018-03-15)
+### Added
+- Documentation on server-side prepared statements [PR 1135](https://github.com/pgjdbc/pgjdbc/pull/1135)
+
+### Fixed
+- Avoid failure for `insert ... on conflict...update` for `reWriteBatchedInserts=true` case [PR 1130](https://github.com/pgjdbc/pgjdbc/pull/1130)
+- fix: allowEncodingChanges should allow set client_encoding=... [PR 1125](https://github.com/pgjdbc/pgjdbc/pull/1125)
+- Wrong data from Blob/Clob when mark/reset is used [PR 971](https://github.com/pgjdbc/pgjdbc/pull/971)
+- Adjust XAException return codes for better compatibility with XA specification [PR 782](https://github.com/pgjdbc/pgjdbc/pull/782)
+- Wrong results when single statement is used with different bind types[PR 1137](https://github.com/pgjdbc/pgjdbc/pull/1137)
+- Support generated keys for WITH queries that miss RETURNING [PR 1138](https://github.com/pgjdbc/pgjdbc/pull/1138)
+- Support generated keys when INSERT/UPDATE/DELETE keyword is followed by a comment [PR 1138](https://github.com/pgjdbc/pgjdbc/pull/1138)
+
+## [42.2.1] (2018-01-25)
+### Known issues
+- client_encoding has to be UTF8 even with allowEncodingChanges=true
+
+### Changed
+- socksProxyHost is ignored in case it contains empty string [PR 1079](https://github.com/pgjdbc/pgjdbc/pull/1079)
+
+### Fixed
+- Avoid connection failure when `DateStyle` is set to `ISO` (~PgBouncer) [Issue 1080](https://github.com/pgjdbc/pgjdbc/issues/1080)
+- Package scram:client classes, so SCRAM works when using a shaded jar [PR 1091](https://github.com/pgjdbc/pgjdbc/pull/1091) [1a89290e](https://github.com/pgjdbc/pgjdbc/commit/1a89290e110d5863b35e0a2ccf79e4292c1056f8)
+- reWriteBatchedInserts=true causes syntax error with ON CONFLICT [Issue 1045](https://github.com/pgjdbc/pgjdbc/issues/1045) [PR 1082](https://github.com/pgjdbc/pgjdbc/pull/1082)
+- Avoid failure in getPGArrayType when stringType=unspecified [PR 1036](https://github.com/pgjdbc/pgjdbc/pull/1036)
+- For PostgreSQL 9.0+ return a complete list of keywords in DatabaseMetadata.getSQLKeywords() from pg_catalog.pg_get_keywords(). [PR 940](https://github.com/pgjdbc/pgjdbc/pull/940)
+
+## [42.2.0] (2018-01-17)
+### Known issues
+- SCRAM does not work as scram:client library is not packaged
+- client_encoding has to be UTF8 even with allowEncodingChanges=true
+
+### Added
+- Support SCRAM-SHA-256 for PostgreSQL 10 in the JDBC 4.2 version (Java 8+) using the Ongres SCRAM library. [PR 842](https://github.com/pgjdbc/pgjdbc/pull/842)
+- Make SELECT INTO and CREATE TABLE AS return row counts to the client in their command tags. [Issue 958](https://github.com/pgjdbc/pgjdbc/issues/958) [PR 962](https://github.com/pgjdbc/pgjdbc/pull/962)
+- Support Subject Alternative Names for SSL connections. [PR 952](https://github.com/pgjdbc/pgjdbc/pull/952)
+- Support isAutoIncrement metadata for PostgreSQL 10 IDENTITY column. [PR 1004](https://github.com/pgjdbc/pgjdbc/pull/1004)
+- Support for primitive arrays [PR#887](https://github.com/pgjdbc/pgjdbc/pull/887) [3e0491a](https://github.com/pgjdbc/pgjdbc/commit/3e0491ac3833800721b98e7437635cf6ab338162)
+- Implement support for get/setNetworkTimeout() in connections. [PR 849](https://github.com/pgjdbc/pgjdbc/pull/849)
+- Make GSS JAAS login optional, add an option "jaasLogin" [PR 922](https://github.com/pgjdbc/pgjdbc/pull/922) see [Connecting to the Database](https://jdbc.postgresql.org/documentation/head/connect.html)
+
+### Changed
+- Improve behaviour of ResultSet.getObject(int, Class). [PR 932](https://github.com/pgjdbc/pgjdbc/pull/932)
+- Parse CommandComplete message using a regular expresion, allows complete catch of server returned commands for INSERT, UPDATE, DELETE, SELECT, FETCH, MOVE, COPY and future commands. [PR 962](https://github.com/pgjdbc/pgjdbc/pull/962)
+- Use 'time with timezone' and 'timestamp with timezone' as is and ignore the user provided Calendars, 'time' and 'timestamp' work as earlier except "00:00:00" now maps to 1970-01-01 and "24:00:00" uses the system provided Calendar ignoring the user-provided one [PR 1053](https://github.com/pgjdbc/pgjdbc/pull/1053)
+- Change behaviour of multihost connection. The new behaviour is to try all secondaries first before trying the master [PR 844](https://github.com/pgjdbc/pgjdbc/pull/844).
+- Avoid reflective access to TimeZone.defaultTimeZone in Java 9+ [PR 1002](https://github.com/pgjdbc/pgjdbc/pull/1002) fixes [Issue 986](https://github.com/pgjdbc/pgjdbc/issues/986)
+### Fixed
+- Make warnings available as soon as they are received from the server. This is useful for long running queries, where it can be beneficial to know about a warning before the query completes. [PR 857](https://github.com/pgjdbc/pgjdbc/pull/857)
+- Use 00:00:00 and 24:00:00 for LocalTime.MIN/MAX. [PR 992](https://github.com/pgjdbc/pgjdbc/pull/992)
+- Now the DatabaseMetaData.getFunctions() implementation complies with the JDBC docs. [PR 918](https://github.com/pgjdbc/pgjdbc/pull/918)
+- Execute autosave/rollback savepoint via simple queries always to prevent "statement S_xx not exists" when autosaving fixes [Issue #955](https://github.com/pgjdbc/pgjdbc/issues/955)
+- Received resultset tuples, but no field structure for them" when bind failure happens on 5th execution of a statement [Issue 811](https://github.com/pgjdbc/pgjdbc/issues/811)
+
+### Removed
+- Drop support for the (insecure) crypt authentication method. [PR 1026](https://github.com/pgjdbc/pgjdbc/pull/1026)
+
+### Deprecated
+- Reintroduce Driver.getVersion for backward compatibility reasons, mark it as deprecated as application should not rely on it (regression since 42.0.0) [50d5dd3e](https://github.com/pgjdbc/pgjdbc/commit/50d5dd3e708a92602e04d6b4aa0822ad3f110a78)
+
+## [42.1.4] (2017-08-01)
+### Changed
+- Statements with non-zero fetchSize no longer require server-side named handle. This might cause issues when using old PostgreSQL versions (pre-8.4)+fetchSize+interleaved ResultSet processing combo. [Issue 869](https://github.com/pgjdbc/pgjdbc/issues/869)
+
+## [42.1.3] (2017-07-14)
+### Fixed
+- Fix NPE in PreparedStatement.executeBatch in case of empty batch (regression since 42.1.2). [PR 867](https://github.com/pgjdbc/pgjdbc/pull/867)
+
+## [42.1.2] (2017-07-12)
+### Changed
+- Better logic for *returning* keyword detection. Previously, pgjdbc could be defeated by column names that contain *returning*, so pgjdbc failed to "return generated keys" as it considered statement as already having *returning* keyword [PR 824](https://github.com/pgjdbc/pgjdbc/pull/824) [201daf1d](https://github.com/pgjdbc/pgjdbc/commit/201daf1dc916bbc35e2bbec961aebfd1b1e30bfc)
+- Use server-prepared statements for batch inserts when prepareThreshold>0. Note: this enables batch to use server-prepared from the first *executeBatch()* execution (previously it waited for *prepareThreshold* *executeBatch()* calls) [abc3d9d7](https://github.com/pgjdbc/pgjdbc/commit/abc3d9d7f34a001322fbbe53f25d5e77a33a667f)
+
+### Fixed
+- Replication API: fix issue in #834 setting statusIntervalUpdate causes high CPU load. [PR 835](https://github.com/pgjdbc/pgjdbc/pull/835) [59236b74](https://github.com/pgjdbc/pgjdbc/commit/59236b74acdd400d9d91d3eb2bb07d70b15392e5)
+
+### Regresions
+- NPE in PreparedStatement.executeBatch in case of empty batch. Fixed in 42.1.3
+
+## [42.1.1] (2017-05-05)
+### Fixed
+- Fix infinite dates that might be corrupted when transferred in binary for certain JREs. For instance, 5881610-07-11 instead of infinity. [1e5bf563](https://github.com/pgjdbc/pgjdbc/commit/1e5bf563f41203417281117ed20b183cd295b4e0)
+
+## [42.1.0] (2017-05-04)
+### Added
+- Support fetching a REF_CURSOR using getObject [PR 809](https://github.com/pgjdbc/pgjdbc/pull/809)
+
+### Fixed
+- Fix data being truncated in setCharacterStream (bug introduced in 42.0.0) [PR 802](https://github.com/pgjdbc/pgjdbc/pull/802)
+- Fix calculation of lastReceiveLSN for logical replication [PR 801](https://github.com/pgjdbc/pgjdbc/pull/801)
+- Make sure org.postgresql.Driver is loaded when accessing though DataSource interface [Issue 768](https://github.com/pgjdbc/pgjdbc/issues/768)
+
+### Regressions
+- There's no 42.1.0.jre6 version due to infinity handling bug. Fixed in 42.1.1.jre6
+
+## [42.0.0] (2017-02-20)
+### Added
+- Replication protocol API was added: [replication API documentation](https://jdbc.postgresql.org//documentation/head/replication.html). [PR 550](https://github.com/pgjdbc/pgjdbc/pull/550)
+- java.util.logging is now used for logging: [logging documentation](https://jdbc.postgresql.org//documentation/head/logging.html). [PR 722](https://github.com/pgjdbc/pgjdbc/pull/722)
+- Add support for PreparedStatement.setCharacterStream(int, Reader). [ee4c4265](https://github.com/pgjdbc/pgjdbc/commit/ee4c4265aebc1c73a1d1fabac5ba259d1fbfd1e4)
+
+### Changed
+- Version bumped to 42.0.0 to avoid version clash with PostgreSQL version and follow a better sematic versioning. [46634923](https://github.com/pgjdbc/pgjdbc/commit/466349236622c6b03bb9cd8d7f517c3ce0586751)
+- Ensure executeBatch() can be used with pgbouncer. Previously pgjdbc could use server-prepared statements for batch execution even with prepareThreshold=0. [Issue 742](https://github.com/pgjdbc/pgjdbc/issues/742)
+- Error position is displayed when SQL has unterminated literals, comments, etc. [Issue 688](https://github.com/pgjdbc/pgjdbc/issues/688)
+- Strict handling of accepted values in getBoolean and setObject(BOOLEAN), now it follows PostgreSQL accepted values, only 1 and 0 for numeric types are accepted (previously !=0 was true). [PR 732](https://github.com/pgjdbc/pgjdbc/pull/732)
+- Return correct versions and name of the driver. [PR 668](https://github.com/pgjdbc/pgjdbc/pull/668)
+
+### Removed
+- Support for PostgreSQL versions below 8.2 was dropped. [PR 661](https://github.com/pgjdbc/pgjdbc/pull/661)
+
+### Deprecated
+- Deprecated PGPoolingDataSource, instead of this class you should use a fully featured connection pool like HikariCP, vibur-dbcp, commons-dbcp, c3p0, etc. [PR 739](https://github.com/pgjdbc/pgjdbc/pull/739)
+
+### Regressions
+- Data truncated in setCharacterStream. Fixed in 42.1.0
+- No suitable driver found for jdbc:postgresql when using a DataSource implementation. Fixed in 42.1.0
+
+
+[42.0.0]: https://github.com/pgjdbc/pgjdbc/compare/REL9.4.1212...REL42.0.0
+[42.1.0]: https://github.com/pgjdbc/pgjdbc/compare/REL42.0.0...REL42.1.0
+[42.1.1]: https://github.com/pgjdbc/pgjdbc/compare/REL42.1.0...REL42.1.1
+[42.1.2]: https://github.com/pgjdbc/pgjdbc/compare/REL42.1.1...REL42.1.2
+[42.1.3]: https://github.com/pgjdbc/pgjdbc/compare/REL42.1.2...REL42.1.3
+[42.1.4]: https://github.com/pgjdbc/pgjdbc/compare/REL42.1.3...REL42.1.4
+[42.2.0]: https://github.com/pgjdbc/pgjdbc/compare/REL42.1.4...REL42.2.0
+[42.2.1]: https://github.com/pgjdbc/pgjdbc/compare/REL42.2.0...REL42.2.1
+[42.2.2]: https://github.com/pgjdbc/pgjdbc/compare/REL42.2.1...REL42.2.2
+[Unreleased]: https://github.com/pgjdbc/pgjdbc/compare/REL42.2.2...HEAD
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 62a775d..8a74c1c 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -149,7 +149,29 @@ Prerequisites:
[copr web page](https://copr.fedorainfracloud.org/coprs/g/pgjdbc/pgjdbc-travis/builds/) -
possibly bump `parent poms` or `pgjdbc` versions in RPM [spec file](packaging/rpm/postgresql-jdbc.spec).
-Procedure:
+### Release via Travis
+
+To release a branch via Travis, perform the following:
+
+TL;DR:
+
+ git checkout -B release/master origin/master
+ git push origin release/master
+
+1. Check if `pom.xml` includes proper `-SNAPSHOT` versions (release versions would be the ones without `-SNAPSHOT`)
+1. Push `release/master` branch to pointing to the commit you want to release.
+
+ Note: `master..release/master` should be a fast-forward or both branches should point to the same commit.
+
+ Travis would build new version, create a tag, update `pom.xml` to the next snapshot versions, and update `master` branch accordingly.
+
+ Note: .jre6 and .jre7 builds will be built and staged to Maven Central automatically
+
+ Note: the artifacts will not be visible in Maven Central before you manually release them.
+
+1. Navigate to [Sonatype Nexus Repository Manager](https://oss.sonatype.org/#stagingRepositories), find staging `orgpostgresql` repository there and release it
+
+### Manual release procedure
Release a version for JDK8
- From a root folder, perform `mvn release:clean release:prepare`. That will ask you new version, update pom.xml, commit and push it to git.
@@ -196,7 +218,8 @@ If staged artifacts look fine, release it
mvn nexus-staging:release -DstagingRepositoryId=orgpostgresql-1082
```
-Update changelog:
+### Updating changelog
+
- run `./release_notes.sh`, edit as desired
## Dependencies
@@ -404,6 +427,6 @@ The subject contains succinct description of the change:
Just as in the **subject**, use the imperative, present tense: "change" not "changed" nor "changes"
The body should include the motivation for the change and contrast this with previous behavior.
-###Footer
+### Footer
The footer should contain any information about **Breaking Changes** and is also the place to
reference GitHub issues that this commit **Closes**.
diff --git a/README.md b/README.md
index fc4fd7f..b43ce9f 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,4 @@
-<img height="90" align="right" src="https://upload.wikimedia.org/wikipedia/commons/thumb/4/40/Wave.svg/133px-Wave.svg.png" />
-<img height="90" align="right" src="https://upload.wikimedia.org/wikipedia/commons/thumb/2/29/Postgresql_elephant.svg/200px-Postgresql_elephant.svg.png" />
+<img height="90" alt="Slonik Duke" align="right" src="docs/media/img/slonik_duke.png" />
# PostgreSQL JDBC Driver
@@ -16,7 +15,7 @@ PostgreSQL JDBC Driver (PgJDBC for short) allows Java programs to connect to a P
## Supported PostgreSQL and Java versions
The current version of the driver should be compatible with **PostgreSQL 8.2 and higher** using the version 3.0 of the protocol, and **Java 6** (JDBC 4.0), **Java 7** (JDBC 4.1) and **Java 8** (JDBC 4.2). Unless you have unusual requirements (running old applications or JVMs), this is the driver you should be using.
-Don't assume that the current version of PgJDBC 9.4.x is only PostgreSQL 9.4 compatible. PgJDBC regression tests are run against all PostgreSQL versions since 8.4, including "build PostgreSQL from git master" version. There are other derived forks of PostgreSQL but have not been certified to run with PgJDBC.
+PgJDBC regression tests are run against all PostgreSQL versions since 8.2, including "build PostgreSQL from git master" version. There are other derived forks of PostgreSQL but have not been certified to run with PgJDBC. If you find a bug or regression on supported versions, please fill an [Issue](https://github.com/pgjdbc/pgjdbc/issues).
## Get the Driver
Most people do not need to compile PgJDBC. You can download the precompiled driver (jar) from the [PostgreSQL JDBC site](https://jdbc.postgresql.org/download.html) or using your chosen dependency management tool:
@@ -24,36 +23,36 @@ Most people do not need to compile PgJDBC. You can download the precompiled driv
### Maven Central
You can search on The Central Repository with GroupId and ArtifactId [![Maven Search](https://img.shields.io/badge/org.postgresql-postgresql-yellow.svg)][mvn-search] for:
-[![Java 8](https://img.shields.io/badge/Java_8-9.4.1211-blue.svg)][mvn-jre8]
+[![Java 8](https://img.shields.io/badge/Java_8-42.2.1-blue.svg)][mvn-jre8]
```xml
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
- <version>9.4.1211</version>
+ <version>42.2.1</version>
</dependency>
```
-[![Java 7](https://img.shields.io/badge/Java_7-9.4.1211.jre7-blue.svg)][mvn-jre7]
+[![Java 7](https://img.shields.io/badge/Java_7-42.2.1.jre7-blue.svg)][mvn-jre7]
```xml
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
- <version>9.4.1211.jre7</version>
+ <version>42.2.1.jre7</version>
</dependency>
```
-[![Java 6](https://img.shields.io/badge/Java_6-9.4.1211.jre6-blue.svg)][mvn-jre6]
+[![Java 6](https://img.shields.io/badge/Java_6-42.2.1.jre6-blue.svg)][mvn-jre6]
```xml
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
- <version>9.4.1211.jre6</version>
+ <version>42.2.1.jre6</version>
</dependency>
```
[mvn-search]: http://search.maven.org/#search%7Cgav%7C1%7Cg%3A%22org.postgresql%22%20AND%20a%3A%22postgresql%22 "Search on Maven Central"
-[mvn-jre6]: http://search.maven.org/#artifactdetails|org.postgresql|postgresql|9.4.1211.jre6|bundle
-[mvn-jre7]: http://search.maven.org/#artifactdetails|org.postgresql|postgresql|9.4.1211.jre7|bundle
-[mvn-jre8]: http://search.maven.org/#artifactdetails|org.postgresql|postgresql|9.4.1211|bundle
+[mvn-jre6]: http://search.maven.org/#artifactdetails|org.postgresql|postgresql|42.2.1.jre6|bundle
+[mvn-jre7]: http://search.maven.org/#artifactdetails|org.postgresql|postgresql|42.2.1.jre7|bundle
+[mvn-jre8]: http://search.maven.org/#artifactdetails|org.postgresql|postgresql|42.2.1|bundle
#### Development snapshots
Snapshot builds (builds from `master` branch) are also deployed to Maven Central, so you can test current development version (test some bugfix) using:
@@ -61,46 +60,32 @@ Snapshot builds (builds from `master` branch) are also deployed to Maven Central
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
- <version>9.4.1212-SNAPSHOT</version> <!-- Java 8 -->
- <version>9.4.1212.jre7-SNAPSHOT</version> <!-- Java 7 -->
- <version>9.4.1212.jre6-SNAPSHOT</version> <!-- Java 6 -->
+ <version>42.2.2-SNAPSHOT</version> <!-- Java 8 -->
+ <version>42.2.2.jre7-SNAPSHOT</version> <!-- Java 7 -->
+ <version>42.2.2.jre6-SNAPSHOT</version> <!-- Java 6 -->
</dependency>
```
There are also available (snapshot) binary RPMs in [Fedora's Copr repository](https://copr.fedorainfracloud.org/coprs/g/pgjdbc/pgjdbc-travis/).
-## Changelog
-Notable changes for:
-
-**9.4.1211** (2016-09-18):
-* json type is returned as PGObject like in pre-9.4.1210 (fixed regression of 9.4.1210)
-* 'current transaction is aborted' exception includes the original exception via caused-by chain
-
-**9.4.1210** (2016-09-07):
-* BUG: json datatype is returned as java.lang.String object, not as PGObject (fixed in 9.4.1211)
-* Better support for RETURN_GENERATED_KEYS, statements with RETURNING clause
-* Avoid user-visible prepared-statement errors if client uses DEALLOCATE/DISCARD statements (invalidate cache when those statements detected)
-* Avoid user-visible prepared-statement errors if client changes search_path (invalidate cache when set search_path detected)
-* Support comments when replacing {fn ...} JDBC syntax
-* Support for Types.REF_CURSOR
-
-**9.4.1209** (2016-07-15):
-* Many improvements to `insert into .. values(?,?)` => `insert .. values(?,?), (?,?)...` rewriter. Give it a try by using `reWriteBatchedInserts=true` connection property. 2-3x improvements for insert batch can be expected
-* Full test suite passes against PostgreSQL 9.6, and OpenJDK 9
-* Performance optimization for timestamps (~`TimeZone.getDefault` optimization)
-* Allow build-from-source on GNU/Linux without maven repositories, and add Fedora Copr test to the regression suite
-
-Read the [History of Changes](https://jdbc.postgresql.org/documentation/changelog.html#introduction) for reference of previous versions.
-
----------------------------------------------------
## Documentation
For more information you can read [the PgJDBC driver documentation](https://jdbc.postgresql.org/documentation/head/) or for general JDBC documentation please refer to [The Java™ Tutorials](http://docs.oracle.com/javase/tutorial/jdbc/).
+### Driver and DataSource class
+
+| Implements | Class |
+| ----------------------------------- | ---------------------------------------------- |
+| java.sql.Driver | **org.postgresql.Driver** |
+| javax.sql.DataSource | org.postgresql.ds.PGSimpleDataSource |
+| javax.sql.ConnectionPoolDataSource | org.postgresql.ds.PGConnectionPoolDataSource |
+| javax.sql.XADataSource | org.postgresql.xa.PGXADataSource |
+
### Building the Connection URL
The driver recognises JDBC URLs of the form:
```
jdbc:postgresql:database
-jdbc:postgresql:/
+jdbc:postgresql:
jdbc:postgresql://host/database
jdbc:postgresql://host/
jdbc:postgresql://host:port/database
@@ -108,7 +93,7 @@ jdbc:postgresql://host:port/
```
The general format for a JDBC URL for connecting to a PostgreSQL server is as follows, with items in square brackets ([ ]) being optional:
```
-jdbc:postgresql://[host][:port][/[database]][?property1=value1[&property2=value2]...]
+jdbc:postgresql:[//host[:port]/][database][?property1=value1[&property2=value2]...]
```
where:
* **jdbc:postgresql:** (Required) is known as the sub-protocol and is constant.
@@ -131,12 +116,13 @@ In addition to the standard connection parameters the driver supports a number o
| sslcert | String | null | The location of the client's SSL certificate |
| sslkey | String | null | The location of the client's PKCS#8 SSL key |
| sslrootcert | String | null | The location of the root certificate for authenticating the server. |
-| sslhostnameverifier | String | null | A class, implementing javax.net.ssl.HostnameVerifier that can verify the server |
-| sslpaswordcallback | String | null | A class, implementing javax.security.auth.callback.CallbackHandler that can handle PassworCallback for the ssl password. |
+| sslhostnameverifier | String | null | The name of a class (for use in [Class.forName(String)](https://docs.oracle.com/javase/6/docs/api/java/lang/Class.html#forName%28java.lang.String%29)) that implements javax.net.ssl.HostnameVerifier and can verify the server hostname. |
+| sslpasswordcallback | String | null | The name of a class (for use in [Class.forName(String)](https://docs.oracle.com/javase/6/docs/api/java/lang/Class.html#forName%28java.lang.String%29)) that implements javax.security.auth.callback.CallbackHandler and can handle PasswordCallback for the ssl password. |
| sslpassword | String | null | The password for the client's ssl key (ignored if sslpasswordcallback is set) |
| sendBufferSize | Integer | -1 | Socket write buffer size |
| recvBufferSize | Integer | -1 | Socket read buffer size |
-| loglevel | Integer | 0 | The log level to debug the driver, posible values: 0, 1, 2 |
+| loggerLevel | String | null | Logger level of the driver using java.util.logging. Allowed values: OFF, DEBUG or TRACE. |
+| loggerFile | String | null | File name output of the Logger, if set, the Logger will use a FileHandler to write to a specified file. If the parameter is not set or the file can't be created the ConsoleHandler will be used instead. |
| allowEncodingChanges | Boolean | false | Allow for changes in client_encoding |
| logUnclosedConnections | Boolean | false | When connections that are not explicitly closed are garbage collected, log the stacktrace from the opening of the connection to trace the leak source |
| binaryTransferEnable | String | "" | Comma separated list of types to enable binary transfer. Either OID numbers or names |
@@ -154,13 +140,13 @@ In addition to the standard connection parameters the driver supports a number o
| disableColumnSanitiser | Boolean | false | Enable optimization that disables column name sanitiser |
| assumeMinServerVersion | String | null | Assume the server is at least that version |
| currentSchema | String | null | Specify the schema to be set in the search-path |
-| targetServerType | String | any | Specifies what kind of server to connect, posible values: any, master, slave, preferSlave |
-| hostRecheckSeconds | Integer | 10 | Specifies period (seconds) after host statuses are checked again in case they have changed |
+| targetServerType | String | any | Specifies what kind of server to connect, possible values: any, master, slave (deprecated), secondary, preferSlave (deprecated), preferSecondary |
+| hostRecheckSeconds | Integer | 10 | Specifies period (seconds) after which the host status is checked again in case it has changed |
| loadBalanceHosts | Boolean | false | If disabled hosts are connected in the given order. If enabled hosts are chosen randomly from the set of suitable candidates |
| socketFactory | String | null | Specify a socket factory for socket creation |
| socketFactoryArg | String | null | Argument forwarded to constructor of SocketFactory class. |
-| autosave | String | never | Specifies what the driver should do if a query fails, posible values: always, never, conservative |
-| preferQueryMode | String | extended | Specifies which mode is used to execute queries to database, posible values: extended, extendedForPrepared, extendedCacheEveryting, simple |
+| autosave | String | never | Specifies what the driver should do if a query fails, possible values: always, never, conservative |
+| preferQueryMode | String | extended | Specifies which mode is used to execute queries to database, possible values: extended, extendedForPrepared, extendedCacheEverything, simple |
| reWriteBatchedInserts | Boolean | false | Enable optimization to rewrite and collapse compatible INSERT statements that are batched. |
## Contributing
diff --git a/appveyor.yml b/appveyor.yml
new file mode 100644
index 0000000..fc6bb51
--- /dev/null
+++ b/appveyor.yml
@@ -0,0 +1,36 @@
+# appveyor.yml
+init:
+- ps: iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1'))
+- ps: Add-Content "c:\program files\postgresql\9.6\data\postgresql.conf" "wal_level=logical"
+- ps: Add-Content "c:\program files\postgresql\9.6\data\postgresql.conf" "max_wal_senders=3"
+- ps: Add-Content "c:\program files\postgresql\9.6\data\postgresql.conf" "wal_keep_segments=10"
+- ps: Add-Content "c:\program files\postgresql\9.6\data\postgresql.conf" "wal_sender_timeout=5s"
+- ps: Add-Content "c:\program files\postgresql\9.6\data\postgresql.conf" "max_replication_slots=10"
+- ps: Add-Content "c:\program files\postgresql\9.6\data\pg_hba.conf" "host replication all 127.0.0.1/32 trust"
+
+branches:
+ except:
+ - /^tmp\/.*/
+ - /^REL.*/
+
+services:
+ - postgresql96
+
+before_build:
+ - SET PATH=C:\Program Files\PostgreSQL\9.6\bin\;%PATH%
+ - SET PGUSER=postgres
+ - SET PGPASSWORD=Password12!
+ - createuser -U postgres test
+ - psql -U postgres -c "alter user test with password 'test'" postgres
+ - createdb -U postgres -O test test
+
+build_script:
+ - mvn clean package -DskipTests
+
+test_script:
+ - echo redirect escape ^> foo.bar
+ - echo privilegedPassword=Password12!>c:\projects\pgjdbc\build.local.properties
+ - mvn package
+
+cache:
+ - C:\Users\appveyor\.m2
diff --git a/build.properties b/build.properties
index 14c0e9e..91e4cd1 100644
--- a/build.properties
+++ b/build.properties
@@ -1,9 +1,14 @@
# Default build parameters. These may be overridden by local configuration
# settings in build.local.properties.
+# loggerLevel can be OFF, DEBUG, TRACE
#
server=localhost
port=5432
+secondaryServer=localhost
+secondaryPort=5433
+secondaryServer2=localhost
+secondaryServerPort2=5434
database=test
username=test
password=test
@@ -11,5 +16,6 @@ privilegedUser=postgres
privilegedPassword=
sspiusername=testsspi
preparethreshold=5
-loglevel=0
+loggerLevel=OFF
+loggerFile=target/pgjdbc-tests.log
protocolVersion=0
diff --git a/certdir/README b/certdir/README
index 6139bf9..8bbbf5b 100644
--- a/certdir/README
+++ b/certdir/README
@@ -3,7 +3,7 @@ To run the SSL tests, the following properties are used:
certdir: directory where the certificates and keys are store
-ssl<TYPE><gh|bh><8|9>: a connection string to the appropiate database
+ssl<TYPE><gh|bh><8|9>: a connection string to the appropriate database
TYPE is the TYPE or METHOD field from pg_hba.conf that is: host, hostnossl,
hostssl and the special types hostsslcert, that corresponds
to a hostssl type with clientcert=1 and cert that corresponds
diff --git a/certdir/server/pg_hba.conf b/certdir/server/pg_hba.conf
index 9ce9fec..27b7649 100644
--- a/certdir/server/pg_hba.conf
+++ b/certdir/server/pg_hba.conf
@@ -71,8 +71,10 @@
# TYPE DATABASE USER CIDR-ADDRESS METHOD
# "local" is for Unix domain socket connections only
-local all all ident
+local all postgres trust
# IPv4 local connections:
+host all postgres 127.0.0.1/32 trust
+host test all 127.0.0.1/32 md5
host hostdb all 127.0.0.1/32 md5
hostnossl hostnossldb all 127.0.0.1/32 md5
hostssl hostssldb all 127.0.0.1/32 md5 clientcert=0
diff --git a/codecov.yml b/codecov.yml
index 00ae537..fc6b11d 100644
--- a/codecov.yml
+++ b/codecov.yml
@@ -1,6 +1,6 @@
codecov:
notify:
- after_n_builds: 8
+ after_n_builds: 9
require_ci_to_pass: false
comment:
layout: header, changes, diff
diff --git a/docs/.gitignore b/docs/.gitignore
new file mode 100644
index 0000000..c08f9ad
--- /dev/null
+++ b/docs/.gitignore
@@ -0,0 +1 @@
+_site
\ No newline at end of file
diff --git a/docs/_config.yml b/docs/_config.yml
new file mode 100644
index 0000000..58b50f7
--- /dev/null
+++ b/docs/_config.yml
@@ -0,0 +1,11 @@
+name: PostgreSQL JDBC Driver website
+markdown: redcarpet
+redcarpet:
+ extensions:
+ - tables
+highlighter: pygments
+excerpt_separator: <!--more-->
+exclude:
+ - Gemfile
+ - Gemfile.lock
+ - README.md
diff --git a/docs/_includes/submenu_about.html b/docs/_includes/submenu_about.html
new file mode 100644
index 0000000..efa2af0
--- /dev/null
+++ b/docs/_includes/submenu_about.html
@@ -0,0 +1,9 @@
+<div id="pgSideWrap">
+ <div id="pgSideNav">
+ <ul>
+ <li><a href="about.html">About</a></li>
+ <li><a href="license.html">License</a></li>
+ <li><a href="extras.html">Extras</a></li>
+ </ul>
+ </div> <!-- pgSideNam -->
+ </div> <!-- pgSideWrap -->
\ No newline at end of file
diff --git a/docs/_includes/submenu_community.html b/docs/_includes/submenu_community.html
new file mode 100644
index 0000000..108abcc
--- /dev/null
+++ b/docs/_includes/submenu_community.html
@@ -0,0 +1,9 @@
+<div id="pgSideWrap">
+ <div id="pgSideNav">
+ <ul>
+ <li><a href="community.html">Community</a></li>
+ <li><a href="mailinglist.html">Mailing List</a></li>
+ <li><a href="contributors.html">Contributors</a></li>
+ </ul>
+ </div> <!-- pgSideNam -->
+ </div> <!-- pgSideWrap -->
\ No newline at end of file
diff --git a/docs/_includes/submenu_development.html b/docs/_includes/submenu_development.html
new file mode 100644
index 0000000..1cd7e3f
--- /dev/null
+++ b/docs/_includes/submenu_development.html
@@ -0,0 +1,12 @@
+<div id="pgSideWrap">
+ <div id="pgSideNav">
+ <ul>
+ <li><a href="development.html">Development</a></li>
+ <li><a href="git.html">GIT</a></li>
+ <li><a href="translations.html">Translations</a></li>
+ <li><a href="website.html">Website</a></li>
+ <li><a href="todo.html">Todo</a></li>
+ <li><a href="privateapi/index.html">Private API</a></li>
+ </ul>
+ </div> <!-- pgSideNam -->
+ </div> <!-- pgSideWrap -->
\ No newline at end of file
diff --git a/docs/_includes/submenu_documentation.html b/docs/_includes/submenu_documentation.html
new file mode 100644
index 0000000..a8e1ea7
--- /dev/null
+++ b/docs/_includes/submenu_documentation.html
@@ -0,0 +1,10 @@
+<div id="pgSideWrap">
+ <div id="pgSideNav">
+ <ul>
+ <li><a href="documentation.html">Documentation</a></li>
+ <li><a href="changelog.html">Changelog</a></li>
+ <li><a href="faq.html">FAQ</a></li>
+ <li><a href="publicapi/index.html">Public API</a></li>
+ </ul>
+ </div> <!-- pgSideNam -->
+ </div> <!-- pgSideWrap -->
\ No newline at end of file
diff --git a/docs/_layouts/changes.html b/docs/_layouts/changes.html
new file mode 100644
index 0000000..ccda879
--- /dev/null
+++ b/docs/_layouts/changes.html
@@ -0,0 +1,9 @@
+---
+layout: default
+---
+
+{% include submenu_documentation.html %}
+
+ <div id="pgContentWrap">
+ {{ content }}
+ </div> <!-- pgContentWrap -->
\ No newline at end of file
diff --git a/docs/_layouts/default.html b/docs/_layouts/default.html
new file mode 100644
index 0000000..188c2e6
--- /dev/null
+++ b/docs/_layouts/default.html
@@ -0,0 +1,108 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en" dir="ltr">
+<head>
+ <title>{{ page.title }}</title>
+ <meta http-equiv="Content-Type" content="text/xhtml; charset=utf-8" />
+ <meta name="description" content="The official site for the PostgreSQL JDBC Driver" />
+ <meta name="copyright" content="The PostgreSQL Global Development Group" />
+
+ <style type="text/css" media="screen" title="Normal Text">@import url("{{ page.resource }}/css/base.css");</style>
+
+ <link rel="shortcut icon" href="{{ page.resource }}/favicon.ico" />
+
+ <!--
+ <script type="text/javascript">
+ var _gaq = _gaq || [];
+ _gaq.push(['_setAccount', 'UA-1345454-1']);
+ _gaq.push(['_trackPageview']);
+ (function() {
+ var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
+ ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+ var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
+ })();
+ </script>
+ -->
+</head>
+
+<body>
+ <div id="pgContainerWrap">
+ <div id="pgContainer">
+
+ <span class="txtOffScreen"><a href="#pgContent" title="Skip site navigation" accesskey="1">Skip site navigation</a> (1)</span>
+ <span class="txtOffScreen"><a href="#pgContentWrap" title="Skip section navigation" accesskey="2">Skip section navigation</a> (2)</span>
+
+ <div id="pgHeaderContainer">
+
+ <div id="pgSearch">
+
+ <!-- Old pgjdbc form -->
+ <form action="https://www.google.com/search" method="get">
+ <input value="jdbc.postgresql.org" name="sitesearch" type="hidden" />
+ <input id="q" name="q" type="text" size="20" maxlength="255" onfocus="if( this.value==this.defaultValue ) this.value='';" value="Google Search" accesskey="s" />
+ <!-- <input onFocus="getBlank (this, 'Search the site with google');" size="25" name="q" id="query" type="text" value="Search the site with google"> -->
+ <input name="Search" value="Search" type="submit" />
+ </form>
+
+ <!-- New PostgreSQL form
+ <form method="get" action="search/">
+ <div>
+ <h2 class="pgBlockHide"><label for="q">Search</label></h2>
+ <input id="q" name="q" type="text" size="20" maxlength="255" onfocus="if( this.value==this.defaultValue ) this.value='';" value="Search" accesskey="s" />
+ <input name="a" type="hidden" value="1"/>
+ <input id="submit" name="submit" type="submit" value="Search" />
+ </div>
+ </form>
+ -->
+
+ </div> <!-- pgSearch -->
+ <br />
+
+ <div id="pgHeader">
+ <div id="pgHeaderLogoLeft">
+ <img alt="PostgreSQL" height="80" width="390" src="{{ page.resource }}/img/layout/hdr_left3.png" usemap="#maplinks" />
+ <map name="maplinks">
+ <area shape="rect" coords="0,0,231,80" alt="PostgreSQL" href="https://postgresql.org" />
+ <area shape="rect" coords="232,0,390,80" alt="PostgreSQL JDBC Driver" href="https://jdbc.postgresql.org" />
+ </map>
+ </div>
+ <div id="pgHeaderLogoRight">
+ <a href="https://postgresql.org">
+ <img width="210" height="80" alt="The world's most advanced open source database." src="{{ page.resource }}/img/layout/hdr_right.png" />
+ </a>
+ </div>
+ </div> <!-- pgHeader -->
+
+ <div id="pgTopNav">
+ <div id="pgTopNavLeft">
+ <img width="7" style="height: 100%;" alt="" src="{{ page.resource }}/img/layout/nav_lft.png" />
+ </div>
+ <div id="pgTopNavRight">
+ <img width="7" style="height: 100%;" alt="" src="{{ page.resource }}/img/layout/nav_rgt.png" />
+ </div>
+ <ul id="pgTopNavList">
+ <li><a href="{{ page.nav }}index.html" title="Home">Home</a></li>
+ <li><a href="{{ page.nav }}about/about.html" title="About">About</a></li>
+ <li><a href="{{ page.nav }}download.html" title="Download">Download</a></li>
+ <li><a href="{{ page.nav }}documentation/documentation.html" title="Documentation">Documentation</a></li>
+ <li><a href="{{ page.nav }}community/community.html" title="Community">Community</a></li>
+ <li><a href="{{ page.nav }}development/development.html" title="Development">Development</a></li>
+ </ul>
+ </div> <!-- pgTopNav -->
+ </div> <!-- pgHeaderContainer -->
+
+ <div id="pgContent">
+ {{ content }}
+
+ <br class="pgClearBoth" />
+ </div> <!-- pgContent -->
+ <hr />
+
+ <div id="pgFooter">
+ <a class="navFooter" href="https://www.postgresql.org/about/privacypolicy">Privacy Policy</a> |
+ <a class="navFooter" href="https://www.postgresql.org/about/">About PostgreSQL</a><br/>
+ Copyright © 1996-{{ site.time | date: "%Y" }} The PostgreSQL Global Development Group
+ </div> <!-- pgFooter -->
+ </div> <!-- pgContainer -->
+ </div> <!-- pgContainerWrap -->
+</body>
+</html>
diff --git a/docs/_layouts/default_docs.html b/docs/_layouts/default_docs.html
new file mode 100644
index 0000000..26248ca
--- /dev/null
+++ b/docs/_layouts/default_docs.html
@@ -0,0 +1,91 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <title>{{ page.title }}</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+ <meta name="description" content="The official documentation for the PostgreSQL JDBC Driver" />
+ <meta name="copyright" content="The PostgreSQL Global Development Group" />
+
+ <style type="text/css" media="screen" title="Normal Text">@import url("media/css/docs.css");</style>
+ <link rel="stylesheet" type="text/css" href="{{ page.resource }}/css/syntax.css">
+
+ <link rel="shortcut icon" href="{{ page.resource }}/favicon.ico" />
+</head>
+
+<body>
+ <div id="docHeader">
+ <div id="docHeaderLogo">
+ <a href="https://jdbc.postgresql.org/" title="PostgreSQL JDBC Driver"><img src="media/img/layout/hdr_left3a.png" alt="PostgreSQL" height="80" width="390" /></a>
+ </div>
+ </div>
+
+ <div id="docContainerWrap">
+ <div id="docContainer">
+ <div id="docContent">
+
+ <div class="NAVHEADER">
+ <table summary="Header navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
+ <tbody>
+ <tr>
+ <th colspan="3" valign="bottom" align="center">
+ <h2 class="TITLE">{{ page.header }}</h2>
+ </th>
+ </tr>
+ <tr>
+ <td valign="top" width="20%" align="left">
+ <a title="{{ page.previoustitle }}" href="{{ page.previous }}" accesskey="P">Prev</a>
+ </td>
+ <td valign="bottom" width="60%" align="center"> </td>
+ <td valign="top" width="20%" align="right">
+ <a title="{{ page.nexttitle }}" href="{{ page.next }}" accesskey="N">Next</a>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ <hr class="c1" width="100%" />
+ </div> <!-- NAVHEADER -->
+
+ <div class="CHAPTER">
+ <h1>{{ page.title }}</h1>
+
+ {{ content }}
+ </div>
+
+ <div class="NAVFOOTER">
+ <hr class="c1" width="100%" />
+ <table summary="Footer navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
+ <tbody>
+ <tr>
+ <td valign="top" width="33%" align="left">
+ <a href="{{ page.previous }}" accesskey="P">Prev</a>
+ </td>
+ <td valign="top" width="34%" align="center">
+ <a href="index.html" accesskey="H">Home</a>
+ </td>
+ <td valign="top" width="33%" align="right">
+ <a href="{{ page.next }}" accesskey="N">Next</a>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top" width="33%" align="left">{{ page.previoustitle }}</td>
+ <td valign="top" width="34%" align="center"> </td>
+ <td valign="top" width="33%" align="right">{{ page.nexttitle }}</td>
+ </tr>
+ </tbody>
+ </table>
+ </div> <!-- NAVFOOTER -->
+
+
+ </div> <!-- docContent -->
+
+ <div id="docComments"></div>
+
+ <div id="docFooter">
+ <a class="navFooter" href="https://www.postgresql.org/about/privacypolicy">Privacy Policy</a> |
+ <a class="navFooter" href="https://www.postgresql.org/about/">About PostgreSQL</a><br/>
+ Copyright © 1996-{{ site.time | date: "%Y" }} The PostgreSQL Global Development Group
+ </div> <!-- pgFooter -->
+ </div> <!-- docContainer -->
+ </div> <!-- docContainer -->
+</body>
+</html>
diff --git a/docs/_layouts/documents.html b/docs/_layouts/documents.html
new file mode 100644
index 0000000..e55251e
--- /dev/null
+++ b/docs/_layouts/documents.html
@@ -0,0 +1,18 @@
+---
+layout: default
+---
+
+{% include submenu_documentation.html %}
+
+ <div id="pgContentWrap">
+ <h1>Documentation</h1>
+ <p>
+ This website contains the latest, most up to date version of the documentation.
+ In general we hope the documentation here is accurate and makes reference to
+ specific version compatibility issues, but we know this isn't always true. In
+ some cases it may be valuable to refer to the documentation written for your
+ specific driver version.
+ </p>
+
+ {{ content }}
+ </div> <!-- pgContentWrap -->
\ No newline at end of file
diff --git a/docs/_layouts/downloads.html b/docs/_layouts/downloads.html
new file mode 100644
index 0000000..77c081a
--- /dev/null
+++ b/docs/_layouts/downloads.html
@@ -0,0 +1,8 @@
+---
+layout: default
+---
+
+<br />
+ <div>
+ {{ content }}
+ </div>
\ No newline at end of file
diff --git a/docs/_layouts/faqs.html b/docs/_layouts/faqs.html
new file mode 100644
index 0000000..ccda879
--- /dev/null
+++ b/docs/_layouts/faqs.html
@@ -0,0 +1,9 @@
+---
+layout: default
+---
+
+{% include submenu_documentation.html %}
+
+ <div id="pgContentWrap">
+ {{ content }}
+ </div> <!-- pgContentWrap -->
\ No newline at end of file
diff --git a/docs/_layouts/todos.html b/docs/_layouts/todos.html
new file mode 100644
index 0000000..ab02b02
--- /dev/null
+++ b/docs/_layouts/todos.html
@@ -0,0 +1,9 @@
+---
+layout: default
+---
+
+{% include submenu_development.html %}
+
+ <div id="pgContentWrap">
+ {{ content }}
+ </div> <!-- pgContentWrap -->
\ No newline at end of file
diff --git a/docs/_posts/2017-02-20-42.0.0-release.md b/docs/_posts/2017-02-20-42.0.0-release.md
new file mode 100644
index 0000000..e356c69
--- /dev/null
+++ b/docs/_posts/2017-02-20-42.0.0-release.md
@@ -0,0 +1,148 @@
+---
+title: "PostgreSQL JDBC Driver 42.0.0 Released"
+date: 2017-02-20 00:00:00 +0300
+categories:
+ - new_release
+version: 42.0.0
+---
+**Notable changes**
+
+### Added
+- Replication protocol API was added: [replication API documentation](https://jdbc.postgresql.org//documentation/head/replication.html). [PR 550](https://github.com/pgjdbc/pgjdbc/pull/550)
+- java.util.logging is now used for logging: [logging documentation](https://jdbc.postgresql.org//documentation/head/logging.html). [PR 722](https://github.com/pgjdbc/pgjdbc/pull/722)
+- Add support for PreparedStatement.setCharacterStream(int, Reader). [ee4c4265](https://github.com/pgjdbc/pgjdbc/commit/ee4c4265aebc1c73a1d1fabac5ba259d1fbfd1e4)
+
+### Changed
+- Version bumped to 42.0.0 to avoid version clash with PostgreSQL version and follow a better sematic versioning. [46634923](https://github.com/pgjdbc/pgjdbc/commit/466349236622c6b03bb9cd8d7f517c3ce0586751)
+- Ensure executeBatch() can be used with pgbouncer. Previously pgjdbc could use server-prepared statements for batch execution even with prepareThreshold=0. [Issue 742](https://github.com/pgjdbc/pgjdbc/issues/742)
+- Error position is displayed when SQL has unterminated literals, comments, etc. [Issue 688](https://github.com/pgjdbc/pgjdbc/issues/688)
+- Strict handling of accepted values in getBoolean and setObject(BOOLEAN), now it follows PostgreSQL accepted values, only 1 and 0 for numeric types are acepted (previusly !=0 was true). [PR 732](https://github.com/pgjdbc/pgjdbc/pull/732)
+- Return correct versions and name of the driver. [PR 668](https://github.com/pgjdbc/pgjdbc/pull/668)
+
+### Removed
+- Support for PostgreSQL versions below 8.2 was dropped. [PR 661](https://github.com/pgjdbc/pgjdbc/pull/661)
+
+### Deprecated
+- Deprecated PGPoolingDataSource, instead of this class you should use a fully featured connection pool like HikariCP, vibur-dbcp, commons-dbcp, c3p0, etc. [PR 739](https://github.com/pgjdbc/pgjdbc/pull/739)
+
+### Regressions
+- Data truncated in setCharacterStream. Fixed in 42.1.0
+- No suitable driver found for jdbc:postgresql when using a DataSource implementation. Fixed in 42.1.0
+
+<br>
+You may have noticed the change in the versioning of the driver, you can [read the FAQ](documentation/faq.html#versioning) for more information.
+
+<!--more-->
+
+**Commits by author**
+
+AlexElin (6):
+
+* refactor: use varargs [PR#681](https://github.com/pgjdbc/pgjdbc/pull/681) [50b7fe0f](https://github.com/pgjdbc/pgjdbc/commit/50b7fe0fe901ee24160615bebd4b86603b960b86)
+* refactor: make HostChooser implement Iterable [PR#645](https://github.com/pgjdbc/pgjdbc/pull/645) [3d37db78](https://github.com/pgjdbc/pgjdbc/commit/3d37db78ae4a82cab8809bac86e3b55537e91d95)
+* refactor: migrate to Junit4 [PR#682](https://github.com/pgjdbc/pgjdbc/pull/682) [f4a067cc](https://github.com/pgjdbc/pgjdbc/commit/f4a067cc5d32dde2698a062d6f9855d50fa3127d)
+* refactor: remove deprecated Utils' methods [PR#678](https://github.com/pgjdbc/pgjdbc/pull/678) [0275d40f](https://github.com/pgjdbc/pgjdbc/commit/0275d40f6f2b8b30faef8aed31761e1ff7a0ed90)
+* refactor: migrate tests to junit4 [PR#685](https://github.com/pgjdbc/pgjdbc/pull/685) [faab4998](https://github.com/pgjdbc/pgjdbc/commit/faab499853c56f67cb70fb242f75b918452f2a6f)
+* refactor: remove checks for jdk version 1.4 (tests) [PR#737](https://github.com/pgjdbc/pgjdbc/pull/737) [ee51dfce](https://github.com/pgjdbc/pgjdbc/commit/ee51dfce99dcd922b66373cd0c69c83bf339dbdb)
+
+Eric McCormack (1):
+
+* fix: accept server version with more than 3 parts [PR#741](https://github.com/pgjdbc/pgjdbc/pull/741) [8437f6c1](https://github.com/pgjdbc/pgjdbc/commit/8437f6c1c76c3560331d75c4332ab50959d57228)
+
+Jordan Lewis (1):
+
+* feat: do not use pg_depend against PostgreSQL 9.0+ [PR#689](https://github.com/pgjdbc/pgjdbc/pull/689) [62e25fba](https://github.com/pgjdbc/pgjdbc/commit/62e25fba70002d7639472c5a1dcd9d1de5b7f872)
+
+Jorge Solorzano (22):
+
+* refactor: remove support for postgresql < 8.2 [PR#661](https://github.com/pgjdbc/pgjdbc/pull/661) [14e64be7](https://github.com/pgjdbc/pgjdbc/commit/14e64be7dc43feaef210e82fcd9b6089e54e5e4f)
+* fix: add query to support postgresql 8.2 without t.typarray [PR#699](https://github.com/pgjdbc/pgjdbc/pull/699) [cb3995b5](https://github.com/pgjdbc/pgjdbc/commit/cb3995b5a0311a2f5f7737fdfe83457680305efb)
+* test: add CI tests against PostgreSQL 8.3 [PR#710](https://github.com/pgjdbc/pgjdbc/pull/710) [436365b0](https://github.com/pgjdbc/pgjdbc/commit/436365b095d0a276b876433fd00d9bbac72708cc)
+* fix: robust castToBoolean for setObject in PreparedStatement [PR#714](https://github.com/pgjdbc/pgjdbc/pull/714) [edc2a14a](https://github.com/pgjdbc/pgjdbc/commit/edc2a14af8837911a48bb322363bb8b70d2b173d)
+* refactor: remove unused V2ReplicationProtocol.java [PR#718](https://github.com/pgjdbc/pgjdbc/pull/718) [7881e41e](https://github.com/pgjdbc/pgjdbc/commit/7881e41ea93f3bd6a3f58e85cb4329f77b667db0)
+* test: ignore tests that don't apply to Pg8.2 and Pg8.3 [PR#703](https://github.com/pgjdbc/pgjdbc/pull/703) [3bc0951e](https://github.com/pgjdbc/pgjdbc/commit/3bc0951e84ad3b7af746e2dece04b4ea816605e2)
+* style: reorder checkstyle in travis [PR#721](https://github.com/pgjdbc/pgjdbc/pull/721) [ba812fb4](https://github.com/pgjdbc/pgjdbc/commit/ba812fb404852b73a304f7ccb068a2030b8604b3)
+* refactor: remove charset property not used [PR#709](https://github.com/pgjdbc/pgjdbc/pull/709) [f6fd5a5a](https://github.com/pgjdbc/pgjdbc/commit/f6fd5a5abea1efe9b987825b7874ffd962772197)
+* fix: huntbugs on PgDatabaseMetaData, String concatenation in a loop [PR#693](https://github.com/pgjdbc/pgjdbc/pull/693) [3a00ef94](https://github.com/pgjdbc/pgjdbc/commit/3a00ef9436c6b04c472330802a8adb22adaa9b63)
+* refactor: fix getDriverVersion, getDriverName and getJDBCMajor/MinorVersion methods [PR#668](https://github.com/pgjdbc/pgjdbc/pull/668) [aa974341](https://github.com/pgjdbc/pgjdbc/commit/aa9743417f18a10a1a7c7a4bc25ad2862155ddc8)
+* docs: reword supported versions, include datasources section, compare versions [PR#673](https://github.com/pgjdbc/pgjdbc/pull/673) [b2cdd057](https://github.com/pgjdbc/pgjdbc/commit/b2cdd057664a00928d97290ed7435fcf57f3a360)
+* test: fix test replication on PG_HEAD [PR#734](https://github.com/pgjdbc/pgjdbc/pull/734) [3b406a18](https://github.com/pgjdbc/pgjdbc/commit/3b406a18a7c1751aa477e8378ee8cad0a60efd1e)
+* refactor: deprecated PGPoolingDataSource [PR#739](https://github.com/pgjdbc/pgjdbc/pull/739) [55e2cd16](https://github.com/pgjdbc/pgjdbc/commit/55e2cd16cc7e30b1370e777d71556aa625bace9f)
+* fix: strict handling of getBoolean and setObject with postgres accepted values [PR#732](https://github.com/pgjdbc/pgjdbc/pull/732) [4942f7d1](https://github.com/pgjdbc/pgjdbc/commit/4942f7d1cc812feeeca331878334a3d4058615e4)
+* docs: move docs from www/documentation/head [PR#744](https://github.com/pgjdbc/pgjdbc/pull/744) [70e23c45](https://github.com/pgjdbc/pgjdbc/commit/70e23c45c904ebded42ab1b5efc10d66f34ab68c)
+* test: fix replication test in Pg10 [PR#746](https://github.com/pgjdbc/pgjdbc/pull/746) [63ed2129](https://github.com/pgjdbc/pgjdbc/commit/63ed2129f7aa4375d009f19c64dc2404e725aabb)
+* feat: use java.util.logging [PR#722](https://github.com/pgjdbc/pgjdbc/pull/722) [43e6505e](https://github.com/pgjdbc/pgjdbc/commit/43e6505e3aa16e6acdf08f02f2dd1e3cf131ac3e)
+* perf: short circuit Oid.BOOL in getBoolean [PR#745](https://github.com/pgjdbc/pgjdbc/pull/745) [e69e4a1d](https://github.com/pgjdbc/pgjdbc/commit/e69e4a1d5502319bc810e0e4529611ba52ea386c)
+* fix: add isLoggable around parameterized logger [PR#752](https://github.com/pgjdbc/pgjdbc/pull/752) [8b50cfe5](https://github.com/pgjdbc/pgjdbc/commit/8b50cfe58c47d19adc0c241488a24037f4a4416f)
+* docs: move www repository to pgjdbc/docs [d4e99198](https://github.com/pgjdbc/pgjdbc/commit/d4e99198336bf41fc7f3fe9c0746036d5477601c)
+* add syntax highlight to documentation [8c035ade](https://github.com/pgjdbc/pgjdbc/commit/8c035adeb820c8a19e372f0b76a70e511b657cad)
+* add more style [9c510e65](https://github.com/pgjdbc/pgjdbc/commit/9c510e65f573354a47b7e94553870231e8dc2935)
+
+Pavel Raiskup (3):
+
+* fix: sync with latest Fedora [PR#637](https://github.com/pgjdbc/pgjdbc/pull/637) [a29ad80b](https://github.com/pgjdbc/pgjdbc/commit/a29ad80bcfdd65d11257f6339eb6bf2512612eed)
+* packaging: rpm: update srpm generator [5c3c9239](https://github.com/pgjdbc/pgjdbc/commit/5c3c92392d66608ed7d9d1f96eb5b380e2667cd9)
+* packaging: rpm_ci: use curl -L to download rawhide logs [c8125cff](https://github.com/pgjdbc/pgjdbc/commit/c8125cff3ae719675983185d49cd49e6c028d7b7)
+
+Philippe Marschall (3):
+
+* refactor: clean up PgDatabaseMetaData [PR#692](https://github.com/pgjdbc/pgjdbc/pull/692) [d32b077e](https://github.com/pgjdbc/pgjdbc/commit/d32b077e20b2afae9c4c80f704f7c8a26a8b8e11)
+* refactor: delete Keyword enum [PR#697](https://github.com/pgjdbc/pgjdbc/pull/697) [677e3c4c](https://github.com/pgjdbc/pgjdbc/commit/677e3c4cf2533ce283a2d444cee6da8a94a4ca82)
+* feat: support microsecond resolution for JSR-310 types [PR#691](https://github.com/pgjdbc/pgjdbc/pull/691) [6b3a1efb](https://github.com/pgjdbc/pgjdbc/commit/6b3a1efb36709e570caf0dc71a42a53e89f5a5e0)
+
+Roman Ivanov (2):
+
+* config: move version of checkstyle to property [PR#723](https://github.com/pgjdbc/pgjdbc/pull/723) [9ef7d6f1](https://github.com/pgjdbc/pgjdbc/commit/9ef7d6f1f274a75a14b380c57f4c140b47b25888)
+* chore: upgrade checkstyle to 7.4, make checkstyle version configurable via property [PR#725](https://github.com/pgjdbc/pgjdbc/pull/725) [e1a25782](https://github.com/pgjdbc/pgjdbc/commit/e1a2578247684667a51bc34ee53449e4457755df)
+
+Steve Ungerer (1):
+
+* fix: ensure executeBatch() does not use server-side prepared statements when prepareThreshold=0 [PR#690](https://github.com/pgjdbc/pgjdbc/pull/690) [aca26a07](https://github.com/pgjdbc/pgjdbc/commit/aca26a07026e9b289a209799ab28131a33b296dd)
+
+Trygve Laugstøl (1):
+
+* feat: connect the socket only if the socket factory created an unconnected socket [PR#587](https://github.com/pgjdbc/pgjdbc/pull/587) [f75572be](https://github.com/pgjdbc/pgjdbc/commit/f75572beb8b59a7a73f6e1d12d692b483dc04c85)
+
+Vladimir Gordiychuk (4):
+
+* bug: fix not enscaped special symbol that fail build [PR#686](https://github.com/pgjdbc/pgjdbc/pull/686) [b4604cd7](https://github.com/pgjdbc/pgjdbc/commit/b4604cd7de0c297c8b56608642055ed6eb3645e0)
+* feat: add replication protocol API [PR#550](https://github.com/pgjdbc/pgjdbc/pull/550) [f48c6bb7](https://github.com/pgjdbc/pgjdbc/commit/f48c6bb7e726479bbf4be4ef95e4c138db5cac96)
+* test: fix drop replication slot on 9.4 for tests [PR#696](https://github.com/pgjdbc/pgjdbc/pull/696) [c1c48bd7](https://github.com/pgjdbc/pgjdbc/commit/c1c48bd705f04e8d1b1cb8b998dda0a6893f891d)
+* chore: Gather backtrace from core dump on CI [PR#736](https://github.com/pgjdbc/pgjdbc/pull/736) [da5e4ef1](https://github.com/pgjdbc/pgjdbc/commit/da5e4ef1cbc4a5c9f41e9aee8d183560ba679541)
+
+Vladimir Sitnikov (12):
+
+* fedora: add BuildRequires: classloader-leak-test-framework [64b6750c](https://github.com/pgjdbc/pgjdbc/commit/64b6750cbd49ca8a9f0596bed1876132b64c34d4)
+* tests: remove Class.forName(..driver..) from test code [c99507b5](https://github.com/pgjdbc/pgjdbc/commit/c99507b5661804b5b1b2340ba747fe553dc37a68)
+* test: add CI tests against PostgreSQL 8.2 [PR#659](https://github.com/pgjdbc/pgjdbc/pull/659) [63ee60e2](https://github.com/pgjdbc/pgjdbc/commit/63ee60e2ad93441ff55dab08213cc09815b614e0)
+* feat: display error position when SQL has unterminated literals, comments, etc [PR#688](https://github.com/pgjdbc/pgjdbc/pull/688) [8a95d991](https://github.com/pgjdbc/pgjdbc/commit/8a95d991e2032cf0406be8e54e70cfafaad794b5)
+* feat: add support for PreparedStatement.setCharacterStream(int, Reader) [PR#671](https://github.com/pgjdbc/pgjdbc/pull/671) [ee4c4265](https://github.com/pgjdbc/pgjdbc/commit/ee4c4265aebc1c73a1d1fabac5ba259d1fbfd1e4)
+* chore: update next version to 42.0.0-SNAPSHOT [46634923](https://github.com/pgjdbc/pgjdbc/commit/466349236622c6b03bb9cd8d7f517c3ce0586751)
+* refactor: add CallableQueryKey#equals override [401c51a1](https://github.com/pgjdbc/pgjdbc/commit/401c51a15d80d2f24cddbe5cd4b2ca7509a0a765)
+* doc: correct wording in readme regarding PostgreSQL versions used in pgjdbc regression testing [60391d75](https://github.com/pgjdbc/pgjdbc/commit/60391d7559d6ee4e579ec2e36d7aa8199a99189d)
+* fix: revert ExpressionProperties to Properties in BaseDataSource [989b4d23](https://github.com/pgjdbc/pgjdbc/commit/989b4d235ec6776f31284d15618195cf7f8a7a79)
+* fix: correct edge cases for setCharacterStream(int, Reader) [f1190d8c](https://github.com/pgjdbc/pgjdbc/commit/f1190d8c2eb1c506616e2298aabad211ba3bdb0a)
+* test: add SharedTimerClassLoaderLeakTest to the regular test suite [b3553276](https://github.com/pgjdbc/pgjdbc/commit/b3553276ad48cbb47cd4849d3a08b7ee61be8ace)
+* refactor: wrap more log statements with isLoggable check [07d225ec](https://github.com/pgjdbc/pgjdbc/commit/07d225ec1028d945533d5023702b3865aee54ad6)
+
+bd-infor (1):
+
+* docs: clarify handling of loglevel [PR#711](https://github.com/pgjdbc/pgjdbc/pull/711) [6334bac0](https://github.com/pgjdbc/pgjdbc/commit/6334bac036efaa4a9f2a445f1cbdcc310f4c6263)
+
+<a name="contributors_{{ page.version }}"></a>
+### Contributors to this release
+
+We thank the following people for their contributions to this release.
+
+[AlexElin](https://github.com/AlexElin)
+[bd-infor](https://github.com/bd-infor)
+[Eric McCormack](https://github.com/ericmack)
+[Jordan Lewis](https://github.com/jordanlewis)
+[Jorge Solorzano](https://github.com/jorsol)
+[Pavel Raiskup](https://github.com/praiskup)
+[Philippe Marschall](https://github.com/marschall)
+[Roman Ivanov](https://github.com/romani)
+[Steve Ungerer](https://github.com/scubasau)
+[Trygve Laugstøl](https://github.com/trygvis)
+[Vladimir Gordiychuk](https://github.com/Gordiychuk)
+[Vladimir Sitnikov](https://github.com/vlsi)
diff --git a/docs/_posts/2017-05-04-42.1.0-release.md b/docs/_posts/2017-05-04-42.1.0-release.md
new file mode 100644
index 0000000..08f4a8d
--- /dev/null
+++ b/docs/_posts/2017-05-04-42.1.0-release.md
@@ -0,0 +1,97 @@
+---
+title: "PostgreSQL JDBC Driver 42.1.0 Released"
+date: 2017-05-04 00:00:00 +0300
+categories:
+ - new_release
+version: 42.1.0
+---
+**Notable changes**
+
+### Added
+- Support fetching a REF_CURSOR using getObject [PR 809](https://github.com/pgjdbc/pgjdbc/pull/809)
+
+### Fixed
+- Fix data being truncated in setCharacterStream (bug introduced in 42.0.0) [PR 802](https://github.com/pgjdbc/pgjdbc/pull/802)
+- Fix calculation of lastReceiveLSN for logical replication [PR 801](https://github.com/pgjdbc/pgjdbc/pull/801)
+- Make sure org.postgresql.Driver is loaded when accessing though DataSource interface [Issue 768](https://github.com/pgjdbc/pgjdbc/issues/768)
+
+### Regressions
+- There's no 42.1.0.jre6 version due to infinity handling bug. Fixed in 42.1.1.jre6
+
+<!--more-->
+
+**Commits by author**
+
+Alexander Kjäll (1):
+
+* documentation typo [PR#818](https://github.com/pgjdbc/pgjdbc/pull/818) [90f5556f](https://github.com/pgjdbc/pgjdbc/commit/90f5556fd3de2395971496fc4b0b4cacd5d5d562)
+
+Daniel Migowski (1):
+
+* feat: improve waiting for notifications by providing a timeout option [PR#778](https://github.com/pgjdbc/pgjdbc/pull/778) [a7e0c83b](https://github.com/pgjdbc/pgjdbc/commit/a7e0c83be93600c6299ae99907942e2530cb5e30)
+
+Dave Cramer (4):
+
+* Update index.html [4d8b1b38](https://github.com/pgjdbc/pgjdbc/commit/4d8b1b381d8e2ae4ca19c2d84a195412bfc472ee)
+* Review the documentation for the replication API [PR#756](https://github.com/pgjdbc/pgjdbc/pull/756) [3e1eb34d](https://github.com/pgjdbc/pgjdbc/commit/3e1eb34d2500eae9fdf4938ebbced4cff886edef)
+* fix callproc escape documentation the specification [PR#785](https://github.com/pgjdbc/pgjdbc/pull/785) [95a3f41d](https://github.com/pgjdbc/pgjdbc/commit/95a3f41d6c0debbc6658312c484c6709e3da2225)
+* Honour setLogStream. If the logStream is set [PR#780](https://github.com/pgjdbc/pgjdbc/pull/780) [b97ad630](https://github.com/pgjdbc/pgjdbc/commit/b97ad63089a9042cfef0ce97d1eaacce0fe47d4e)
+
+Jacques Fuentes (1):
+
+* Make replication docs use PREFER_QUERY_MODE [PR#761](https://github.com/pgjdbc/pgjdbc/pull/761) [bd0497de](https://github.com/pgjdbc/pgjdbc/commit/bd0497dee741e92de1cc3eeabb58a82608ed6070)
+
+James (1):
+
+* fix: use SQLWarning(String reason) constructor for correct DriverManager [PR#751](https://github.com/pgjdbc/pgjdbc/pull/751) [74a426b9](https://github.com/pgjdbc/pgjdbc/commit/74a426b929f47a3f585dd6e535300d2ffe77a9da)
+
+Joe Kutner (1):
+
+* fix: Only resolve hostname if not using a SOCKS proxy [PR#774](https://github.com/pgjdbc/pgjdbc/pull/774) [480b0cf1](https://github.com/pgjdbc/pgjdbc/commit/480b0cf1ffe266e41e259f1f7a016d3ea681cc3a)
+
+Jorge Solorzano (3):
+
+* fix: build site with jekyll 2.2.0 [PR#755](https://github.com/pgjdbc/pgjdbc/pull/755) [773ee679](https://github.com/pgjdbc/pgjdbc/commit/773ee679ae61ae48fed56c915bf4e19576cbb292)
+* test: check that new properties follow correct lower camel case [PR#740](https://github.com/pgjdbc/pgjdbc/pull/740) [3f2a02e1](https://github.com/pgjdbc/pgjdbc/commit/3f2a02e128367df6ae47b6f850203200cef223fe)
+* refactor: simplify Encoding class [PR#765](https://github.com/pgjdbc/pgjdbc/pull/765) [ef8c6f96](https://github.com/pgjdbc/pgjdbc/commit/ef8c6f9651f54a220f7231a2bc5b8ad0ca08d0c7)
+
+Philippe Marschall (1):
+
+* feat: support fetching a REF_CURSOR using getObject [PR#809](https://github.com/pgjdbc/pgjdbc/pull/809) [4ab5ccb7](https://github.com/pgjdbc/pgjdbc/commit/4ab5ccb7a299cfcec8a5b1cddf612d3f828fa157)
+
+Robert Zenz (1):
+
+* fix: function calls without parameters do not require parentheses [2958cc22](https://github.com/pgjdbc/pgjdbc/commit/2958cc22a6a00609bfbb6eb17d4e401dfe433123)
+
+Vladimir Gordiychuk (2):
+
+* chore: fix false alarm on check coredump [PR#806](https://github.com/pgjdbc/pgjdbc/pull/806) [3883a846](https://github.com/pgjdbc/pgjdbc/commit/3883a846febfe92582be2785737da9460ece1176)
+* bug: fix calculation of lastReceiveLSN for logical replication [PR#801](https://github.com/pgjdbc/pgjdbc/pull/801) [170d9c27](https://github.com/pgjdbc/pgjdbc/commit/170d9c27810349456e56aff1c36a0ad6584b9e28)
+
+Vladimir Sitnikov (3):
+
+* fix: make sure org.postgresql.Driver is loaded when accessing though DataSource interface [PR#768](https://github.com/pgjdbc/pgjdbc/pull/768) [9c80adc2](https://github.com/pgjdbc/pgjdbc/commit/9c80adc24776ae02e0aff419e1cddf26a28eeff0)
+* refactor: add encoding, fix expected/actual, use proper constructor [77cace40](https://github.com/pgjdbc/pgjdbc/commit/77cace40a4ce33fadafcb5f144b5238bff2854a3)
+* fix: infinity handling for java.time types [PR#789](https://github.com/pgjdbc/pgjdbc/pull/789) [f375701b](https://github.com/pgjdbc/pgjdbc/commit/f375701b571c308b7e389df49c1d958f416e4340)
+
+slmsbrhgn (1):
+
+* bug: fix data being truncated in setCharacterStream (the bug introduced in 42.0.0) [PR#802](https://github.com/pgjdbc/pgjdbc/pull/802) [28c98418](https://github.com/pgjdbc/pgjdbc/commit/28c98418b576394b7a0a4a6415ae86ba47be40ae)
+
+<a name="contributors_{{ page.version }}"></a>
+### Contributors to this release
+
+We thank the following people for their contributions to this release.
+
+[Alexander Kjäll](https://github.com/alexanderkjall)
+[Daniel Migowski](https://github.com/dmigowski)
+[Dave Cramer](davec at postgresintl.com)
+[Jacques Fuentes](https://github.com/jpfuentes2)
+[James](https://github.com/jamesthomp)
+[Joe Kutner](https://github.com/jkutner)
+[Jorge Solorzano](https://github.com/jorsol)
+[Philippe Marschall](https://github.com/marschall)
+[Robert Zenz](https://github.com/RobertZenz)
+[Vladimir Gordiychuk](https://github.com/Gordiychuk)
+[Vladimir Sitnikov](https://github.com/vlsi)
+[slmsbrhgn](https://github.com/slmsbrhgn)
diff --git a/docs/_posts/2017-05-05-42.1.1-release.md b/docs/_posts/2017-05-05-42.1.1-release.md
new file mode 100644
index 0000000..36c0ec7
--- /dev/null
+++ b/docs/_posts/2017-05-05-42.1.1-release.md
@@ -0,0 +1,27 @@
+---
+title: "PostgreSQL JDBC Driver 42.1.1 Released"
+date: 2017-05-05 00:00:00 +0300
+categories:
+ - new_release
+version: 42.1.1
+---
+**Notable changes**
+
+### Fixed
+- Fix infinite dates that might be corrupted when transferred in binary for certain JREs. For instance, 5881610-07-11 instead of infinity. [1e5bf563](https://github.com/pgjdbc/pgjdbc/commit/1e5bf563f41203417281117ed20b183cd295b4e0)
+
+<!--more-->
+
+**Commits by author**
+
+Vladimir Sitnikov (2):
+
+* fix: infinite dates might be corrupted when transferred in binary for certain JREs [1e5bf563](https://github.com/pgjdbc/pgjdbc/commit/1e5bf563f41203417281117ed20b183cd295b4e0)
+* chore: print "include notable changes" to the generated changelog [6bc4fe07](https://github.com/pgjdbc/pgjdbc/commit/6bc4fe0758510243d1f3cb56b0b1ae374117f7e4)
+
+<a name="contributors_{{ page.version }}"></a>
+### Contributors to this release
+
+We thank the following people for their contributions to this release.
+
+[Vladimir Sitnikov](https://github.com/vlsi)
diff --git a/docs/_posts/2017-07-12-42.1.2-release.md b/docs/_posts/2017-07-12-42.1.2-release.md
new file mode 100644
index 0000000..914686b
--- /dev/null
+++ b/docs/_posts/2017-07-12-42.1.2-release.md
@@ -0,0 +1,73 @@
+---
+title: PostgreSQL JDBC Driver 42.1.2 Released
+date: 2017-07-12 18:11:06 +0300
+categories:
+ - new_release
+version: 42.1.2
+---
+**Notable changes**
+
+### Changed
+- Better logic for *returning* keyword detection. Previously, pgjdbc could be defeated by column names that contain *returning*, so pgjdbc failed to "return generated keys" as it considered statement as already having *returning* keyword [PR 824](https://github.com/pgjdbc/pgjdbc/pull/824) [201daf1d](https://github.com/pgjdbc/pgjdbc/commit/201daf1dc916bbc35e2bbec961aebfd1b1e30bfc)
+- Use server-prepared statements for batch inserts when prepareThreshold>0. Note: this enables batch to use server-prepared from the first *executeBatch()* execution (previously it waited for *prepareThreshold* *executeBatch()* calls) [abc3d9d7](https://github.com/pgjdbc/pgjdbc/commit/abc3d9d7f34a001322fbbe53f25d5e77a33a667f)
+
+### Fixed
+- Replication API: fix issue in #834 setting statusIntervalUpdate causes high CPU load. [PR 835](https://github.com/pgjdbc/pgjdbc/pull/835) [59236b74](https://github.com/pgjdbc/pgjdbc/commit/59236b74acdd400d9d91d3eb2bb07d70b15392e5)
+
+### Regressions
+- NPE in PreparedStatement.executeBatch in case of empty batch. Fixed in 42.1.3
+
+<!--more-->
+
+**Commits by author**
+
+AlexElin (1):
+
+* refactor: make PSQLState as enum [PR#837](https://github.com/pgjdbc/pgjdbc/pull/837) [fb5df7fe](https://github.com/pgjdbc/pgjdbc/commit/fb5df7fee1d3568356e680c6ac5a62336ec7bf6e)
+
+Dave Cramer (8):
+
+* Initial support of partitioned tables via JDBC metadata API [PR#823](https://github.com/pgjdbc/pgjdbc/pull/823) [9c3471f2](https://github.com/pgjdbc/pgjdbc/commit/9c3471f21f6ac9cf1a5e5700115ac7d0d55e0ad9)
+* fix javadoc complaints and some small edits to replication comments [PR#832](https://github.com/pgjdbc/pgjdbc/pull/832) [2d0bfceb](https://github.com/pgjdbc/pgjdbc/commit/2d0bfcebb0641ddb73d9297e6211f75537238b15)
+* fix issue #834 setting statusIntervalUpdate causes high CPU load \ [PR#835](https://github.com/pgjdbc/pgjdbc/pull/835) [59236b74](https://github.com/pgjdbc/pgjdbc/commit/59236b74acdd400d9d91d3eb2bb07d70b15392e5)
+* fix issue #838 make sure we don't get columns that are dropped [PR#840](https://github.com/pgjdbc/pgjdbc/pull/840) [464a2d43](https://github.com/pgjdbc/pgjdbc/commit/464a2d43519004174f1b530a595ee0ad9ffda870)
+* add missing connection documentation, fix spelling [PR#846](https://github.com/pgjdbc/pgjdbc/pull/846) [cd400f6f](https://github.com/pgjdbc/pgjdbc/commit/cd400f6f39d3c062fc94fa97b33b4d272a829a24)
+* more spelling mistakes for preferQueryMode [PR#850](https://github.com/pgjdbc/pgjdbc/pull/850) [73bc3c1b](https://github.com/pgjdbc/pgjdbc/commit/73bc3c1b7acda676f366631ff7e28f09a3399f37)
+* fix formatting of section on failover, still not perfect but better [PR#852](https://github.com/pgjdbc/pgjdbc/pull/852) [9f722014](https://github.com/pgjdbc/pgjdbc/commit/9f72201458d1ce0837e9525d947dcea2828b9475)
+* small reformat to clarify read and write connections [PR#854](https://github.com/pgjdbc/pgjdbc/pull/854) [551d71b6](https://github.com/pgjdbc/pgjdbc/commit/551d71b6a513c223d8d8d8d75afbe8b5d42ce783)
+
+Jorge Solorzano (3):
+
+* test: yet another rename to use "lsn" not "location" in Pg10. [PR#822](https://github.com/pgjdbc/pgjdbc/pull/822) [90228621](https://github.com/pgjdbc/pgjdbc/commit/902286212df19b1eda9310c4174756786ad249c7)
+* use zulu-9 [PR#828](https://github.com/pgjdbc/pgjdbc/pull/828) [4ac74886](https://github.com/pgjdbc/pgjdbc/commit/4ac74886e54e7689035be00c417a536717a45318)
+* fix: remove type name from cast exception of getBoolean and setObject [PR#781](https://github.com/pgjdbc/pgjdbc/pull/781) [394b3a2f](https://github.com/pgjdbc/pgjdbc/commit/394b3a2f4d93e9ca701d8c31b4b66fa25fca8945)
+
+Robert 'Bobby' Zenz (1):
+
+* fix: Add fallback to setObject(int, Object) for Number [PR#812](https://github.com/pgjdbc/pgjdbc/pull/812) [5b9edb7d](https://github.com/pgjdbc/pgjdbc/commit/5b9edb7dfb1b281bffedf7c9f2583f2df354c0ea)
+
+Vladimir Gordiychuk (1):
+
+* bug: floating logical replcation test [PR#829](https://github.com/pgjdbc/pgjdbc/pull/829) [2d3e8972](https://github.com/pgjdbc/pgjdbc/commit/2d3e8972a0b34106a8b7426619cabf852c38ddaa)
+
+Vladimir Sitnikov (7):
+
+* chore: implement a script to stage pgjdbc, pgdjbc-jre7, pgjdbc-jre6 artifacts [15d78839](https://github.com/pgjdbc/pgjdbc/commit/15d7883987d2de4b662aa8cd81c6de5be0257153)
+* doc: fix 42.1.0.jre8->jre6 typo [PR#42](https://github.com/pgjdbc/pgjdbc/pull/42) [88942b58](https://github.com/pgjdbc/pgjdbc/commit/88942b58637afbea16102a6a77d922914fd27562)
+* fix: use server-prepared statements for batch inserts when prepareThreshold>0 [abc3d9d7](https://github.com/pgjdbc/pgjdbc/commit/abc3d9d7f34a001322fbbe53f25d5e77a33a667f)
+* fix: better parsing for returning keyword [PR#824](https://github.com/pgjdbc/pgjdbc/pull/824) [201daf1d](https://github.com/pgjdbc/pgjdbc/commit/201daf1dc916bbc35e2bbec961aebfd1b1e30bfc)
+* docs: build index, changelog pages from _posts/... to reduce release overhead [d6fe07d7](https://github.com/pgjdbc/pgjdbc/commit/d6fe07d7bb613d7b8fb06ace64b9b37d3f23bbfe)
+* chore: make ./release_notes.sh create docs/_posts/$DATE_YMD-$VERS-release.md file [e00d4571](https://github.com/pgjdbc/pgjdbc/commit/e00d4571bb6ca24c8f93956b59fd1c9a14131394)
+* docs: add 42.1.2 release notes [6f127a61](https://github.com/pgjdbc/pgjdbc/commit/6f127a61eed5317133ea80f0a06f9441b170a17a)
+
+<a name="contributors_{{ page.version }}"></a>
+### Contributors to this release
+
+We thank the following people for their contributions to this release.
+
+[AlexElin](https://github.com/AlexElin)
+[Dave Cramer](davec at postgresintl.com)
+[Jorge Solorzano](https://github.com/jorsol)
+[Robert 'Bobby' Zenz](https://github.com/RobertZenz)
+[Vladimir Gordiychuk](https://github.com/Gordiychuk)
+[Vladimir Sitnikov](https://github.com/vlsi)
diff --git a/docs/_posts/2017-07-14-42.1.3-release.md b/docs/_posts/2017-07-14-42.1.3-release.md
new file mode 100644
index 0000000..f1de1f0
--- /dev/null
+++ b/docs/_posts/2017-07-14-42.1.3-release.md
@@ -0,0 +1,27 @@
+---
+title: PostgreSQL JDBC Driver 42.1.3 Released
+date: 2017-07-14 10:49:13 +0300
+categories:
+ - new_release
+version: 42.1.3
+---
+**Notable changes**
+
+### Fixed
+- Fix NPE in PreparedStatement.executeBatch in case of empty batch (regression since 42.1.2). [PR 867](https://github.com/pgjdbc/pgjdbc/pull/867)
+
+<!--more-->
+
+**Commits by author**
+
+Vladimir Sitnikov (2):
+
+* doc: ensure changelog uses %Y-%m-%d format, not %Y-%d-%m [5d585aac](https://github.com/pgjdbc/pgjdbc/commit/5d585aac7e4f916d4b54dccd11c778143a1f7725)
+* fix: NPE in PreparedStatement.executeBatch in case of empty batch [PR#867](https://github.com/pgjdbc/pgjdbc/pull/867) [7514552d](https://github.com/pgjdbc/pgjdbc/commit/7514552d2d105cb8e637e70c8e14ab7e36000ed4)
+
+<a name="contributors_{{ page.version }}"></a>
+### Contributors to this release
+
+We thank the following people for their contributions to this release.
+
+[Vladimir Sitnikov](https://github.com/vlsi)
diff --git a/docs/_posts/2017-08-01-42.1.4-release.md b/docs/_posts/2017-08-01-42.1.4-release.md
new file mode 100644
index 0000000..81309fc
--- /dev/null
+++ b/docs/_posts/2017-08-01-42.1.4-release.md
@@ -0,0 +1,54 @@
+---
+title: PostgreSQL JDBC Driver 42.1.4 Released
+date: 2017-08-01 20:00:00 +0300
+categories:
+ - new_release
+version: 42.1.4
+---
+**Notable changes**
+
+### Changed
+- Statements with non-zero fetchSize no longer require server-side named handle. This might cause issues when using old PostgreSQL versions (pre-8.4)+fetchSize+interleaved ResultSet processing combo. [Issue 869](https://github.com/pgjdbc/pgjdbc/issues/869)
+
+<!--more-->
+
+**Commits by author**
+
+AlexElin (4):
+
+* test: migrate tests to JUnit 4 [PR#738](https://github.com/pgjdbc/pgjdbc/pull/738) [5b65e2f4](https://github.com/pgjdbc/pgjdbc/commit/5b65e2f45b1cb130b4380b31ff6c0c73210d9fe0)
+* style: update checkstyle + turn on some rules [PR#847](https://github.com/pgjdbc/pgjdbc/pull/847) [246b759c](https://github.com/pgjdbc/pgjdbc/commit/246b759cdc264c2732717dbd6ff9f8f472024196)
+* test: migrate tests to Junit4 [PR#883](https://github.com/pgjdbc/pgjdbc/pull/883) [5c12da16](https://github.com/pgjdbc/pgjdbc/commit/5c12da16d3aa17d299e942c4a2b3647674422920)
+* refactor: remove useless checks in the tests [0221f930](https://github.com/pgjdbc/pgjdbc/commit/0221f930b35a6f24e539ac4740886fafaebcaeac)
+
+Dave Cramer (2):
+
+* honour PGPORT, PGHOST, PGDBNAME in connection properties [PR#862](https://github.com/pgjdbc/pgjdbc/pull/862) [2951a958](https://github.com/pgjdbc/pgjdbc/commit/2951a9583b8ea1b1b0e933896ff4be95628f834e)
+* doc: fix spelling mistakes [PR#868](https://github.com/pgjdbc/pgjdbc/pull/868) [757db625](https://github.com/pgjdbc/pgjdbc/commit/757db62590f4f7b72cf565680ab79eda7880f2b3)
+
+Michael Glaesemann (4):
+
+* test: assume minimum server version 8.3 testing autosave with ALTER [77ee528d](https://github.com/pgjdbc/pgjdbc/commit/77ee528d021ccdf740b19f9ed48259ece5df7705)
+* test: assume minimum server version 8.3 when testing with uuid [ff2717e4](https://github.com/pgjdbc/pgjdbc/commit/ff2717e42a8c0394e6cde4527ed1f721ffa9fb84)
+* refactor: remove unused import [8afe856e](https://github.com/pgjdbc/pgjdbc/commit/8afe856e5ea22870cf1489ec1fd328efee6b7426)
+* test: assume integer datetimes for timestamp tests [PR#873](https://github.com/pgjdbc/pgjdbc/pull/873) [8287e7f9](https://github.com/pgjdbc/pgjdbc/commit/8287e7f92f890a41f8d2b51980157a92e1cd57e8)
+
+Vladimir Sitnikov (7):
+
+* docs: prevent "<!--more-->" from being displayed on the changelog page [e1747693](https://github.com/pgjdbc/pgjdbc/commit/e174769363d12941b8e95d90d0459751351ea4e1)
+* doc: fix anchors for "contributors to this release" [c1d743f2](https://github.com/pgjdbc/pgjdbc/commit/c1d743f2408df8b377bc9d8440717541a5b627e3)
+* test: fix StringTypeParameterTest to skip preferQueryMode=simple [beca1692](https://github.com/pgjdbc/pgjdbc/commit/beca16922b455a6a00c655df8a3b701d008aad6e)
+* chore: install PostgreSQL 9.1 to Trusty builds via apt, and use Precise for Java 6 [e960f237](https://github.com/pgjdbc/pgjdbc/commit/e960f2373a8de8b1b58fa199ee85a8b73ae684d2)
+* test: make StringTypeParameterTest 8.3+ since 8.2 misses enum types [PR#882](https://github.com/pgjdbc/pgjdbc/pull/882) [ed0014cc](https://github.com/pgjdbc/pgjdbc/commit/ed0014cc03cedde76003a84c06a4f7b95b823de0)
+* fix: named statements were used when fetchSize was non-zero and prepareThreshold=0 [PR#870](https://github.com/pgjdbc/pgjdbc/pull/870) [f0deabf7](https://github.com/pgjdbc/pgjdbc/commit/f0deabf7d87bb5bffeb84e9cd686eeb632aa9687)
+* test: skip ConcurrentStatementFetch for PostgreSQL < 8.4 [PR#884](https://github.com/pgjdbc/pgjdbc/pull/884) [5334cb6e](https://github.com/pgjdbc/pgjdbc/commit/5334cb6ef7554bba255f00baf4ff3220f16e31ea)
+
+<a name="contributors_{{ page.version }}"></a>
+### Contributors to this release
+
+We thank the following people for their contributions to this release.
+
+[AlexElin](https://github.com/AlexElin)
+[Dave Cramer](davec at postgresintl.com)
+[Michael Glaesemann](https://github.com/grzm)
+[Vladimir Sitnikov](https://github.com/vlsi)
diff --git a/docs/_posts/2018-01-17-42.2.0-release.md b/docs/_posts/2018-01-17-42.2.0-release.md
new file mode 100644
index 0000000..6b4e7ae
--- /dev/null
+++ b/docs/_posts/2018-01-17-42.2.0-release.md
@@ -0,0 +1,254 @@
+---
+title: PostgreSQL JDBC Driver 42.2.0 Released
+date: 2018-01-17 20:11:10 +0300
+categories:
+ - new_release
+version: 42.2.0
+---
+**Notable changes**
+
+### Known issues
+- SCRAM authentication does not work as scram client classes are not packaged
+- client_encoding has to be UTF8 even with allowEncodingChanges=true
+
+### Added
+- Support SCRAM-SHA-256 for PostgreSQL 10 in the JDBC 4.2 version (Java 8+) using the Ongres SCRAM library. [PR 842](https://github.com/pgjdbc/pgjdbc/pull/842)
+- Make SELECT INTO and CREATE TABLE AS return row counts to the client in their command tags. [Issue 958](https://github.com/pgjdbc/pgjdbc/issues/958) [PR 962](https://github.com/pgjdbc/pgjdbc/pull/962)
+- Support Subject Alternative Names for SSL connections. [PR 952](https://github.com/pgjdbc/pgjdbc/pull/952)
+- Support isAutoIncrement metadata for PostgreSQL 10 IDENTITY column. [PR 1004](https://github.com/pgjdbc/pgjdbc/pull/1004)
+- Support for primitive arrays [PR#887](https://github.com/pgjdbc/pgjdbc/pull/887) [3e0491a](https://github.com/pgjdbc/pgjdbc/commit/3e0491ac3833800721b98e7437635cf6ab338162)
+- Implement support for get/setNetworkTimeout() in connections. [PR 849](https://github.com/pgjdbc/pgjdbc/pull/849)
+- Make GSS JAAS login optional, add an option "jaasLogin" [PR 922](https://github.com/pgjdbc/pgjdbc/pull/922) see [Connecting to the Database](https://jdbc.postgresql.org/documentation/head/connect.html)
+
+### Changed
+- Improve behaviour of ResultSet.getObject(int, Class). [PR 932](https://github.com/pgjdbc/pgjdbc/pull/932)
+- Parse CommandComplete message using a regular expresion, allows complete catch of server returned commands for INSERT, UPDATE, DELETE, SELECT, FETCH, MOVE, COPY and future commands. [PR 962](https://github.com/pgjdbc/pgjdbc/pull/962)
+- Use 'time with timezone' and 'timestamp with timezone' as is and ignore the user provided Calendars, 'time' and 'timestamp' work as earlier except "00:00:00" now maps to 1970-01-01 and "24:00:00" uses the system provided Calendar ignoring the user-provided one [PR 1053](https://github.com/pgjdbc/pgjdbc/pull/1053)
+- Change behaviour of multihost connection. The new behaviour is to try all secondaries first before trying the master [PR 844](https://github.com/pgjdbc/pgjdbc/pull/844).
+- Avoid reflective access to TimeZone.defaultTimeZone in Java 9+ [PR 1002](https://github.com/pgjdbc/pgjdbc/pull/1002) fixes [Issue 986](https://github.com/pgjdbc/pgjdbc/issues/986)
+
+### Fixed
+- Make warnings available as soon as they are received from the server. This is useful for long running queries, where it can be beneficial to know about a warning before the query completes. [PR 857](https://github.com/pgjdbc/pgjdbc/pull/857)
+- Use 00:00:00 and 24:00:00 for LocalTime.MIN/MAX. [PR 992](https://github.com/pgjdbc/pgjdbc/pull/992)
+- Now the DatabaseMetaData.getFunctions() implementation complies with the JDBC docs. [PR 918](https://github.com/pgjdbc/pgjdbc/pull/918)
+- Execute autosave/rollback savepoint via simple queries always to prevent "statement S_xx not exists" when autosaving fixes [Issue #955](https://github.com/pgjdbc/pgjdbc/issues/955)
+- Received resultset tuples, but no field structure for them" when bind failure happens on 5th execution of a statement [Issue 811](https://github.com/pgjdbc/pgjdbc/issues/811)
+
+### Removed
+- Drop support for the (insecure) crypt authentication method. [PR 1026](https://github.com/pgjdbc/pgjdbc/pull/1026)
+
+### Deprecated
+- Reintroduce Driver.getVersion for backward compatibility reasons, mark it as deprecated as application should not rely on it (regression since 42.0.0) [50d5dd3e](https://github.com/pgjdbc/pgjdbc/commit/50d5dd3e708a92602e04d6b4aa0822ad3f110a78)
+- slave and preferSlave values for the targetServerType connection property have been deprecated in favour of secondary and preferSecondary respectively.
+
+<!--more-->
+
+**Commits by author**
+
+AlexElin (9):
+
+* docs: fix header in CONTRIBUTING [PR#902](https://github.com/pgjdbc/pgjdbc/pull/902) [38ff0fe](https://github.com/pgjdbc/pgjdbc/commit/38ff0fe4728addf9a34d6fb0069ce4963aaae7ee)
+* refactor: remove dead code from PGStream, implement Closeable [PR#901](https://github.com/pgjdbc/pgjdbc/pull/901) [acff949](https://github.com/pgjdbc/pgjdbc/commit/acff9495b8745bce30d93d61e77caf81d9748b4b)
+* refactor: replace some usages of assertTrue [PR#957](https://github.com/pgjdbc/pgjdbc/pull/957) [c759a58](https://github.com/pgjdbc/pgjdbc/commit/c759a58313c4344924a311021e1c860580f3e318)
+* refactor: state of PGXAConnection as enum [PR#966](https://github.com/pgjdbc/pgjdbc/pull/966) [7618822](https://github.com/pgjdbc/pgjdbc/commit/76188228ddb412db74959fbe59b5c2d6ef5eddfc)
+* refactor: make PgStream implements Flushable [PR#1008](https://github.com/pgjdbc/pgjdbc/pull/1008) [0c3a2fc](https://github.com/pgjdbc/pgjdbc/commit/0c3a2fc132101f83dbb0990ac2c49c49b9c65ffe)
+* style: add MissingDeprecated into checkstyle [PR#1019](https://github.com/pgjdbc/pgjdbc/pull/1019) [d74386d](https://github.com/pgjdbc/pgjdbc/commit/d74386def0d39f450f5dcfdb21ff6171ba0a89f3)
+* chore: update checkstyle [PR#1025](https://github.com/pgjdbc/pgjdbc/pull/1025) [69e3b8b](https://github.com/pgjdbc/pgjdbc/commit/69e3b8b2ef7fb80ece8df23b55855fa4208e8a00)
+* refactor: simplify methods in ConnectionFactoryImpl [PR#1028](https://github.com/pgjdbc/pgjdbc/pull/1028) [ed27c5b](https://github.com/pgjdbc/pgjdbc/commit/ed27c5b464563448079189b1759ecf05d4726ea0)
+* refactor: replace some usages of initCause [PR#1037](https://github.com/pgjdbc/pgjdbc/pull/1037) [0c29823](https://github.com/pgjdbc/pgjdbc/commit/0c29823ad8eca86e3b8f27bcee5f116d41e367f9)
+
+Álvaro Hernández Tortosa (1):
+
+* Add SCRAM-SHA-256 support [PR#842](https://github.com/pgjdbc/pgjdbc/pull/842) [befea18](https://github.com/pgjdbc/pgjdbc/commit/befea18d153dda7814daef4e036d3f5daf8de1e5)
+
+Barnabas Bodnar (1):
+
+* fix: don't attempt to read a SQLXML more than once [PR#965](https://github.com/pgjdbc/pgjdbc/pull/965) [8f5e245](https://github.com/pgjdbc/pgjdbc/commit/8f5e2454185a929f1bc6ef66813d6681bb38e736)
+
+Brett Okken (1):
+
+* feat: primitive arrays [PR#887](https://github.com/pgjdbc/pgjdbc/pull/887) [3e0491a](https://github.com/pgjdbc/pgjdbc/commit/3e0491ac3833800721b98e7437635cf6ab338162)
+
+Brett Wooldridge (1):
+
+* Fixes #638 Implement support for get/setNetworkTimeout() [PR#849](https://github.com/pgjdbc/pgjdbc/pull/849) [8a30044](https://github.com/pgjdbc/pgjdbc/commit/8a30044d9e97c1038ee4401ae745d37a11f008db)
+
+Chen Huajun (1):
+
+* fix: improve multihost connection for preferSlave case (verify expired hosts before connecting to cached master) [PR#844](https://github.com/pgjdbc/pgjdbc/pull/844) [c6fec34](https://github.com/pgjdbc/pgjdbc/commit/c6fec34661b51cd9cbee157d0c334a3ab29859e8)
+
+Dave Cramer (11):
+
+* Update thread safety status of the driver to reflect reality; that being that the driver is not thread safe [PR#928](https://github.com/pgjdbc/pgjdbc/pull/928) [ad47aba](https://github.com/pgjdbc/pgjdbc/commit/ad47abafa1754f8d0f2126ef1d26aa9b037b49e5)
+* fix: use 00:00:00 and 24:00:00 for LocalTime.MIN/MAX [PR#992](https://github.com/pgjdbc/pgjdbc/pull/992) [f2d8ec5](https://github.com/pgjdbc/pgjdbc/commit/f2d8ec5740aa26c417d666a7afedaaf0fdf62d37)
+* fix: support Subject Alternative Names for SSL connections [PR#952](https://github.com/pgjdbc/pgjdbc/pull/952) [2dcb91e](https://github.com/pgjdbc/pgjdbc/commit/2dcb91ef1fd8f0fe08f107c9c30cdc57d4c44b05)
+* test: Appveyor configuration [PR#1000](https://github.com/pgjdbc/pgjdbc/pull/1000) [059628f](https://github.com/pgjdbc/pgjdbc/commit/059628fcdf2058cfd05cb80eac64799ca26ad0d2)
+* add test for identity, fix isAutoincrement in postgresql 10 fixes #130 [PR#1004](https://github.com/pgjdbc/pgjdbc/pull/1004) [2f6633b](https://github.com/pgjdbc/pgjdbc/commit/2f6633bd9e1e9d7f313ea4dfec37f9671fc07453)
+* elaborate on sslmode options [PR#1054](https://github.com/pgjdbc/pgjdbc/pull/1054) [aa7a420](https://github.com/pgjdbc/pgjdbc/commit/aa7a4202e41bc58c4958e06161c5fd4daa36a7f9)
+* prefer the word secondary over slave [PR#1063](https://github.com/pgjdbc/pgjdbc/pull/1063) [2e8c2b6](https://github.com/pgjdbc/pgjdbc/commit/2e8c2b67e22ddaa38894be4b2578ccd4bf97a27d)
+* Revert "refactor: replace some usages of initCause [PR#1037](https://github.com/pgjdbc/pgjdbc/pull/1037)" (#1064) [e6a1ecc](https://github.com/pgjdbc/pgjdbc/commit/e6a1eccb148c3c59e8cf122e98ad01afc5bb555a)
+* prefer secondary over slave referring to standby or secondary servers [PR#1070](https://github.com/pgjdbc/pgjdbc/pull/1070) [32c53902](https://github.com/pgjdbc/pgjdbc/commit/32c539020db3c940bae9b2a42425b1f23e864c73)
+* first pass at release notes and some fixes to previous notes [PR#1041](https://github.com/pgjdbc/pgjdbc/pull/1041) [a8260f5](https://github.com/pgjdbc/pgjdbc/commit/a8260f5d0e31d00c1b44d2b94f62d86a72e2b2d5)
+* Update 2018-01-16-42.2.0-release.md [b36867f](https://github.com/pgjdbc/pgjdbc/commit/b36867f34719d2af559b60b6f63b2df036798231)
+
+Hugh Cole-Baker (1):
+
+* Make GSS JAAS login optional [PR#922](https://github.com/pgjdbc/pgjdbc/pull/922) [d7f0f27](https://github.com/pgjdbc/pgjdbc/commit/d7f0f271b73adbf0ae22146beea122e014d9f9f2)
+
+Jeff Klukas (1):
+
+* fix: advance lastReceiveLSN on keepalive messages [PR#1038](https://github.com/pgjdbc/pgjdbc/pull/1038) [1be8a9e](https://github.com/pgjdbc/pgjdbc/commit/1be8a9ebafbfbcff118385a61a350745addcaf3d)
+
+Joe Kutner (1):
+
+* fix: Added support for socksNonProxyHosts property [PR#975](https://github.com/pgjdbc/pgjdbc/pull/975) (#985) [9813c68](https://github.com/pgjdbc/pgjdbc/commit/9813c685cae2cbfbc561a6220ba388cef08f34b0)
+
+Jorge Solorzano (13):
+
+* chore: use mainly Trusty in Travis, reorder CI jobs, and jdk tests [PR#939](https://github.com/pgjdbc/pgjdbc/pull/939) [646a868](https://github.com/pgjdbc/pgjdbc/commit/646a868c0bc80def5fa62374e83b71d65fef9a14)
+* fix: ignore replication test until 11.1 to avoid random failures [PR#949](https://github.com/pgjdbc/pgjdbc/pull/949) [ee6443d](https://github.com/pgjdbc/pgjdbc/commit/ee6443db167da735f5a9402d16f31c3ee6d719dc)
+* chore: streamlining jobs [PR#959](https://github.com/pgjdbc/pgjdbc/pull/959) [ed0a398](https://github.com/pgjdbc/pgjdbc/commit/ed0a398edb47d0eea62e7f53723e14d9ed278fbb)
+* docs: move changelog to separate file [PR#956](https://github.com/pgjdbc/pgjdbc/pull/956) [e67e8f9](https://github.com/pgjdbc/pgjdbc/commit/e67e8f9685e6c8235134baedeb790f39de39e77c)
+* docs: improve website front page [PR#968](https://github.com/pgjdbc/pgjdbc/pull/968) [65170f1](https://github.com/pgjdbc/pgjdbc/commit/65170f1690bb571c8dbe0425b205ba8498c8173f)
+* docs: fix test db password in docs [PR#984](https://github.com/pgjdbc/pgjdbc/pull/984) [7df56f8](https://github.com/pgjdbc/pgjdbc/commit/7df56f816770a7129cb56d150c6d556c64632a5c)
+* test: add openj9 to the matrix [PR#974](https://github.com/pgjdbc/pgjdbc/pull/974) [f187645](https://github.com/pgjdbc/pgjdbc/commit/f187645896e9f86a654390581163a7064b611404)
+* chore: remove testing of the latest Java updates [PR#993](https://github.com/pgjdbc/pgjdbc/pull/993) [0d8fde6](https://github.com/pgjdbc/pgjdbc/commit/0d8fde6da6dd28a14e12715a3b01d3787cac7fb8)
+* chore: updates to CHANGELOG.md in release_notes.sh [PR#981](https://github.com/pgjdbc/pgjdbc/pull/981) [bdfc1db](https://github.com/pgjdbc/pgjdbc/commit/bdfc1dbb45315d659a49c1ef7a831ca2d6326be4)
+* test: querymode extendedCacheEverything [PR#1007](https://github.com/pgjdbc/pgjdbc/pull/1007) [f574285](https://github.com/pgjdbc/pgjdbc/commit/f5742853b6d79cc20f718339855904c1384c59cd)
+* fix: first composite query not calling getNativeSql() [PR#1020](https://github.com/pgjdbc/pgjdbc/pull/1020) [2cae5a1](https://github.com/pgjdbc/pgjdbc/commit/2cae5a199c2d08768ea9f784ee3f60cef244c4b0)
+* drop old and unused crypt auth [PR#1026](https://github.com/pgjdbc/pgjdbc/pull/1026) [405f14e](https://github.com/pgjdbc/pgjdbc/commit/405f14eefc9d7e01bfaa1b526f1a6a0bac50d3c4)
+* chore: collect coverage for Java 7 [PR#1030](https://github.com/pgjdbc/pgjdbc/pull/1030) [b629934](https://github.com/pgjdbc/pgjdbc/commit/b6299347e15ea2a40c80de9907ae3f137caa4401)
+
+Magnus (1):
+
+* fix: make warnings available as soon as they are received [PR#857](https://github.com/pgjdbc/pgjdbc/pull/857) [83dd5fe](https://github.com/pgjdbc/pgjdbc/commit/83dd5fea94928b349e05c1417e264797052f2bbe)
+
+Magnus Hagander (1):
+
+* Fix documentation spelling of sslpasswordcallback [PR#1021](https://github.com/pgjdbc/pgjdbc/pull/1021) [8ba5841](https://github.com/pgjdbc/pgjdbc/commit/8ba58418ae10f80530f67f0c8628161011c5a228)
+
+MichaelZg (1):
+
+* fix: trim trailing zeros in timestamp strings returned in binary mode [PR#896](https://github.com/pgjdbc/pgjdbc/pull/896) [d28deff](https://github.com/pgjdbc/pgjdbc/commit/d28deff57684349707d2b2a357048f59b0861bb1)
+
+Michael Glaesemann (1):
+
+* refactor: use TypeInfo getPGArrayType instead of munging type name [PR#913](https://github.com/pgjdbc/pgjdbc/pull/913) [634e157](https://github.com/pgjdbc/pgjdbc/commit/634e157e4cdbc2f78f1a90ac4d9f538f39caf4f9)
+
+Pavel Raiskup (2):
+
+* packaging: rpm_ci: add missing BuildRequires [4e0cdc1](https://github.com/pgjdbc/pgjdbc/commit/4e0cdc13ec659f21a318b05c3a67cac7c75c957e)
+* packaging: rpm_ci: don't shade scram jar into pgjdbc [1fd6c4f](https://github.com/pgjdbc/pgjdbc/commit/1fd6c4fe5ccc93ab7d08bf77bcd5344bc60dd334)
+
+Philippe Marschall (2):
+
+* feat: improve ResultSet#getObject(int, Class) [PR#932](https://github.com/pgjdbc/pgjdbc/pull/932) [fcb28c7](https://github.com/pgjdbc/pgjdbc/commit/fcb28c7c87a18ba6673b7fd3a48f3421410eb942)
+* test: add ubenchmark for UTF-8 decoding [PR#988](https://github.com/pgjdbc/pgjdbc/pull/988) [0d918c3](https://github.com/pgjdbc/pgjdbc/commit/0d918c3b21ba2a368da34bd30668908723dc4d36)
+
+Piyush Sharma (1):
+
+* doc: Added quotes to URL in '@see' tag over org.postgresql.sspi.NTDSAPI#DsMakeSpnW for syntactic correctness [PR#926](https://github.com/pgjdbc/pgjdbc/pull/926) [29f574a](https://github.com/pgjdbc/pgjdbc/commit/29f574a0116ab93eade3c80e2db20573390a6a31)
+
+Sehrope Sarkuni (1):
+
+* feat: parse command complete message via regex [PR#962](https://github.com/pgjdbc/pgjdbc/pull/962) [097db5e](https://github.com/pgjdbc/pgjdbc/commit/097db5e70ae8bf193c736b11603332feadb8d544)
+
+Thach Hoang (2):
+
+* Update ServerVersionTest to actually compare versions [PR#1015](https://github.com/pgjdbc/pgjdbc/pull/1015) [cccd6cd](https://github.com/pgjdbc/pgjdbc/commit/cccd6cde4672de30ac0bbac6621b63e81aae9474)
+* fix: always return Short[] for java.sql.Array.getArray() on smallint[] [PR#1017](https://github.com/pgjdbc/pgjdbc/pull/1017) [279fb43](https://github.com/pgjdbc/pgjdbc/commit/279fb435b392114c45266ecef901bfd59470842a)
+
+Vladimir Sitnikov (23):
+
+* fix: reintroduce Driver.getVersion for backward compatibility reasons [PR#905](https://github.com/pgjdbc/pgjdbc/pull/905) [50d5dd3](https://github.com/pgjdbc/pgjdbc/commit/50d5dd3e708a92602e04d6b4aa0822ad3f110a78)
+* style: make PGReplicationStream, LargeObject implement AutoCloseable for Java 7+ [PR#1016](https://github.com/pgjdbc/pgjdbc/pull/1016) [9f07c9a](https://github.com/pgjdbc/pgjdbc/commit/9f07c9ae2eb0c1ec18455e3a3d66460dd264c790)
+* fix: prevent statement hang in case close() called when query is in progress [PR#1022](https://github.com/pgjdbc/pgjdbc/pull/1022) [04c5dbb](https://github.com/pgjdbc/pgjdbc/commit/04c5dbb5058008a8ddad0194156af9819595c315)
+* fix: synchronize Statement#result field access to make #close() more thread-safe [4139248](https://github.com/pgjdbc/pgjdbc/commit/41392481d5f2c7f89d783a535ade2d3afb565654)
+* fix: avoid reflective access to TimeZone.defaultTimeZone in Java 9+ [PR#1002](https://github.com/pgjdbc/pgjdbc/pull/1002) [fd0eeee](https://github.com/pgjdbc/pgjdbc/commit/fd0eeee8f123b1355b523425a1e11fdd59b057a5)
+* fix: throw TOO_MANY_RESULTS (0100E) instead of "PgResultSet: tuples must be non-null" [0d31d46](https://github.com/pgjdbc/pgjdbc/commit/0d31d46adff4e9772db843195e1638531bc703e0)
+* fix: "Received resultset tuples, but no field structure for them" when bind failure happens on 5th execution of a statement [PR#811](https://github.com/pgjdbc/pgjdbc/pull/811) [082d009](https://github.com/pgjdbc/pgjdbc/commit/082d00941ad5f8abf44a0785a6f086c106b3c746)
+* tests: correct assertion to use proper column [63918eb](https://github.com/pgjdbc/pgjdbc/commit/63918eb9b1211e0115c8b55401e22c7a3f37e534)
+* fix: add type parameter so code is Java 6/7 compatible [1361c52](https://github.com/pgjdbc/pgjdbc/commit/1361c5208d6afc5d54e4df1053c48cdb31df9038)
+* chore: avoid non-blocking IO for stdout to workaround "stdout: write error" in Travis [12bb084](https://github.com/pgjdbc/pgjdbc/commit/12bb084035a13c4fb690df93837b37e85354ebc4)
+* test: run Travis tests with non-default time zone [a3982b4](https://github.com/pgjdbc/pgjdbc/commit/a3982b474dd92cd32c8fb1b7dafbd28c853c4177)
+* fix: execute autosave/rollback savepoint via simple queries always to prevent "statement S_xx not exists" when autosaving [PR#955](https://github.com/pgjdbc/pgjdbc/pull/955) [684a699](https://github.com/pgjdbc/pgjdbc/commit/684a69920e08017c74ab4194d1a77067f544a28b)
+* fix: use 'time with time zone' and 'timestamp with time zone' values as is and avoid computation with user-provided/default Calendars [e8c43f3](https://github.com/pgjdbc/pgjdbc/commit/e8c43f36ab2a6843f37d27e7417a5214f7142084)
+* test: refactor SetObject310Test to use proper assertion messages and use less statements (make it faster) [be06946](https://github.com/pgjdbc/pgjdbc/commit/be06946f8b908536f4d659aaf6fc660bed339f67)
+* refactor: factor out receiveParameterStatus so all the ParameterStatus messages are handled in the same way [a94cfea](https://github.com/pgjdbc/pgjdbc/commit/a94cfeace5d66b4fe8d8fa3b16986baebaec2a11)
+* fix: add Provide-Capability OSGi manifest [PR#1029](https://github.com/pgjdbc/pgjdbc/pull/1029) [236805b](https://github.com/pgjdbc/pgjdbc/commit/236805bcaf0dd1d9df3542c5865a15b24375a01c)
+* chore: update version to 42.2.0-SNAPSHOT to reflect the next release version [e27ee74](https://github.com/pgjdbc/pgjdbc/commit/e27ee740535a4034084d450cddefda2fbcb1b2af)
+* packaging: add missing maven-clean-plugin dependency [a2ed9b5](https://github.com/pgjdbc/pgjdbc/commit/a2ed9b50e304a3437f92b945217c19197226d53f)
+* chore: introduce release via Travis [acb9bdd](https://github.com/pgjdbc/pgjdbc/commit/acb9bddf36a8af6d1dd09857a6a05014c3e8849a)
+* chore: skip CI builds for tags; skip Fedora and extendedCacheEverything jobs when building pull requests [3ba3b63](https://github.com/pgjdbc/pgjdbc/commit/3ba3b6334761909183334a3be3af0aa8dc4798da)
+* fix: avoid NPE from getObject(..., Date.class) and getObject(..., Calendar.class) on null timestamps [PR#1071](https://github.com/pgjdbc/pgjdbc/pull/1071) [eb33c4c](https://github.com/pgjdbc/pgjdbc/commit/eb33c4c8e27d6df6ccd9c0a81eb119edeb069d55)
+* test: add "as" to test queries so they work with PostgreSQL 8.3 [71b3c11](https://github.com/pgjdbc/pgjdbc/commit/71b3c118f6a9e125c06e58faa50bf54b6a8f3400)
+* docs: make pgjdbc's javadocs to inherit base Java documentation [eb406dc](https://github.com/pgjdbc/pgjdbc/commit/eb406dcbee469a8724723f008f7dc5a515457cbe)
+
+Zemian Deng (3):
+
+* refactor: use PGProperty enum instead of text ref for targetServerType, hostRecheckSeconds, loadBalanceHosts [PR#912](https://github.com/pgjdbc/pgjdbc/pull/912) (#915) [b0cfc33](https://github.com/pgjdbc/pgjdbc/commit/b0cfc33483759ed3583b57cd845311d17670524f)
+* fix: correct javadoc on PGResultSetMetaData.getFormat [PR#917](https://github.com/pgjdbc/pgjdbc/pull/917) [cd77693](https://github.com/pgjdbc/pgjdbc/commit/cd77693ca22924479a39b8d925f276879023672a)
+* fix: Correct DatabaseMetaData.getFunctions() implementation [PR#918](https://github.com/pgjdbc/pgjdbc/pull/918) [8884202](https://github.com/pgjdbc/pgjdbc/commit/8884202b9e7785a1eaf67ddcd97f2ba689d0cf19)
+
+bpd0018 (3):
+
+* docs - change load.md to reflect current practice [PR#1058](https://github.com/pgjdbc/pgjdbc/pull/1058) [90535d9](https://github.com/pgjdbc/pgjdbc/commit/90535d9289141c398b2e62f2ee7571617c5aecc3)
+* docs: fix the URL regex [PR#1057](https://github.com/pgjdbc/pgjdbc/pull/1057) [6c5490f](https://github.com/pgjdbc/pgjdbc/commit/6c5490f90da434f37abd0be0f7bbdc38169ec33f)
+* docs: fix no parameter connect string example [PR#1056](https://github.com/pgjdbc/pgjdbc/pull/1056) [bb8a315](https://github.com/pgjdbc/pgjdbc/commit/bb8a31508f3caef7532b87b50c19e092af2ec5f0)
+
+djydewang (1):
+
+* style: disallowing user to use incomplete fully qualified Check names in config file [PR#961](https://github.com/pgjdbc/pgjdbc/pull/961) [3286c8c](https://github.com/pgjdbc/pgjdbc/commit/3286c8caa16efe59307b2713784c348e603ee67d)
+
+eperez (1):
+
+* Someone forgot to get the next column [PR#973](https://github.com/pgjdbc/pgjdbc/pull/973) [15aec6a](https://github.com/pgjdbc/pgjdbc/commit/15aec6a99c5615cdf0c0adaf5fc47b5419c617d4)
+
+mjanczykowski (1):
+
+* feat: add setURL method to BaseDataSource [PR#999](https://github.com/pgjdbc/pgjdbc/pull/999) [2277ffb](https://github.com/pgjdbc/pgjdbc/commit/2277ffb7b65d3cba9ef05be36408e2fdbef00ee7)
+
+rnveach (1):
+
+* style: remove deprecated maxLineLength from LeftCurlyCheck [PR#904](https://github.com/pgjdbc/pgjdbc/pull/904) [5f083d1](https://github.com/pgjdbc/pgjdbc/commit/5f083d118eea30e180500864d70f292b411c19af)
+
+steinarb (1):
+* fix: add Provide-Capability org.osgi.service.jdbc.DataSourceFactory to OSGi manifest [Issue 1029](https://github.com/pgjdbc/pgjdbc/issues/1029)
+
+zapov (1):
+
+* fix: avoid integer overflow when sending large arguments [PR#946](https://github.com/pgjdbc/pgjdbc/pull/946) [266ed61](https://github.com/pgjdbc/pgjdbc/commit/266ed61b30e89c2840b7967a8af7ac8ab86407ff)
+
+<a name="contributors_{{ page.version }}"></a>
+### Contributors to this release
+
+We thank the following people for their contributions to this release.
+
+[AlexElin](https://github.com/AlexElin)
+[Álvaro Hernández Tortosa](https://github.com/ahachete)
+[Barnabas Bodnar](https://github.com/bbodnar)
+[Brett Okken](https://github.com/bokken)
+[Brett Wooldridge](https://github.com/brettwooldridge)
+[Chen Huajun](https://github.com/ChenHuajun)
+[Dave Cramer](davec at postgresintl.com)
+[Hugh Cole-Baker](https://github.com/sigmaris)
+[Jeff Klukas](https://github.com/jklukas)
+[Joe Kutner](https://github.com/jkutner)
+[Jorge Solorzano](https://github.com/jorsol)
+[Magnus](https://github.com/magJ)
+[Magnus Hagander](https://github.com/mhagander)
+[MichaelZg](https://github.com/michaelzg)
+[Michael Glaesemann](https://github.com/grzm)
+[Pavel Raiskup](https://github.com/praiskup)
+[Philippe Marschall](https://github.com/marschall)
+[Piyush Sharma](https://github.com/ps-sp)
+[Sehrope Sarkuni](https://github.com/sehrope)
+[Thach Hoang](https://github.com/thachhoang)
+[Vladimir Sitnikov](https://github.com/vlsi)
+[Zemian Deng](https://github.com/zemian)
+[bpd0018](https://github.com/bpd0018)
+[djydewang](https://github.com/djydewang)
+[eperez](https://github.com/eperez)
+[mjanczykowski](https://github.com/mjanczykowski)
+[rnveach](https://github.com/rnveach)
+[zapov](https://github.com/zapov)
diff --git a/docs/_posts/2018-01-25-42.2.1-release.md b/docs/_posts/2018-01-25-42.2.1-release.md
new file mode 100644
index 0000000..6ef3b38
--- /dev/null
+++ b/docs/_posts/2018-01-25-42.2.1-release.md
@@ -0,0 +1,79 @@
+---
+title: PostgreSQL JDBC Driver 42.2.1 Released
+date: 2018-01-25 19:30:35 +0300
+categories:
+ - new_release
+version: 42.2.1
+---
+**Notable changes**
+
+### Known issues
+- client_encoding has to be UTF8 even with allowEncodingChanges=true
+
+### Changed
+- socksProxyHost is ignored in case it contains empty string [PR 1079](https://github.com/pgjdbc/pgjdbc/pull/1079)
+
+### Fixed
+- Avoid connection failure when `DateStyle` is set to `ISO` (~PgBouncer) [Issue 1080](https://github.com/pgjdbc/pgjdbc/issues/1080)
+- Package scram:client classes, so SCRAM works when using a shaded jar [PR#1091](https://github.com/pgjdbc/pgjdbc/pull/1091) [1a89290e](https://github.com/pgjdbc/pgjdbc/commit/1a89290e110d5863b35e0a2ccf79e4292c1056f8)
+- reWriteBatchedInserts=true causes syntax error with ON CONFLICT [Issue 1045](https://github.com/pgjdbc/pgjdbc/issues/1045) [PR 1082](https://github.com/pgjdbc/pgjdbc/pull/1082)
+- Avoid failure in getPGArrayType when stringType=unspecified [PR 1036](https://github.com/pgjdbc/pgjdbc/pull/1036)
+
+
+<!--more-->
+
+**Commits by author**
+
+AlexElin (1):
+
+* test: check if url is not for PostgreSQL [PR#1077](https://github.com/pgjdbc/pgjdbc/pull/1077) [fe463bce](https://github.com/pgjdbc/pgjdbc/commit/fe463bceb3d6449443bd5e6abf2929516effccff)
+
+Alexander Kjäll (1):
+
+* feat: add support for fetching 'TIMESTAMP(6) WITHOUT TIME ZONE' as LocalDate to getObject() [PR#1083](https://github.com/pgjdbc/pgjdbc/pull/1083) [09af4b23](https://github.com/pgjdbc/pgjdbc/commit/09af4b23ad589e3691314e955c130a8755436e2d)
+
+Dave Cramer (1):
+
+* fix: package scram:client classes, so SCRAM works when using a shaded jar [PR#1091](https://github.com/pgjdbc/pgjdbc/pull/1091) [1a89290e](https://github.com/pgjdbc/pgjdbc/commit/1a89290e110d5863b35e0a2ccf79e4292c1056f8)
+
+Ivan (2):
+
+* chore: remove braces for LeftCurlyCheck checkstyle [PR#1075](https://github.com/pgjdbc/pgjdbc/pull/1075) [c2664b44](https://github.com/pgjdbc/pgjdbc/commit/c2664b444ffa1390d0dd5e4104d4200823d145ba)
+* chore: remove additional braces for LeftCurlyCheck checkstyle [PR#1076](https://github.com/pgjdbc/pgjdbc/pull/1076) [975aaf5a](https://github.com/pgjdbc/pgjdbc/commit/975aaf5ae489b3efeda3fd0241a4d39d260105cd)
+
+JCzogalla (1):
+
+* Fixes issue #1078 [PR#1079](https://github.com/pgjdbc/pgjdbc/pull/1079) [0d51370b](https://github.com/pgjdbc/pgjdbc/commit/0d51370b68cd26ccfa92b0bae4a66da1015cf9ee)
+
+Jamie Pullar (1):
+
+* fix: getPGArrayType fails in when stringType=unspecified [PR#1036](https://github.com/pgjdbc/pgjdbc/pull/1036) [d5f1cf7c](https://github.com/pgjdbc/pgjdbc/commit/d5f1cf7c35b05318947021d41e73b6953f623256)
+
+Jorge Solorzano (1):
+
+* Fix style changelog [PR#1089](https://github.com/pgjdbc/pgjdbc/pull/1089) [5ebd2090](https://github.com/pgjdbc/pgjdbc/commit/5ebd20900ebf7af5b55c56eac7f2fae6d40d9f5c)
+
+Pavel Raiskup (1):
+
+* packaging: update Fedora's CI [dcbf70bc](https://github.com/pgjdbc/pgjdbc/commit/dcbf70bc071fe9d602f7c87918982b01452da9ba)
+
+Vladimir Sitnikov (3):
+
+* docs: reflect 42.2.0 release in readme.md [6d02e958](https://github.com/pgjdbc/pgjdbc/commit/6d02e9587e47921e66d8d029e5056bab72f15565)
+* fix: avoid connection failure when DateStyle is set to ISO [PR#1081](https://github.com/pgjdbc/pgjdbc/pull/1081) [e442db1f](https://github.com/pgjdbc/pgjdbc/commit/e442db1f064c78372f8312d65faee30842a68aea)
+* fix: reWriteBatchedInserts=true causes syntax error with ON CONFLICT [PR#1082](https://github.com/pgjdbc/pgjdbc/pull/1082) [e133510e](https://github.com/pgjdbc/pgjdbc/commit/e133510e70114db128784911b6790b5690d77320)
+
+<a name="contributors_{{ page.version }}"></a>
+### Contributors to this release
+
+We thank the following people for their contributions to this release.
+
+[AlexElin](https://github.com/AlexElin)
+[Alexander Kjäll](https://github.com/alexanderkjall)
+[Dave Cramer](davec at postgresintl.com)
+[Ivan](https://github.com/vaano94)
+[JCzogalla](https://github.com/JCzogalla)
+[Jamie Pullar](https://github.com/JamiePullar)
+[Jorge Solorzano](https://github.com/jorsol)
+[Pavel Raiskup](https://github.com/praiskup)
+[Vladimir Sitnikov](https://github.com/vlsi)
diff --git a/docs/_posts/2018-03-15-42.2.2-release.md b/docs/_posts/2018-03-15-42.2.2-release.md
new file mode 100644
index 0000000..c7fa289
--- /dev/null
+++ b/docs/_posts/2018-03-15-42.2.2-release.md
@@ -0,0 +1,95 @@
+---
+title: PostgreSQL JDBC Driver 42.2.2 Released
+date: 2018-03-15 18:55:14 +0300
+categories:
+ - new_release
+version: 42.2.2
+---
+**Notable changes**
+
+### Added
+- Documentation on server-side prepared statements [PR 1135](https://github.com/pgjdbc/pgjdbc/pull/1135)
+
+### Fixed
+- Avoid failure for `insert ... on conflict...update` for `reWriteBatchedInserts=true` case [PR 1130](https://github.com/pgjdbc/pgjdbc/pull/1130)
+- fix: allowEncodingChanges should allow set client_encoding=... [PR 1125](https://github.com/pgjdbc/pgjdbc/pull/1125)
+- Wrong data from Blob/Clob when mark/reset is used [PR 971](https://github.com/pgjdbc/pgjdbc/pull/971)
+- Adjust XAException return codes for better compatibility with XA specification [PR 782](https://github.com/pgjdbc/pgjdbc/pull/782)
+- Wrong results when single statement is used with different bind types[PR 1137](https://github.com/pgjdbc/pgjdbc/pull/1137)
+- Support generated keys for WITH queries that miss RETURNING [PR 1138](https://github.com/pgjdbc/pgjdbc/pull/1138)
+- Support generated keys when INSERT/UPDATE/DELETE keyword is followed by a comment [PR 1138](https://github.com/pgjdbc/pgjdbc/pull/1138)
+
+
+<!--more-->
+
+**Commits by author**
+
+Dave Cramer (5):
+
+* Update java8-date-time.md [643e5583](https://github.com/pgjdbc/pgjdbc/commit/643e5583fe34c28602af21eb766acbc56a7b26d7)
+* Update about.html [6fe76a3c](https://github.com/pgjdbc/pgjdbc/commit/6fe76a3c9289c78b2a8875e101020747584c36a7)
+* Update documentation.md [3b3fd8c9](https://github.com/pgjdbc/pgjdbc/commit/3b3fd8c90a4bdcde101f45ae255ca2fe30bac338)
+* Update documentation.md [a8ef9f96](https://github.com/pgjdbc/pgjdbc/commit/a8ef9f96feb02246a3d7967ada2ffe146778f7ed)
+* test: add Travis configuration to test SSL [PR#1095](https://github.com/pgjdbc/pgjdbc/pull/1095) [298683b1](https://github.com/pgjdbc/pgjdbc/commit/298683b1bd11a4b16cdba861c8ca93134cfb037b)
+
+Jorge Solorzano (1):
+
+* fix: improve DatabaseMetaData.getSQLKeywords() [PR#940](https://github.com/pgjdbc/pgjdbc/pull/940) [7a586b6e](https://github.com/pgjdbc/pgjdbc/commit/7a586b6e492e8911a928d50113a68569981fa731)
+
+Pawel (1):
+
+* Fixes #1096 [PR#1097](https://github.com/pgjdbc/pgjdbc/pull/1097) [df4e7fa0](https://github.com/pgjdbc/pgjdbc/commit/df4e7fa07c205e12f7fe5e3c80ab90ea63c1bc17)
+
+Selene Feigl (1):
+
+* fix: wrong data from Blob/Clob when mark/reset is used [PR#971](https://github.com/pgjdbc/pgjdbc/pull/971) [61e1c300](https://github.com/pgjdbc/pgjdbc/commit/61e1c300fb52237b05b7649d61603dd339fbdd9b)
+
+Simon Stelling (1):
+
+* fix: handle Timestamp values with fractional seconds < 1 microsecond correctly in PreparedStatement arguments [PR#1119](https://github.com/pgjdbc/pgjdbc/pull/1119) [8ff2a617](https://github.com/pgjdbc/pgjdbc/commit/8ff2a617c8a153eb364d8b762102b6b6b1cb53f8)
+
+Vladimir Sitnikov (14):
+
+* docs: reflect 42.2.1 release in readme.md [1a4256b9](https://github.com/pgjdbc/pgjdbc/commit/1a4256b973da36c0fc42f0268e58e1535073247b)
+* chore: make sure TEST_CLIENTS performs regular tests as well [aa676bb3](https://github.com/pgjdbc/pgjdbc/commit/aa676bb39117dc47cbd51a236b232227e9128220)
+* chore: remove unused variable lastKnownTime in ConnectionFactoryImpl [48b98971](https://github.com/pgjdbc/pgjdbc/commit/48b98971d085a7988b67a31cf5ff9fb52c5534e5)
+* fix: ArrayIndexOutOfBoundsException when using the same SQL for regular and updateable resultset [PR#1123](https://github.com/pgjdbc/pgjdbc/pull/1123) [45c32bc6](https://github.com/pgjdbc/pgjdbc/commit/45c32bc6af2e140ff86dabd718344c74fc244394)
+* fix: support insert ... on conflict...update for reWriteBatchedInserts=true [PR#1130](https://github.com/pgjdbc/pgjdbc/pull/1130) [1ca0c586](https://github.com/pgjdbc/pgjdbc/commit/1ca0c5864a8b6c575b32aee03e2e1e8848fee143)
+* fix: allowEncodingChanges should allow set client_encoding=... [PR#1125](https://github.com/pgjdbc/pgjdbc/pull/1125) [af64ed2d](https://github.com/pgjdbc/pgjdbc/commit/af64ed2dac035c621b4aec4a0471730457725194)
+* tests: UUID vs setString test [PR#1133](https://github.com/pgjdbc/pgjdbc/pull/1133) [5827858b](https://github.com/pgjdbc/pgjdbc/commit/5827858ba5b72b519feb86fc65301a7bffa10c4d)
+* fix: UUID test for preferQueryMode=simple [44bb7f8d](https://github.com/pgjdbc/pgjdbc/commit/44bb7f8d66829705bf46a6cfcad8a179eb14e441)
+* fix: wrong results when a single statement is used with UNSPECIFIED types [PR#1137](https://github.com/pgjdbc/pgjdbc/pull/1137) [fcd1ea14](https://github.com/pgjdbc/pgjdbc/commit/fcd1ea14545a113fe4a124e17132824e279f572e)
+* test: workaround DST issue in StatementTest#testDateFunctions [af499625](https://github.com/pgjdbc/pgjdbc/commit/af499625fb99043fe0bf605ec4b23f3dd64c18d7)
+* docs: improve documentation and tests for server-side prepared statements [PR#1135](https://github.com/pgjdbc/pgjdbc/pull/1135) [4204f094](https://github.com/pgjdbc/pgjdbc/commit/4204f09446edbc7caaecb4c8cd7c8f78abd9344e)
+* test: make testAlternatingBindType Java 6-compatible [PR#1139](https://github.com/pgjdbc/pgjdbc/pull/1139) [bcdd4273](https://github.com/pgjdbc/pgjdbc/commit/bcdd4273bba7ae6b3348d47d4cdeb72e941d5acc)
+* fix: better support for RETURNING for WITH queries and queries with comments [PR#1138](https://github.com/pgjdbc/pgjdbc/pull/1138) [04e76661](https://github.com/pgjdbc/pgjdbc/commit/04e76661586b54157a1220552c005569231388a9)
+* chore: add contributor links to release script [2568d38e](https://github.com/pgjdbc/pgjdbc/commit/2568d38e5ff7c9b23f92011c7dc936c307f53008)
+
+bpd0018 (3):
+
+* docs: fix spelling and chapter, update sample code [PR#1098](https://github.com/pgjdbc/pgjdbc/pull/1098) [0cfffa84](https://github.com/pgjdbc/pgjdbc/commit/0cfffa841b9b8d2040fe6c576aa77edfd399bbc0)
+* style: spelling in comment [PR#1121](https://github.com/pgjdbc/pgjdbc/pull/1121) [cc219aa7](https://github.com/pgjdbc/pgjdbc/commit/cc219aa79b37f03432db4fe61e06b5f27fcb7f83)
+* docs: fix JavaDoc for getPreferQueryMode() [PR#1122](https://github.com/pgjdbc/pgjdbc/pull/1122) [43d80cd4](https://github.com/pgjdbc/pgjdbc/commit/43d80cd48a54ea91868d15bd2f3806b467519883)
+
+chalda (1):
+
+* Adjust XAException return codes for better compatibility with XA specification [PR#782](https://github.com/pgjdbc/pgjdbc/pull/782) [e5aab1cd](https://github.com/pgjdbc/pgjdbc/commit/e5aab1cd3e49051f46298d8f1fd9f66af1731299)
+
+trtrmitya (1):
+
+* fix: use Locale.Category.DISPLAY (~lc_messages) when selecting resource bundle. [PR#1115](https://github.com/pgjdbc/pgjdbc/pull/1115) [0e9dfce4](https://github.com/pgjdbc/pgjdbc/commit/0e9dfce42c80391d0eefa830600e0ac4c1baae50)
+
+<a name="contributors_{{ page.version }}"></a>
+### Contributors to this release
+
+We thank the following people for their contributions to this release.
+
+[Dave Cramer](davec at postgresintl.com)
+[Jorge Solorzano](https://github.com/jorsol)
+[Pawel](https://github.com/veselov)
+[Selene Feigl](https://github.com/sfeigl)
+[Simon Stelling](https://github.com/stellingsimon)
+[Vladimir Sitnikov](https://github.com/vlsi)
+[bpd0018](https://github.com/bpd0018)
+[chalda](https://github.com/ochaloup)
+[trtrmitya](https://github.com/trtrmitya)
diff --git a/docs/about/about.html b/docs/about/about.html
new file mode 100644
index 0000000..a4d2631
--- /dev/null
+++ b/docs/about/about.html
@@ -0,0 +1,29 @@
+---
+layout: default
+title: PostgreSQL JDBC About
+resource: ../media
+nav: ../
+---
+
+{% include submenu_about.html %}
+
+ <div id="pgContentWrap">
+ <h1>About</h1>
+ <p>
+ <strong>PostgreSQL JDBC Driver</strong> (<em>PgJDBC</em> for short) allows Java programs to connect to a PostgreSQL database using standard,
+ database independent Java code. Is an open source JDBC driver written in Pure Java (Type 4), and communicates in
+ the PostgreSQL native network protocol.<br/><br/>
+ The current version of the driver should be compatible with <strong>PostgreSQL 8.2 and higher</strong>,
+ and <strong>Java 6</strong> (JDBC 4.0), <strong>Java 7</strong> (JDBC 4.1), <strong>Java 8</strong> (JDBC 4.2) and <strong>Java 9</strong>.<br/><br/>
+ </p>
+
+ <hr />
+ <h1>Features</h1>
+ <p>
+ The driver provides a reasonably complete implementation of the JDBC specification in addition
+ to some PostgreSQL specific extensions. Our goal is nothing short of full compliance, but we're not
+ there yet. Some features require additional backend support and others just need someone to implement
+ them. For a list of what still needs to be done see our <a href="../development/todo.html">Todo</a>
+ list.
+ </p>
+ </div> <!-- pgContentWrap -->
diff --git a/docs/about/extras.html b/docs/about/extras.html
new file mode 100644
index 0000000..c922395
--- /dev/null
+++ b/docs/about/extras.html
@@ -0,0 +1,43 @@
+---
+layout: default
+title: PostgreSQL JDBC Extras
+resource: ../media
+nav: ../
+---
+
+{% include submenu_about.html %}
+
+ <div id="pgContentWrap">
+ <h1>Extras</h1>
+ <hr />
+ <div>
+ <ul class="minitoc">
+ <li><a href="#intro">Introduction</a></li>
+ <li><a href="#jdbccache">Statement Caching Wrapper</a></li>
+ </ul>
+ </div>
+ <hr />
+
+ <a name="intro"></a>
+ <h2 class="underlined_10">Introduction</h2>
+ <div>
+ <p>
+ Here is a collection of things that may be useful to you that
+ are not part of the core driver. For assistance or support you
+ should contact the channels specified in each item, instead of
+ the core driver lists/team.
+ </p>
+ </div>
+ <hr />
+
+ <a name="jdbccache"></a>
+ <h2 class="underlined_10"><a href="http://jdbccache.projects.postgresql.org">Statement Caching Wrapper</a></h2>
+ <div>
+ <p>
+ Wraps the core driver to enable caching of PreparedStatement
+ objects. Not all application servers support this functionality
+ in their connection pools and not all applications are deployed
+ onto application servers.
+ </p>
+ </div>
+ </div> <!-- pgContentWrap -->
\ No newline at end of file
diff --git a/docs/about/license.html b/docs/about/license.html
new file mode 100644
index 0000000..84630cc
--- /dev/null
+++ b/docs/about/license.html
@@ -0,0 +1,45 @@
+---
+layout: default
+title: PostgreSQL JDBC License
+resource: ../media
+nav: ../
+---
+
+{% include submenu_about.html %}
+
+ <div id="pgContentWrap">
+ <h1>BSD 2-clause "Simplified" License</h1>
+ <p>
+ The PostgreSQL JDBC Driver is distributed under the BSD-2-Clause License.
+ The simplest explanation of the licensing terms is that
+ you can do whatever you want with the product and source code as long
+ as you don't claim you wrote it or sue us. You should give it a read
+ though, it's only half a page.
+ </p>
+ <hr />
+
+ <pre style="font-family: monospace,'Courier'; background-color: #f9f9f9; padding: 1em; border: 1px solid #ddd">
+Copyright (c) 1997, PostgreSQL Global Development Group
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.</pre>
+ </div> <!-- pgContentWrap -->
\ No newline at end of file
diff --git a/docs/community/community.html b/docs/community/community.html
new file mode 100644
index 0000000..98d05eb
--- /dev/null
+++ b/docs/community/community.html
@@ -0,0 +1,25 @@
+---
+layout: default
+title: PostgreSQL JDBC Community
+resource: ../media
+nav: ../
+---
+
+{% include submenu_community.html %}
+
+ <div id="pgContentWrap">
+ <h1>Community</h1>
+ <p>
+ PostgreSQL is well supported by its active community. Current developments are chronicled
+ in the <a href="http://www.postgresql.org/community/weeklynews" target="_blank">PostgreSQL Weekly News</a>
+ and there are more than a dozen <a href="http://www.postgresql.org/community/lists" target="_blank">mailing lists</a>
+ available, categorized into topics like administration, announcements,
+ jobs, performance, and SQL.
+ </p>
+
+ <p>
+ The PostgreSQL JDBC Driver is a subset of the PostgreSQL database active community that
+ strives to create a compliant Java interface for users. Please see the mailing list
+ link or development menu for additional information regarding the community.
+ </p>
+ </div> <!-- pgContentWrap -->
\ No newline at end of file
diff --git a/docs/community/contributors.html b/docs/community/contributors.html
new file mode 100644
index 0000000..99b3e3d
--- /dev/null
+++ b/docs/community/contributors.html
@@ -0,0 +1,196 @@
+---
+layout: default
+title: PostgreSQL JDBC Contributors
+resource: ../media
+nav: ../
+---
+
+{% include submenu_community.html %}
+
+ <div id="pgContentWrap">
+ <h1>Contributors</h1>
+ <hr />
+ <div>
+ <ul>
+ <li><a href="#maintainers">Maintainers</a></li>
+ <li><a href="#authors">Previous Maintainers</a></li>
+ <li><a href="#developers">Developers</a></li>
+ <li><a href="#translators">Translators</a></li>
+ </ul>
+ </div>
+ <hr />
+
+ <a name="maintainers"></a>
+ <h2 class="underlined_10">Maintainers</h2>
+ <div>
+ <p>
+ Please do not contact the maintainers directly unless you have
+ a specific need to contact just them. Please use the
+ <a href="mailinglist.html#general">pgsql-jdbc at postgresql.org</a>
+ mailing list if at all possible.
+ </p>
+ <ul>
+ <li>[davec] - Dave Cramer (pg.at.fastcrypt.com)</li>
+ <li>[jurka] - Kris Jurka (jurka.at.ejurka.com)</li>
+ <li>[oliver] - Oliver Jowett (oliver.at.opencloud.com)</li>
+ </ul>
+ </div>
+ <hr />
+
+ <a name="authors"></a>
+ <h2 class="underlined_10">Previous Maintainers</h2>
+ <div>
+ <p>
+ The original JDBC driver was written by Adrian Hall. Peter Mount
+ and Barry Lind have maintained it in the past, but have
+ since moved on to other things.
+ </p>
+ </div>
+ <hr />
+
+ <a name="developers"></a>
+ <h2 class="underlined_10">Developers</h2>
+ <div>
+ <p>
+ People who have contributed significant code to the project since
+ the 7.4 release. A careful historical study has not been
+ commissioned, but if you've done something valuable, we'd
+ be happy to recognize you for it. Just let us know.
+ </p>
+ <ul>
+ <li>Jan Andre le Roux
+ <ul>
+ <li>ResultSetMetaData information based on the V3 protocol</li>
+ </ul>
+ </li>
+ <li>Jaroslaw J. Pyszny
+ <ul>
+ <li>Improve MetaData regarding the serial datatype</li>
+ </ul>
+ </li>
+ <li>Ulrich Meis
+ <ul>
+ <li>Allow users to customize the SSL connection</li>
+ </ul>
+ </li>
+ <li>Xavier Poinsard
+ <ul>
+ <li>Standard escaped functions {fn ...() }</li>
+ </ul>
+ </li>
+ <li>Oliver Siegmar
+ <ul>
+ <li>Support for infinity in the timestamp datatype</li>
+ <li>Make PGInterval able to decode and manipulate interval data</li>
+ </ul>
+ </li>
+ <li>Michael Barker
+ <ul>
+ <li>Blob write and position methods.</li>
+ </ul>
+ </li>
+ <li>Andras Kadinger
+ <ul>
+ <li>Support asynchronous notification retrieval.</li>
+ </ul>
+ </li>
+ <li>Heikki Linnakangas
+ <ul>
+ <li>XADataSource implementation.</li>
+ </ul>
+ </li>
+ <li>Luis Vilar Flores
+ <ul>
+ <li>Reduce memory usage retrieving bytea data.</li>
+ </ul>
+ </li>
+ <li>Michael Paesold
+ <ul>
+ <li>Correctly parse dollar quotes and comments.</li>
+ <li>Work with standard_conforming_strings = on.</li>
+ </ul>
+ </li>
+ <li>Mikko Tiihonen
+ <ul>
+ <li>Improve speed of parsing ResultSet data.</li>
+ </ul>
+ </li>
+ <li>Marek Lewczuk
+ <ul>
+ <li>Support multi-dimensional arrays and NULL array elements.</li>
+ </ul>
+ </li>
+ </ul>
+ </div>
+ <hr />
+
+ <a name="translators"></a>
+ <h2 class="underlined_10">Translators</h2>
+ <div>
+ <ul>
+ <li>cs - Czech
+ <ul>
+ <li>Petr Dittrich</li>
+ </ul>
+ </li>
+ <li>de - German
+ <ul>
+ <li>Andre Bialojahn</li>
+ </ul>
+ </li>
+ <li>es - Spanish
+ <ul>
+ <li>Diego A. Gil</li>
+ </ul>
+ </li>
+ <li>fr - French
+ <ul>
+ <li>Xavier Poinsard</li>
+ </ul>
+ </li>
+ <li>it - Italian
+ <ul>
+ <li>Giuseppe Sacco</li>
+ </ul>
+ </li>
+ <li>pl - Polish
+ <ul>
+ <li>Jaroslaw Pyszny</li>
+ </ul>
+ </li>
+ <li>pt_BR - Brazilian Portuguese
+ <ul>
+ <li>Euler Taveira de Oliveira</li>
+ </ul>
+ </li>
+ <li>ru - Russian
+ <ul>
+ <li>Serguei Mokhov</li>
+ </ul>
+ </li>
+ <li>sr - Serbian
+ <ul>
+ <li>Bojan Skaljac</li>
+ </ul>
+ </li>
+ <li>tr - Turkish
+ <ul>
+ <li>Devrim Gunduz</li>
+ <li>Nicolai Tufar</li>
+ </ul>
+ </li>
+ <li>zh_CN - Simplified Chinese
+ <ul>
+ <li>Weiping</li>
+ <li>Kuo ChaoYi</li>
+ </ul>
+ </li>
+ <li>zh_TW - Traditional Chinese
+ <ul>
+ <li>Zhenbang Wei</li>
+ <li>Kuo ChaoYi</li>
+ </ul>
+ </li>
+ </ul>
+ </div>
+ </div> <!-- pgContentWrap -->
\ No newline at end of file
diff --git a/docs/community/mailinglist.html b/docs/community/mailinglist.html
new file mode 100644
index 0000000..7447595
--- /dev/null
+++ b/docs/community/mailinglist.html
@@ -0,0 +1,89 @@
+---
+layout: default
+title: PostgreSQL JDBC Mailing List
+resource: ../media
+nav: ../
+---
+
+{% include submenu_community.html %}
+
+ <div id="pgContentWrap">
+ <h1>Mailing Lists</h1>
+ <hr />
+ <div>
+ <div>
+ <ul>
+ <li><a href="#before">Before Mailing Anyone</a></li>
+ <li><a href="#general">General List - pgsql-jdbc at postgresql.org</a></li>
+ <li><a href="#commits">Commit Messages - jdbc-commits at pgfoundry.org</a></li>
+ </ul>
+ </div>
+ </div>
+ <hr />
+
+ <a name="before"></a>
+ <h2 class="underlined_10">Before Mailing Anyone</h2>
+ <div>
+ <p>
+ Before posting a question or problem to the mailing list, please
+ first look at the following resources:
+ </p>
+ <ul>
+ <li><a href="../documentation/faq.html">FAQ</a></li>
+ <li><a href="../documentation/documentation.html">Documentation</a></li>
+ <li>
+ Mailing list <a href="http://archives.postgresql.org/pgsql-jdbc" target="_blank">archives</a>,
+ (Google interface to <a href="http://groups.google.com/group/pgsql.interfaces.jdbc" target="_blank">newer messages</a>.)
+ </li>
+ <li>
+ Consider upgrading your JDBC driver to the latest version. It
+ should be backwards compatible and may fix your problem.
+ </li>
+ </ul>
+ </div>
+ <hr />
+
+ <a name="general"></a>
+ <h2 class="underlined_10">General List - pgsql-jdbc at postgresql.org</h2>
+ <div>
+ <p>
+ This mailing list is for all PostgreSQL Java/JDBC related discussions.
+ This is the place for bug reports, feature requests, help with
+ problem solving, and pretty much anything involving Java and
+ PostgreSQL. Messages from people who are not subscribed to the list
+ will be held for moderator approval in an effort to cut down on spam.
+ Archives and subscription information is available on the main
+ <a href="http://archives.postgresql.org/pgsql-jdbc/" target="_blank">PostgreSQL site</a>.
+ </p>
+ <p>
+ When asking for help or reporting a problem please try to include
+ as much information as possible. Good things to note are:
+ </p>
+ <ul>
+ <li>JDBC driver build number</li>
+ <li>Server version</li>
+ <li>Exact error message and stacktrace</li>
+ <li>What you were doing, ideally in code form</li>
+ </ul>
+ </div>
+ <hr />
+
+ <a name="commits"></a>
+ <h2 class="underlined_10">Commit Messages - jdbc-commits at pgfoundry.org</h2>
+ <div>
+ <p>
+ This mailing list is for people interested in carefully monitoring
+ the development process. The mailing list was active until the code
+ base was transfered to GitHub in late 2012. Every commit to this earlier
+ CVS repository sent out an email with the log message and links to diffs.
+ So the archive of this list, <a href="http://lists.pgfoundry.org/mailman/listinfo/jdbc-commits" target="_blank">pgfoundry site</a>,
+ holds the history of activity with the driver prior to 2013.
+ </p>
+ <p>
+ Currently activity on commits is best observed directly from the git
+ repository hosted with <a href="https://github.com/pgjdbc/pgjdbc" target="_blank">GitHub</a>.
+ The console tool, gitk, available with a git installation is an excellent
+ GUI tool to observe commits.
+ </p>
+ </div>
+ </div> <!-- pgContentWrap -->
diff --git a/docs/development/development.html b/docs/development/development.html
new file mode 100644
index 0000000..7a866c8
--- /dev/null
+++ b/docs/development/development.html
@@ -0,0 +1,100 @@
+---
+layout: default
+title: PostgreSQL JDBC Development
+resource: ../media
+nav: ../
+---
+
+{% include submenu_development.html %}
+
+ <div id="pgContentWrap">
+ <h1>Development</h1>
+ <hr />
+ <div>
+ <ul>
+ <li><a href="#About_the_Driver">About the Driver</a></li>
+ <li><a href="#Tools">Tools</a></li>
+ <li><a href="#Build_Process">Build Process</a></li>
+ <li><a href="#Test_Suite">Test Suite</a></li>
+ </ul>
+ </div>
+ <hr />
+
+ <a name="About_the_Driver"></a>
+ <h2 class="underlined_10">About the Driver</h2>
+ <div>
+ <p>
+ The PostgreSQL JDBC driver has some unique properties that you
+ should be aware of before starting to develop any code for it.
+ The current development driver supports eleven server versions and
+ three java environments. This doesn't mean that every feature must
+ work in every combination, but a reasonable behaviour must be
+ provided for non-supported versions. While this extra compatibility
+ sounds like a lot of work, the actual goal is to reduce the amount
+ of work by maintaining only one code base.
+ </p>
+ </div>
+ <hr />
+
+ <a name="Tools"></a>
+ <h2 class="underlined_10">Tools</h2>
+ <div>
+ <p>
+ The following tools are required to build and test the driver:
+ </p>
+ <ul>
+ <li><a href="https://java.oracle.com" target="_blank">Java 6 Standard Edition Development Kit</a> At least JDK 1.6</li>
+ <li><a href="https://maven.apache.org" target="_blank">Apache Maven</a> At least 3.1.1</li>
+ <li><a href="https://git-scm.com" target="_blank">Git SCM</a></li>
+ <li><a href="https://www.postgresql.org" target="_blank">A PostgreSQL instance</a> to run the tests.</li>
+ </ul>
+ </div>
+ <hr />
+
+ <a name="Build_Process"></a>
+ <h2 class="underlined_10">Build Process</h2>
+ <div>
+ <p>
+ After retrieving the source from the <a href="../development/git.html">git repository</a>.
+ Move into the top level <span style="font-family: Courier New,Courier,monospace;">pgjdbc</span> directory and simply
+ type <span style="font-family: Courier New,Courier,monospace;">mvn package -DskipTests</span>. This will build the appropriate driver for
+ your current Java version and place it into <span style="font-family: Courier New,Courier,monospace;">target/postgresql-${version}.jar</span>.
+ </p>
+ </div>
+ <hr />
+
+ <a name="Test_Suite"></a>
+ <h2 class="underlined_10">Test Suite</h2>
+ <div>
+ <p>
+ To make sure the driver is working as expected there are a set of
+ JUnit tests that should be run. These require a database to run
+ against that has the plpgsql procedural language installed. The
+ default parameters for username and database are "test", and for
+ password it's "test".
+ so a sample interaction to set this up would look the following, if
+ you enter "password" when asked for it:
+ </p>
+ <pre style="font-family: serif;">
+postgres at host:~$ createuser -d -A test -P
+Enter password for user "test":
+Enter it again:
+CREATE USER
+
+postgres at host:~$ createdb -U test test
+CREATE DATABASE
+
+postgres at host:~$ createlang plpgsql test
+ </pre>
+ <p>
+ Now we're ready to run the tests, we simply type <span style="font-family: Courier New,Courier,monospace;">mvn clean package</span>,
+ and it should be off and running. To use non default values to run
+ the regression tests, you can create a <span style="font-family: Courier New,Courier,monospace;">build.local.properties</span>
+ in the top level directory. This properties file allows you to set
+ values for host, database, user, password, and port with the standard
+ properties "key = value" usage. The ability to set the port value
+ makes it easy to run the tests against a number of different server
+ versions on the same machine.
+ </p>
+ </div>
+ </div> <!-- pgContentWrap -->
diff --git a/docs/development/git.html b/docs/development/git.html
new file mode 100644
index 0000000..4200d3c
--- /dev/null
+++ b/docs/development/git.html
@@ -0,0 +1,44 @@
+---
+layout: default
+title: PostgreSQL JDBC GIT
+resource: ../media
+nav: ../
+---
+
+{% include submenu_development.html %}
+
+ <div id="pgContentWrap">
+ <h1>GIT Repository</h1>
+ <hr />
+ <div>
+ <ul>
+ <li><a href="#webgit">GIT Web Interface</a></li>
+ <li><a href="#newretrieve">Retrieving the Code</a></li>
+ </ul>
+ </div>
+ <hr />
+
+ <a name="webgit"></a>
+ <h2 class="underlined_10">GIT Web Interface</h2>
+ <div>
+ <p>
+ A web view of the GIT repository is available
+ <a href="https://github.com/pgjdbc/pgjdbc" target="_blank">here</a>.
+ </p>
+ </div>
+ <hr />
+
+ <a name="newretrieve"></a>
+ <h2 class="underlined_10">Retrieving the Code</h2>
+ <div>
+ <p>
+ Clone the PostgreSQL JDBC repository from Github:
+ </p>
+ <pre style="font-family: serif;">
+git clone git://github.com/pgjdbc/pgjdbc.git
+ </pre>
+ <p>
+ This will create a subdirectory "pgjdbc" containing the driver source code.
+ </p>
+ </div>
+ </div> <!-- pgContentWrap -->
\ No newline at end of file
diff --git a/docs/development/status.html b/docs/development/status.html
new file mode 100644
index 0000000..02dd439
--- /dev/null
+++ b/docs/development/status.html
@@ -0,0 +1,63 @@
+---
+layout: default
+title: PostgreSQL JDBC Translations Status
+resource: ../media
+nav: ../
+---
+
+{% include submenu_development.html %}
+
+ <div id="pgContentWrap">
+ <h1>Website</h1>
+ <div>
+ <ul>
+ <li><a href="#v91">Branch - 91</a></li>
+ </ul>
+ </div>
+ <hr />
+
+ <a name="v91"></a>
+ <h2>Branch - 91</h2>
+ <div>
+ <table summary="" border="1" cellspacing="1" cellpadding="2">
+ <tr>
+ <th> </th>
+ <th>bg</th>
+ <th>cs</th>
+ <th>de</th>
+ <th>es</th>
+ <th>fr</th>
+ <th>it</th>
+ <th>ja</th>
+ <th>nl</th>
+ <th>pl</th>
+ <th>pt_BR</th>
+ <th>ru</th>
+ <th>sr</th>
+ <th>tr</th>
+ <th>zh_CN</th>
+ <th>zh_TW</th>
+ </tr>
+ <tr>
+ <td>
+ <a href="po/91-messages.pot">Template</a><br>Messages: 224
+ </td>
+ <td><a href="po/91-bg.po">95</a></td>
+ <td><a href="po/91-cs.po">42</a></td>
+ <td><a href="po/91-de.po">74</a></td>
+ <td><a href="po/91-es.po">9</a></td>
+ <td><a href="po/91-fr.po">74</a></td>
+ <td><a href="po/91-it.po">70</a></td>
+ <td><a href="po/91-ja.po">97</a></td>
+ <td><a href="po/91-nl.po">3</a></td>
+ <td><a href="po/91-pl.po">32</a></td>
+ <td><a href="po/91-pt_BR.po">82</a></td>
+ <td><a href="po/91-ru.po">21</a></td>
+ <td><a href="po/91-sr.po">82</a></td>
+ <td><a href="po/91-tr.po">82</a></td>
+ <td><a href="po/91-zh_CN.po">55</a></td>
+ <td><a href="po/91-zh_TW.po">55</a></td>
+ </tr>
+ </table>
+ </div>
+ </div> <!-- pgContentWrap -->
\ No newline at end of file
diff --git a/docs/development/todo.md b/docs/development/todo.md
new file mode 100644
index 0000000..205a02d
--- /dev/null
+++ b/docs/development/todo.md
@@ -0,0 +1,110 @@
+---
+layout: todos
+title: PostgreSQL JDBC Todo
+resource: ../media
+nav: ../
+---
+
+
+# Todo List
+***
+
+* [Known Bugs](#Known_Bugs)
+* [Compliance](#Compliance)
+* [Performance](#Performance)
+* [PG Extensions](#PG_Extensions)
+* [Other](#Other)
+* [Ideas](#Ideas)
+* [Documentation](#Documentation)
+* [Website](#Website)
+
+***
+<a name="Known_Bugs"></a>
+## Known Bugs
+
+* **[bugs]** Deallocating large numbers of server side statements can break the
+ connection by filling network buffers. This is a very, very low probability
+ bug, but it is still possible. <a href="http://archives.postgresql.org/pgsql-jdbc/2004-12/msg00115.php">ref</a>
+ →
+
+***
+<a name="Compliance"></a>
+## Compliance
+
+* **[JDBC1]** Implement Statement.setQueryTimeout. →
+* **[JDBC2]** Sort DatabaseMetaData.getTypeInfo properly (by closest match). →
+* **[JDBC2]** Implement SQLInput and SQLOutput to allow composite types to be used. →
+* **[JDBC3]** Implement Statement.getGeneratedKeys. <a href="http://archives.postgresql.org/pgsql-jdbc/2004-09/msg00190.php">ref2</a> →
+* **[JDBC3]** The JDBC 3 DatabaseMetaData methods sometimes return additional information.
+ Currently we only return JDBC 2 data for these methods. <a href="http://archives.postgresql.org/pgsql-jdbc/2004-12/msg00038.php">ref</a>
+ →
+* **[JDBC3]** Implement Clob write/position methods. →
+
+***
+<a name="Performance"></a>
+## Performance
+
+* **[]** Add statement pooling to take advantage of server prepared statements. →
+* **[]** Allow scrollable ResultSets to not fetch all results in one batch. →
+* **[]** Allow refcursor ResultSets to not fetch all results in one batch. →
+* **[]** Allow binary data transfers for all datatypes not just bytea. →
+
+***
+<a name="PG_Extensions"></a>
+## PG Extensions
+
+* **[]** Allow configuration of GUC parameters via the Connection URL or Datasource.
+ The most obvious example of usefulness is search_path. <a href="http://archives.postgresql.org/pgsql-jdbc/2004-02/msg00022.php">ref</a>
+ →
+
+***
+<a name="Other"></a>
+## Other
+
+* **[test]** Pass the JDBC CTS (Sun's test suite). →
+* **[code]** Allow SSL to use client certificates. This can probably be done with
+ our existing SSLSocketFactory customization code, but it would be good to
+ provide an example or other wrapper so a non-expert can set it up.
+ <a href="http://archives.postgresql.org/pgsql-jdbc/2004-12/msg00077.php">ref1</a>,
+ <a href="http://archives.postgresql.org/pgsql-jdbc/2004-12/msg00083.php">ref2</a> →
+* **[code]** Currently the internal type cache is not schema aware. →
+* **[code]** Need a much better lexer/parser than the ad hoc stuff in the driver.
+ <a href="http://archives.postgresql.org/pgsql-jdbc/2004-09/msg00062.php">ref2</a> →
+
+***
+<a name="Ideas"></a>
+## Ideas
+
+* **[]** Allow Blob/Clob to operate on bytea/text data. <a href="http://archives.postgresql.org/pgsql-jdbc/2005-01/msg00058.php">ref</a>
+ →
+* **[]** Allow getByte/getInt/... to work on boolean values <a href="http://archives.postgresql.org/pgsql-jdbc/2005-01/msg00254.php">ref</a>
+ →
+* **[]** Add a URL parameter to make the driver not force a rollback on error for
+ compatibility with other dbs. The driver can wrap each statement in a Savepoint.
+ <a href="http://archives.postgresql.org/pgsql-jdbc/2005-01/msg00131.php">ref</a> →
+* **[]** Combine DatabaseMetaData efforts with pl/java. <a href="http://archives.postgresql.org/pgsql-jdbc/2005-02/msg00063.php">ref</a>
+ →
+* **[]** ResultSetMetaData calls that run queries are cached on a per column basis, but
+ it seems likely that they're going to be called for all columns, so try to issue
+ one query per ResultSet, not per column. →
+* **[]** Make PGConnection, PGStatement, ... extend java.sql.XXX <a href="http://archives.postgresql.org/pgsql-jdbc/2005-01/msg00223.php">ref</a>
+ →
+
+***
+<a name="Documentation"></a>
+## Documentation
+
+* **[]** The PGResultSetMetaData interface is not mentioned. →
+* **[]** Timestamp +/- Infinity values are not mentioned. →
+* **[]** Async notifies are more async now. <a href="http://archives.postgresql.org/pgsql-jdbc/2005-04/msg00056.php">ref</a>
+ →
+
+***
+<a name="Website"></a>
+## Website
+
+* **[]** Setup a cron job somewhere to build and deploy the sight on a daily
+ basis to keep API changes and translations up to date.
+ →
+* **[]** Add a daily git snapshot build to make the latest updates available.
+ →
\ No newline at end of file
diff --git a/docs/development/translations.html b/docs/development/translations.html
new file mode 100644
index 0000000..a64b873
--- /dev/null
+++ b/docs/development/translations.html
@@ -0,0 +1,132 @@
+---
+layout: default
+title: PostgreSQL JDBC Translations
+resource: ../media
+nav: ../
+---
+
+{% include submenu_development.html %}
+
+ <div id="pgContentWrap">
+ <h1>Translations</h1>
+ <hr />
+ <div>
+ <ul>
+ <li><a href="#overview">Overview</a></li>
+ <li><a href="#devlopers">Developers</a></li>
+ <li><a href="#translators">Translators</a></li>
+ <li><a href="#maintainers">Maintainers</a></li>
+ </ul>
+ </div>
+ <hr />
+
+ <a name="overview"></a>
+ <h2 class="underlined_10">Overview</h2>
+ <div>
+ <p>
+ Translations of driver specific error messages are available in a
+ number of languages. The following information is about how to
+ update an existing translation or to provide a translation to a new
+ language.
+ </p>
+ <p>
+ The translations are done using the
+ <a href="http://www.gnu.org/software/gettext/gettext.html" target="_blank">GNU gettext</a>
+ tools. These are not required to build or use the driver, only
+ translators and maintainers need them.
+ </p>
+ </div>
+ <hr />
+
+ <a name="devlopers"></a>
+ <h2 class="underlined_10">Developers</h2>
+ <div>
+ <p>
+ When writing code for the driver you need to specially mark strings
+ for translation so they are picked up by the tools. In general any
+ user visible message should be made available for translation.
+ Strings are marked using the <a href="privateapi/org/postgresql/util/GT.html">GT.tr</a>
+ method. The name means "gettext translate", but
+ a shorter name was wanted because this shows up in a lot of places.
+ </p>
+ <p>
+ To provide context sensitive information the standard Java
+ <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/text/MessageFormat.html" target="_blank">MessageFormat</a>
+ syntax is used in the error messages. Consider, for example,
+ the error message for calling ResultSet.getInt() with an invalid
+ column number, we want to helpfully report the column asked for and
+ the number of columns in the ResultSet.
+ </p>
+ <pre style="font-family: serif;">
+if (column < 1 || column > fields.length) {
+ String err = GT.tr(
+ "The column index requested: {0} is out of range.",
+ new Integer(column)
+ );
+ throw new PSQLException(err, PSQLState.INVALID_PARAMETER_VALID);
+}
+ </pre>
+ </div>
+ <hr />
+
+ <a name="translators"></a>
+ <h2 class="underlined_10">Translators</h2>
+ <div>
+ <p>
+ Check the current <a href="status.html">translation status</a>
+ page to see if an existing translation exists for your language,
+ so you can update that instead of starting from
+ scratch. To start a new translation you can download the template
+ file and work on that instead.
+ </p>
+ <p>
+ Editing the .po file is a pretty straightforward process and a number
+ of tools exist to aid you in the process:
+ </p>
+ <ul>
+ <li>GNU Emacs and XEmacs have PO editing modes.</li>
+ <li>
+ <a href="http://freecode.com/projects/kbabel" target="_blank">KBabel</a>
+ is a KDE-based editing tool.
+ </li>
+ <li>
+ <a href="http://poedit.sourceforge.net/" target="_blank">poEdit</a>
+ is another tool which can run on Windows.
+ </li>
+ </ul>
+ <p>
+ Once you feel the translation is accurate and complete (or you get
+ tired), verify that the file by running <span class="codefrag">msgfmt</span>.
+ </p>
+ <pre style="font-family: serif;">
+msgfmt -c -v -o /dev/null pofile
+ </pre>
+ <p>
+ If everything checks out send the po file on over to the
+ <a href="mailto:pgsql-jdbc at postgresql.org">pgsql-jdbc at postgresql.org</a>
+ mailing list. This list does have a size limit of 30k, so you will
+ need to compress the po file before sending it.
+ </p>
+ </div>
+ <hr />
+
+ <a name="maintainers"></a>
+ <h2 class="underlined_10">Maintainers</h2>
+ <div>
+ <p>
+ To avoid requiring the gettext tools to compile the driver the
+ decision has been made to directly check in the compiled message
+ catalogs to the git repository. When you get a new or updated
+ translation, first ensure that it is valid by running the
+ <span style="font-family: Courier New,Courier,monospace;">msgfmt</span> command mentioned in the translators section.
+ If this looks correct drop it into the
+ <span style="font-family: Courier New,Courier,monospace;">src/org/postgresql/translation</span>
+ directory and run the <span class="codefrag">update-translations.sh</span> script
+ in the top level directory. This will produce the compiled class
+ file that contains the translated messages. Then simply check in
+ both the .po and .class files. Be sure to only commit changes to the
+ translations you've modified because the <span style="font-family: Courier New,Courier,monospace;">update-translations.sh</span>
+ script modifies all the translations.
+ </p>
+ </div>
+ </div> <!-- pgContentWrap -->
\ No newline at end of file
diff --git a/docs/development/website.html b/docs/development/website.html
new file mode 100644
index 0000000..68e6755
--- /dev/null
+++ b/docs/development/website.html
@@ -0,0 +1,66 @@
+---
+layout: default
+title: PostgreSQL JDBC Website
+resource: ../media
+nav: ../
+---
+
+{% include submenu_development.html %}
+
+ <div id="pgContentWrap">
+ <h1>Website</h1>
+ <hr />
+ <div>
+ <div>
+ <ul>
+ <li><a href="#website">Building the Website</a></li>
+ <li><a href="#addingpages">Adding a Page</a></li>
+ </ul>
+ </div>
+ </div>
+ <hr />
+
+ <a name="website"></a>
+ <h2 class="underlined_10">Building the Website</h2>
+ <div>
+ <p>
+ The website is produced with <a href="http://jekyllrb.com" target="_blank">Jekyll</a>.
+ It allows you to build a reasonably good looking website that is
+ easy to maintain and modular in nature. Templates are used from the _layout
+ and _includes directories which are then used in conjuction with content that
+ is created with <a href="http://daringfireball.net/projects/markdown/" target="_blank">Markdown</a>,
+ <a href="http://textile.sitemonks.com/" target="_blank">Textile</a>, or
+ just standard HTML for input. Using Markdown or Textile allows the content
+ to be generated with simple rules that allow a more free flowing process of
+ writing without worrying about coding for the HTML.
+ </p>
+ <p>
+ To get started please read the <a href="http://jekyllrb.com" target="_blank">Jekyll website</a>
+ for installation instructions for that tool. After installing Jekyll you need to get
+ the website project. This is available from the same <a href="../development/git.html">git repository</a>
+ that the main source code is, it's just a different module, <span style="font-family: Courier New,Courier,monospace;">www</span>.
+ Checkout this module and then within the top level directory of the module simply
+ run <span style="font-family: Courier New,Courier,monospace;">jekyll build</span>.
+ This should produce the website in the <span style="font-family: Courier New,Courier,monospace;">_site</span>
+ subdirectory.
+ </p>
+ </div>
+ <hr />
+
+ <a name="addingpages"></a>
+ <h2 class="underlined_10">Adding a Page</h2>
+ <div>
+ <p>
+ To add a page the easiest thing to do is copy an existing one from the site like
+ <span style="font-family: Courier New,Courier,monospace;">about/about.html</span>
+ and then rip out its contents. Once new content is created and you have saved
+ the new page you will need to add the new file to the menu system
+ of the appropriate <span style="font-family: Courier New,Courier,monospace;">_includes</span>
+ subdirectory submenu.<br><br>
+
+ A good place to look for example content is <a href="https://github.com/mojombo/jekyll/wiki/sites">Jekyll's wiki</a>
+ site where there is a listing of real sites that use Jekyll. Many of these sites will
+ have their repositories available for review.
+ </p>
+ </div>
+ </div> <!-- pgContentWrap -->
\ No newline at end of file
diff --git a/docs/documentation/92/binary-data.md b/docs/documentation/92/binary-data.md
new file mode 100644
index 0000000..16470e1
--- /dev/null
+++ b/docs/documentation/92/binary-data.md
@@ -0,0 +1,179 @@
+---
+layout: default_docs
+title: Chapter 7. Storing Binary Data
+header: Chapter 7. Storing Binary Data
+resource: media
+previoustitle: Chapter 6. Calling Stored Functions
+previous: callproc.html
+nexttitle: Chapter 8. JDBC escapes
+next: escapes.html
+---
+
+PostgreSQL™ provides two distinct ways to store binary data. Binary data can be
+stored in a table using the data type BYTEA or by using the Large Object feature
+which stores the binary data in a separate table in a special format and refers
+to that table by storing a value of type OID in your table.
+
+In order to determine which method is appropriate you need to understand the
+limitations of each method. The BYTEA data type is not well suited for storing
+very large amounts of binary data. While a column of type BYTEA can hold up to
+1 GB of binary data, it would require a huge amount of memory to process such a
+large value. The Large Object method for storing binary data is better suited to
+storing very large values, but it has its own limitations. Specifically deleting
+a row that contains a Large Object reference does not delete the Large Object.
+Deleting the Large Object is a separate operation that needs to be performed.
+Large Objects also have some security issues since anyone connected to the
+database can view and/or modify any Large Object, even if they don't have
+permissions to view/update the row containing the Large Object reference.
+
+Version 7.2 was the first release of the JDBC driver that supports the BYTEA
+data type. The introduction of this functionality in 7.2 has introduced a change
+in behavior as compared to previous releases. Since 7.2, the methods `getBytes()`,
+`setBytes()`, `getBinaryStream()`, and `setBinaryStream()` operate on the BYTEA
+data type. In 7.1 and earlier, these methods operated on the OID data type
+associated with Large Objects. It is possible to revert the driver back to the
+old 7.1 behavior by setting the property `compatible` on the `Connection` object
+to the value `7.1`. More details on connection properties are available in the
+section called [“Connection Parameters”](connect.html#connection-parameters).
+
+To use the BYTEA data type you should simply use the `getBytes()`, `setBytes()`,
+`getBinaryStream()`, or `setBinaryStream()` methods.
+
+To use the Large Object functionality you can use either the `LargeObject` class
+provided by the PostgreSQL™ JDBC driver, or by using the `getBLOB()` and `setBLOB()`
+methods.
+
+### Important
+
+> You must access Large Objects within an SQL transaction block. You can start a
+transaction block by calling `setAutoCommit(false)`.
+
+[Example 7.1, “Processing Binary Data in JDBC”](binary-data.html#binary-data-example)
+contains some examples on how to process binary data using the PostgreSQL™ JDBC
+driver.
+
+<a name="binary-data-example"></a>
+***Example 7.1. Processing Binary Data in JDBC***
+
+For example, suppose you have a table containing the file names of images and you
+also want to store the image in a BYTEA column:
+
+`CREATE TABLE images (imgname text, img bytea);`
+
+To insert an image, you would use:
+
+`File file = new File("myimage.gif");`
+`FileInputStream fis = new FileInputStream(file);`
+`PreparedStatement ps = conn.prepareStatement("INSERT INTO images VALUES (?, ?)");`
+`ps.setString(1, file.getName());`
+`ps.setBinaryStream(2, fis, (int)file.length());`
+`ps.executeUpdate();`
+`ps.close();`
+`fis.close();`
+
+Here, `setBinaryStream()` transfers a set number of bytes from a stream into the
+column of type BYTEA. This also could have been done using the `setBytes()` method
+if the contents of the image was already in a `byte[]`.
+
+### Note
+
+> The length parameter to `setBinaryStream` must be correct. There is no way to
+indicate that the stream is of unknown length. If you are in this situation, you
+must read the stream yourself into temporary storage and determine the length.
+Now with the correct length you may send the data from temporary storage on to
+the driver.
+
+Retrieving an image is even easier. (We use `PreparedStatement` here, but the
+`Statement` class can equally be used.)
+
+`PreparedStatement ps = conn.prepareStatement("SELECT img FROM images WHERE imgname = ?");`
+`ps.setString(1, "myimage.gif");`
+`ResultSet rs = ps.executeQuery();`
+`while (rs.next())`
+`{`
+ `byte[] imgBytes = rs.getBytes(1);`
+ `// use the data in some way here`
+`}`
+`rs.close();`
+`ps.close();`
+
+Here the binary data was retrieved as an `byte[]`. You could have used a
+`InputStream` object instead.
+
+Alternatively you could be storing a very large file and want to use the
+`LargeObject` API to store the file:
+
+`CREATE TABLE imageslo (imgname text, imgoid oid);`
+
+To insert an image, you would use:
+
+
+`// All LargeObject API calls must be within a transaction block`
+`conn.setAutoCommit(false);``<br />
+
+`// Get the Large Object Manager to perform operations with`
+`LargeObjectManager lobj = conn.unwrap(org.postgresql.PGConnection.class).getLargeObjectAPI();`<br />
+
+`// Create a new large object`
+`long oid = lobj.createLO(LargeObjectManager.READ | LargeObjectManager.WRITE);`<br />
+
+`// Open the large object for writing`
+`LargeObject obj = lobj.open(oid, LargeObjectManager.WRITE);`<br />
+
+`// Now open the file`
+`File file = new File("myimage.gif");`
+`FileInputStream fis = new FileInputStream(file);`<br />
+
+`// Copy the data from the file to the large object`
+`byte buf[] = new byte[2048];`
+`int s, tl = 0;`
+`while ((s = fis.read(buf, 0, 2048)) > 0)`
+`{`
+ `obj.write(buf, 0, s);`
+ `tl += s;`
+`}`<br />
+
+`// Close the large object`
+`obj.close();`<br />
+
+`// Now insert the row into imageslo`
+`PreparedStatement ps = conn.prepareStatement("INSERT INTO imageslo VALUES (?, ?)");`
+`ps.setString(1, file.getName());`
+`ps.setLong(2, oid);`
+`ps.executeUpdate();`
+`ps.close();`
+`fis.close();`<br />
+
+`// Finally, commit the transaction.`
+`conn.commit();`
+
+Retrieving the image from the Large Object:
+
+`// All LargeObject API calls must be within a transaction block`
+`conn.setAutoCommit(false);`<br />
+
+`// Get the Large Object Manager to perform operations with`
+`LargeObjectManager lobj = conn.unwrap(org.postgresql.PGConnection.class).getLargeObjectAPI();`<br />
+
+`PreparedStatement ps = conn.prepareStatement("SELECT imgoid FROM imageslo WHERE imgname = ?");`
+`ps.setString(1, "myimage.gif");`
+`ResultSet rs = ps.executeQuery();`
+`while (rs.next())`
+`{`
+ `// Open the large object for reading`
+ `long oid = rs.getLong(1);`
+ `LargeObject obj = lobj.open(oid, LargeObjectManager.READ);`<br />
+
+ `// Read the data`
+ `byte buf[] = new byte[obj.size()];`
+ `obj.read(buf, 0, obj.size());`
+ `// Do something with the data read here`<br />
+
+ `// Close the object`
+ `obj.close();`
+`}`
+`rs.close();`
+`ps.close();`<br />
+
+`// Finally, commit the transaction.`
+`conn.commit();`
diff --git a/docs/documentation/92/callproc.md b/docs/documentation/92/callproc.md
new file mode 100644
index 0000000..bc16a35
--- /dev/null
+++ b/docs/documentation/92/callproc.md
@@ -0,0 +1,116 @@
+---
+layout: default_docs
+title: Chapter 6. Calling Stored Functions
+header: Chapter 6. Calling Stored Functions
+resource: media
+previoustitle: Creating and Modifying Database Objects
+previous: ddl.html
+nexttitle: Chapter 7. Storing Binary Data
+next: binary-data.html
+---
+
+**Table of Contents**
+
+* [Obtaining a `ResultSet` from a stored function](callproc.html#callproc-resultset)
+ * [From a Function Returning `SETOF` type](callproc.html#callproc-resultset-setof)
+ * [From a Function Returning a refcursor](callproc.html#callproc-resultset-refcursor)
+
+<a name="call-function-example"></a>
+**Example 6.1. Calling a built in stored function**
+
+This example shows how to call a PostgreSQL™ built in function, `upper`, which
+simply converts the supplied string argument to uppercase.
+
+`CallableStatement upperProc = conn.prepareCall("{ ? = call upper( ? ) }");`
+`upperProc.registerOutParameter(1, Types.VARCHAR);`
+`upperProc.setString(2, "lowercase to uppercase");`
+`upperProc.execute();`
+`String upperCased = upperProc.getString(1);`
+`upperProc.close();`
+
+<a name="callproc-resultset"></a>
+# Obtaining a `ResultSet` from a stored function
+
+PostgreSQL's™ stored functions can return results in two different ways. The
+function may return either a refcursor value or a `SETOF` some datatype. Depending
+on which of these return methods are used determines how the function should be
+called.
+
+<a name="callproc-resultset-setof"></a>
+## From a Function Returning `SETOF` type
+
+Functions that return data as a set should not be called via the `CallableStatement`
+interface, but instead should use the normal `Statement` or `PreparedStatement`
+interfaces.
+
+<a name="setof-resultset"></a>
+**Example 6.2. Getting `SETOF` type values from a function**
+
+`Statement stmt = conn.createStatement();`
+`stmt.execute("CREATE OR REPLACE FUNCTION setoffunc() RETURNS SETOF int AS "`
+ `+ "' SELECT 1 UNION SELECT 2;' LANGUAGE sql");`
+`ResultSet rs = stmt.executeQuery("SELECT * FROM setoffunc()");`
+`while (rs.next())`
+`{`
+ `// do something`
+`}`
+`rs.close();`
+`stmt.close();`
+
+<a name="callproc-resultset-refcursor"></a>
+## From a Function Returning a refcursor
+
+When calling a function that returns a refcursor you must cast the return type of
+`getObject` to a `ResultSet`
+
+### Note
+
+> One notable limitation of the current support for a `ResultSet` created from
+a refcursor is that even though it is a cursor backed `ResultSet`, all data will
+be retrieved and cached on the client. The `Statement` fetch size parameter
+described in the section called [“Getting results based on a cursor”](query.html#query-with-cursor)
+is ignored. This limitation is a deficiency of the JDBC driver, not the server,
+and it is technically possible to remove it, we just haven't found the time.
+
+<a name="get-refcursor-from-function-call"></a>
+**Example 6.3. Getting refcursor Value From a Function**
+
+`// Setup function to call.`
+`Statement stmt = conn.createStatement();`
+`stmt.execute("CREATE OR REPLACE FUNCTION refcursorfunc() RETURNS refcursor AS '"`
+ `+ " DECLARE "`
+ `+ " mycurs refcursor; "`
+ `+ " BEGIN "`
+ `+ " OPEN mycurs FOR SELECT 1 UNION SELECT 2; "`
+ `+ " RETURN mycurs; "`
+ `+ " END;' language plpgsql");`
+`stmt.close();`<br />
+
+`// We must be inside a transaction for cursors to work.`
+`conn.setAutoCommit(false);`<br />
+
+`// Procedure call.`
+`CallableStatement proc = conn.prepareCall("{ ? = call refcursorfunc() }");`
+`proc.registerOutParameter(1, Types.OTHER);`
+`proc.execute();`
+`ResultSet results = (ResultSet) proc.getObject(1);`
+`while (results.next())`
+`{`
+ `// do something with the results.`
+`}`
+`results.close();`
+`proc.close();`
+
+It is also possible to treat the refcursor return value as a cursor name directly.
+To do this, use the `getString` of `ResultSet`. With the underlying cursor name,
+you are free to directly use cursor commands on it, such as `FETCH` and `MOVE`.
+
+<a name="refcursor-string-example"></a>
+**Example 6.4. Treating refcursor as a cursor name**
+
+`conn.setAutoCommit(false);`
+`CallableStatement proc = conn.prepareCall("{ ? = call refcursorfunc() }");`
+`proc.registerOutParameter(1, Types.OTHER);`
+`proc.execute();`
+`String cursorName = proc.getString(1);`
+`proc.close();`
\ No newline at end of file
diff --git a/docs/documentation/92/classpath.md b/docs/documentation/92/classpath.md
new file mode 100644
index 0000000..e4d0c50
--- /dev/null
+++ b/docs/documentation/92/classpath.md
@@ -0,0 +1,26 @@
+---
+layout: default_docs
+title: Setting up the Class Path
+header: Chapter 2. Setting up the JDBC Driver
+resource: media
+previoustitle: Chapter 2. Setting up the JDBC Driver
+previous: setup.html
+nexttitle: Preparing the Database Server for JDBC
+next: prepare.html
+---
+
+To use the driver, the JAR archive named `postgresql.jar` if you built from source,
+otherwise it will likely be (named with the following convention: `postgresql-*[server version]*.*[build number]*.jdbc*[JDBC version]*.jar`,
+for example `postgresql-8.0-310.jdbc3.jar`) needs to be included in the class path,
+either by putting it in the `CLASSPATH` environment variable, or by using flags on
+the **java** command line.
+
+For instance, assume we have an application that uses the JDBC driver to access
+a database, and that application is installed as `/usr/local/lib/myapp.jar`. The
+PostgreSQL™ JDBC driver installed as `/usr/local/pgsql/share/java/postgresql.jar`.
+To run the application, we would use:
+
+*export CLASSPATH=/usr/local/lib/myapp.jar:/usr/local/pgsql/share/java/postgresql.jar:*.
+*java MyApp*
+
+Loading the driver from within the application is covered in [Chapter 3, Initializing the Driver](use.html).
\ No newline at end of file
diff --git a/docs/documentation/92/connect.md b/docs/documentation/92/connect.md
new file mode 100644
index 0000000..ed1a972
--- /dev/null
+++ b/docs/documentation/92/connect.md
@@ -0,0 +1,234 @@
+---
+layout: default_docs
+title: Connecting to the Database
+header: Chapter 3. Initializing the Driver
+resource: media
+previoustitle: Loading the Driver
+previous: load.html
+nexttitle: Chapter 4. Using SSL
+next: ssl.html
+---
+
+With JDBC, a database is represented by a URL (Uniform Resource Locator). With
+PostgreSQL™, this takes one of the following forms:
+
+* jdbc:postgresql:*`database`*
+* jdbc:postgresql:/
+* jdbc:postgresql://*`host/database`*
+* jdbc:postgresql://*`host/`*
+* jdbc:postgresql://*`host:port/database`*
+* jdbc:postgresql://*`host:port/`*
+
+The parameters have the following meanings:
+
+* *`host`*
+
+ The host name of the server. Defaults to `localhost`. To specify an IPv6
+ address your must enclose the `host` parameter with square brackets, for
+ example:
+
+ jdbc:postgresql://[::1]:5740/accounting
+
+* *`port`*
+
+ The port number the server is listening on. Defaults to the PostgreSQL™
+ standard port number (5432).
+
+* *`database`*
+
+ The database name. The default is to connect to a database with the same name
+ as the user name.
+
+To connect, you need to get a `Connection` instance from JDBC. To do this, you use
+the `DriverManager.getConnection()` method:
+
+`Connection db = DriverManager.getConnection(url, username, password)`;
+
+<a name="connection-parameters"></a>
+## Connection Parameters
+
+In addition to the standard connection parameters the driver supports a number
+of additional properties which can be used to specify additional driver behaviour
+specific to PostgreSQL™. These properties may be specified in either the connection
+URL or an additional `Properties` object parameter to `DriverManager.getConnection`.
+The following examples illustrate the use of both methods to establish a SSL
+connection.
+
+`String url = "jdbc:postgresql://localhost/test";`
+`Properties props = new Properties();`
+`props.setProperty("user","fred");`
+`props.setProperty("password","secret");`
+`props.setProperty("ssl","true");`
+`Connection conn = DriverManager.getConnection(url, props);`
+
+`String url = "jdbc:postgresql://localhost/test?user=fred&password=secret&ssl=true";`
+`Connection conn = DriverManager.getConnection(url);`
+
+* `user = String`
+
+ The database user on whose behalf the connection is being made.
+
+* `password = String`
+
+ The database user's password.
+
+* `ssl`
+
+ Connect using SSL. The driver must have been compiled with SSL support.
+ This property does not need a value associated with it. The mere presence
+ of it specifies a SSL connection. However, for compatibility with future
+ versions, the value "true" is preferred. For more information see [Chapter
+ 4, *Using SSL*](ssl.html).
+
+* `sslfactory = String`
+
+ The provided value is a class name to use as the `SSLSocketFactory` when
+ establishing a SSL connection. For more information see the section
+ called [“Custom SSLSocketFactory”](ssl-factory.html).
+
+* `sslfactoryarg = String`
+
+ This value is an optional argument to the constructor of the sslfactory
+ class provided above. For more information see the section called [“Custom SSLSocketFactory”](ssl-factory.html).
+
+* `compatible = String`
+
+ Act like an older version of the driver to retain compatibility with older
+ applications. At the moment this controls two driver behaviours: the
+ handling of binary data fields, and the handling of parameters set via
+ `setString()`.
+
+ Older versions of the driver used this property to also control the
+ protocol used to connect to the backend. This is now controlled by the
+ `protocolVersion` property.
+
+ Information on binary data handling is detailed in [Chapter 7, Storing Binary Data](binary-data.html).
+ To force the use of Large Objects set the compatible property to 7.1.
+
+ When `compatible` is set to 7.4 or below, the default for the `stringtype`
+ parameter is changed to `unspecified`.
+
+* `sendBufferSize = int`
+ Sets SO_SNDBUF on the connection stream
+
+* `recvBufferSize = int`
+ Sets SO_RCVBUF on the connection stream
+
+* `protocolVersion = String`
+
+ The driver supports both the V2 and V3 frontend/backend protocols. The
+ V3 protocol was introduced in 7.4 and the driver will by default try to
+ connect using the V3 protocol, if that fails it will fall back to the V2
+ protocol. If the protocolVersion property is specified, the driver will
+ try only the specified protocol (which should be either "2" or "3").
+ Setting protocolVersion to "2" may be used to avoid the failed attempt
+ to use the V3 protocol when connecting to a version 7.3 or earlier server,
+ or to force the driver to use the V2 protocol despite connecting to a 7.4
+ or greater server.
+
+* `loglevel = int`
+
+ Set the amount of logging information printed to the DriverManager's
+ current value for LogStream or LogWriter. It currently supports values
+ of `org.postgresql.Driver.DEBUG` (2) and `org.postgresql.Driver.INFO` (1).
+ `INFO` will log very little information while `DEBUG` will produce significant
+ detail. This property is only really useful if you are a developer or
+ are having problems with the driver.
+
+* `charSet = String`
+
+ The character set to use for data sent to the database or received from
+ the database. This property is only relevant for server versions less
+ than or equal to 7.2. The 7.3 release was the first with multibyte support
+ compiled by default and the driver uses its character set translation
+ facilities instead of trying to do it itself.
+
+* `allowEncodingChanges = boolean`
+
+ When using the V3 protocol the driver monitors changes in certain server
+ configuration parameters that should not be touched by end users. The
+ `client_encoding` setting is set by the driver and should not be altered.
+ If the driver detects a change it will abort the connection. There is
+ one legitimate exception to this behaviour though, using the `COPY` command
+ on a file residing on the server's filesystem. The only means of specifying
+ the encoding of this file is by altering the `client_encoding` setting.
+ The JDBC team considers this a failing of the `COPY` command and hopes to
+ provide an alternate means of specifying the encoding in the future, but
+ for now there is this URL parameter. Enable this only if you need to
+ override the client encoding when doing a copy.
+
+* `logUnclosedConnections = boolean`
+
+ Clients may leak `Connection` objects by failing to call its `close()`
+ method. Eventually these objects will be garbage collected and the
+ `finalize()` method will be called which will close the `Connection` if
+ caller has neglected to do this himself. The usage of a finalizer is just
+ a stopgap solution. To help developers detect and correct the source of
+ these leaks the `logUnclosedConnections` URL parameter has been added.
+ It captures a stacktrace at each `Connection` opening and if the `finalize()`
+ method is reached without having been closed the stacktrace is printed
+ to the log.
+
+* `prepareThreshold = int`
+
+ Determine the number of `PreparedStatement` executions required before
+ switching over to use server side prepared statements. The default is
+ five, meaning start using server side prepared statements on the fifth
+ execution of the same `PreparedStatement` object. More information on
+ server side prepared statements is available in the section called
+ [“Server Prepared Statements”](server-prepare.html).
+
+* `loginTimeout = int`
+
+ Specify how long to wait for establishment of a database connection. The
+ timeout is specified in seconds.
+
+* `socketTimeout = int`
+
+ The timeout value used for socket read operations. If reading from the
+ server takes longer than this value, the connection is closed. This can
+ be used as both a brute force global query timeout and a method of
+ detecting network problems. The timeout is specified in seconds and a
+ value of zero means that it is disabled.
+
+* `tcpKeepAlive = boolean`
+
+ Enable or disable TCP keep-alive probe. The default is `false`.
+
+* `unknownLength = int`
+
+ Certain postgresql types such as `TEXT` do not have a well defined length.
+ When returning meta-data about these types through functions like
+ `ResultSetMetaData.getColumnDisplaySize` and `ResultSetMetaData.getPrecision`
+ we must provide a value and various client tools have different ideas
+ about what they would like to see. This parameter specifies the length
+ to return for types of unknown length.
+
+* `stringtype = String`
+
+ Specify the type to use when binding `PreparedStatement` parameters set
+ via `setString()`. If `stringtype` is set to `VARCHAR` (the default), such
+ parameters will be sent to the server as varchar parameters. If `stringtype`
+ is set to `unspecified`, parameters will be sent to the server as untyped
+ values, and the server will attempt to infer an appropriate type. This
+ is useful if you have an existing application that uses `setString()` to
+ set parameters that are actually some other type, such as integers, and
+ you are unable to change the application to use an appropriate method
+ such as `setInt()`.
+
+* `kerberosServerName = String`
+
+ The Kerberos service name to use when authenticating with GSSAPI. This
+ is equivalent to libpq's PGKRBSRVNAME environment variable and defaults
+ to "postgres".
+
+* `jaasApplicationName = String`
+
+ Specifies the name of the JAAS system or application login configuration.
+
+* `ApplicationName = String`
+
+ Specifies the name of the application that is using the connection.
+ This allows a database administrator to see what applications are
+ connected to the server and what resources they are using through views like pg_stat_activity.
+
diff --git a/docs/documentation/92/datasource.md b/docs/documentation/92/datasource.md
new file mode 100644
index 0000000..c67b1c4
--- /dev/null
+++ b/docs/documentation/92/datasource.md
@@ -0,0 +1,44 @@
+---
+layout: default_docs
+title: Chapter 11. Connection Pools and Data Sources
+header: Chapter 11. Connection Pools and Data Sources
+resource: media
+previoustitle: Chapter 10. Using the Driver in a Multithreaded or a Servlet Environment
+previous: thread.html
+nexttitle: Application Servers ConnectionPoolDataSource
+next: ds-cpds.html
+---
+
+**Table of Contents**
+
+* [Overview](datasource.html#ds-intro)
+* [Application Servers: `ConnectionPoolDataSource`](ds-cpds.html)
+* [Applications: `DataSource`](ds-ds.html)
+* [Tomcat setup](tomcat.html)
+* [Data Sources and JNDI](jndi.html)
+
+JDBC 2 introduced standard connection pooling features in an add-on API known as
+the JDBC 2.0 Optional Package (also known as the JDBC 2.0 Standard Extension).
+These features have since been included in the core JDBC 3 API.
+
+<a name="ds-intro"></a>
+# Overview
+
+The JDBC API provides a client and a server interface for connection pooling.
+The client interface is `javax.sql.DataSource`, which is what application code
+will typically use to acquire a pooled database connection. The server interface
+is `javax.sql.ConnectionPoolDataSource`, which is how most application servers
+will interface with the PostgreSQL™ JDBC driver.
+
+In an application server environment, the application server configuration will
+typically refer to the PostgreSQL™ `ConnectionPoolDataSource` implementation,
+while the application component code will typically acquire a `DataSource`
+implementation provided by the application server (not by PostgreSQL™).
+
+For an environment without an application server, PostgreSQL™ provides two
+implementations of `DataSource` which an application can use directly. One
+implementation performs connection pooling, while the other simply provides
+access to database connections through the `DataSource` interface without any
+pooling. Again, these implementations should not be used in an application server
+environment unless the application server does not support the `ConnectionPoolDataSource`
+interface.
\ No newline at end of file
diff --git a/docs/documentation/92/ddl.md b/docs/documentation/92/ddl.md
new file mode 100644
index 0000000..a6cadad
--- /dev/null
+++ b/docs/documentation/92/ddl.md
@@ -0,0 +1,24 @@
+---
+layout: default_docs
+title: Creating and Modifying Database Objects
+header: Chapter 5. Issuing a Query and Processing the Result
+resource: media
+previoustitle: Performing Updates
+previous: update.html
+nexttitle: Chapter 6. Calling Stored Functions
+next: callproc.html
+---
+
+To create, modify or drop a database object like a table or view you use the
+`execute()` method. This method is similar to the method `executeQuery()`, but
+it doesn't return a result. [Example 5.4, “Dropping a Table in JDBC](ddl.html#drop-table-example)
+illustrates the usage.
+
+<a name="drop-table-example"></a>
+**Example 5.4. Dropping a Table in JDBC**
+
+This example will drop a table.
+
+`Statement st = conn.createStatement();`
+`st.execute("DROP TABLE mytable");`
+`st.close();`
\ No newline at end of file
diff --git a/docs/documentation/92/ds-cpds.md b/docs/documentation/92/ds-cpds.md
new file mode 100644
index 0000000..c066e4a
--- /dev/null
+++ b/docs/documentation/92/ds-cpds.md
@@ -0,0 +1,93 @@
+---
+layout: default_docs
+title: Application Servers ConnectionPoolDataSource
+header: Chapter 11. Connection Pools and Data Sources
+resource: media
+previoustitle: Chapter 11. Connection Pools and Data Sources
+previous: datasource.html
+nexttitle: Applications DataSource
+next: ds-ds.html
+---
+
+PostgreSQL™ includes one implementation of `ConnectionPoolDataSource` named
+`org.postgresql.ds.PGConnectionPoolDataSource`.
+
+JDBC requires that a `ConnectionPoolDataSource` be configured via JavaBean
+properties, shown in [Table 11.1, “`ConnectionPoolDataSource` Configuration Properties”](ds-cpds.html#ds-cpds-props),
+so there are get and set methods for each of these properties.
+
+<a name="ds-cpds-props"></a>
+**Table 11.1. `ConnectionPoolDataSource` Configuration Properties**
+
+<table summary="ConnectionPoolDataSource Configuration Properties"
+ border="1">
+ <tr>
+ <th>Property</th>
+ <th>Type</th>
+ <th>Description</th>
+ </tr>
+ <tbody>
+ <tr>
+ <td>serverName</td>
+ <td>STRING</td>
+ <td>PostgreSQL™ database server
+host name</td>
+ </tr>
+ <tr>
+ <td>databaseName</td>
+ <td>STRING</td>
+ <td>PostgreSQL™ database name</td>
+ </tr>
+ <tr>
+ <td>portNumber</td>
+ <td>INT</td>
+ <td> TCP port which the PostgreSQL™
+
+database server is listening on (or 0 to use the default port) </td>
+ </tr>
+ <tr>
+ <td>user</td>
+ <td>STRING</td>
+ <td>User used to make database connections</td>
+ </tr>
+ <tr>
+ <td>password</td>
+ <td>STRING</td>
+ <td>Password used to make database connections</td>
+ </tr>
+ <tr>
+ <td>ssl</td>
+ <td>BOOLEAN</td>
+ <td> If `true`, use SSL encrypted
+connections (default `false`) </td>
+ </tr>
+ <tr>
+ <td>sslfactory</td>
+ <td>STRING</td>
+ <td> Custom `javax.net.ssl.SSLSocketFactory`
+class name (see the section called [“Custom
+SSLSocketFactory”](ssl-factory.html)) </td>
+ </tr>
+ <tr>
+ <td>defaultAutoCommit</td>
+ <td>BOOLEAN</td>
+ <td> Whether connections should have autocommit enabled or
+disabled when they are supplied to the caller. The default is `false`, to disable autocommit. </td>
+ </tr>
+ </tbody>
+</table>
+
+Many application servers use a properties-style syntax to configure these
+properties, so it would not be unusual to enter properties as a block of text.
+If the application server provides a single area to enter all the properties,
+they might be listed like this:
+
+`serverName=localhost`
+`databaseName=test`
+`user=testuser`
+`password=testpassword`
+
+Or, if semicolons are used as separators instead of newlines, it could look like
+this:
+
+`serverName=localhost;databaseName=test;user=testuser;password=testpassword`
\ No newline at end of file
diff --git a/docs/documentation/92/ds-ds.md b/docs/documentation/92/ds-ds.md
new file mode 100644
index 0000000..2f6d59b
--- /dev/null
+++ b/docs/documentation/92/ds-ds.md
@@ -0,0 +1,178 @@
+---
+layout: default_docs
+title: Applications DataSource
+header: Chapter 11. Connection Pools and Data Sources
+resource: media
+previoustitle: Application Servers ConnectionPoolDataSource
+previous: ds-cpds.html
+nexttitle: Tomcat setup
+next: tomcat.html
+---
+
+PostgreSQL™ includes two implementations of `DataSource`, as shown in [Table 11.2, “`DataSource` Implementations”](ds-ds.html#ds-ds-imp).
+One that does pooling and the other that does not. The pooling implementation
+does not actually close connections when the client calls the `close` method,
+but instead returns the connections to a pool of available connections for other
+clients to use. This avoids any overhead of repeatedly opening and closing
+connections, and allows a large number of clients to share a small number of
+database connections.
+
+The pooling data-source implementation provided here is not the most feature-rich
+in the world. Among other things, connections are never closed until the pool
+itself is closed; there is no way to shrink the pool. As well, connections
+requested for users other than the default configured user are not pooled. Its
+error handling sometimes cannot remove a broken connection from the pool. In
+general it is not recommended to use the PostgreSQL™ provided connection pool.
+Check your application server or check out the excellent [jakarta commons DBCP](http://jakarta.apache.org/commons/dbcp/)
+project.
+
+<a name="ds-ds-imp"></a>
+**Table 11.2. `DataSource` Implementations**
+
+<table summary="DataSource Implementations" border="1">
+ <tr>
+ <th>Pooling</th>
+ <th>Implementation Class</th>
+ </tr>
+ <tbody>
+ <tr>
+ <td>No</td>
+ <td>`org.postgresql.ds.PGSimpleDataSource</td>
+ </tr>
+ <tr>
+ <td>Yes</td>
+ <td>`org.postgresql.ds.PGPoolingDataSource</td>
+ </tr>
+ </tbody>
+</table>
+
+Both implementations use the same configuration scheme. JDBC requires that a
+`DataSource` be configured via JavaBean properties, shown in [Table 11.3, “`DataSource` Configuration Properties”](ds-ds.html#ds-ds-props),
+so there are get and set methods for each of these properties.
+
+<a name="ds-ds-props"></a>
+**Table 11.3. `DataSource` Configuration Properties**
+
+<table summary="DataSource Configuration Properties" border="1">
+ <tr>
+ <th>Property</th>
+ <th>Type</th>
+ <th>Description</th>
+ </tr>
+ <tbody>
+ <tr>
+ <td>serverName</td>
+ <td>STRING</td>
+ <td>PostgreSQL™ database server host name</td>
+ </tr>
+ <tr>
+ <td>databaseName</td>
+ <td>STRING</td>
+ <td>PostgreSQL™ database name</td>
+ </tr>
+ <tr>
+ <td>portNumber</td>
+ <td>INT</td>
+ <td>TCP port which the PostgreSQL™
+database server is listening on (or 0 to use the default port)</td>
+ </tr>
+ <tr>
+ <td>user</td>
+ <td>STRING</td>
+ <td>User used to make database connections</td>
+ </tr>
+ <tr>
+ <td>password</td>
+ <td>STRING</td>
+ <td>Password used to make database connections</td>
+ </tr>
+ <tr>
+ <td>ssl</td>
+ <td>BOOLEAN</td>
+ <td> If true, use SSL encrypted
+connections (default false) </td>
+ </tr>
+ <tr>
+ <td>sslfactory</td>
+ <td>STRING</td>
+ <td> Custom javax.net.ssl.SSLSocketFactory
+class name (see the section called [“Custom
+SSLSocketFactory”](ssl-factory.html))</td>
+ </tr>
+ </tbody>
+</table>
+
+The pooling implementation requires some additional configuration properties,
+which are shown in [Table 11.4, “Additional Pooling `DataSource` Configuration Properties](ds-ds.html#ds-ds-xprops).
+
+<a name="ds-ds-xprops"></a>
+**Table 11.4. Additional Pooling `DataSource` Configuration Properties**
+
+<table summary="Additional Pooling DataSource Configuration Properties" border="1">
+ <tr>
+ <th>Property</th>
+ <th>Type</th>
+ <th>Description</th>
+ </tr>
+ <tbody>
+ <tr>
+ <td>dataSourceName</td>
+ <td>STRING</td>
+ <td>Every pooling DataSource must
+have a unique name.</td>
+ </tr>
+ <tr>
+ <td>initialConnections</td>
+ <td>INT</td>
+ <td>The number of database connections to be created when the
+pool is initialized.</td>
+ </tr>
+ <tr>
+ <td>maxConnections</td>
+ <td>INT</td>
+ <td>The maximum number of open database connections to allow.
+When more connections are requested, the caller will hang until a
+connection is returned to the pool.</td>
+ </tr>
+ </tbody>
+</table>
+
+[Example 11.1, “`DataSource` Code Example”](ds-ds.html#ds-example) shows an example
+of typical application code using a pooling `DataSource`.
+
+<a name="ds-example"></a>
+**Example 11.1. `DataSource` Code Example**
+
+Code to initialize a pooling `DataSource` might look like this:
+
+`PGPoolingDataSource source = new PGPoolingDataSource();`
+`source.setDataSourceName("A Data Source");`
+`source.setServerName("localhost");`
+`source.setDatabaseName("test");`
+`source.setUser("testuser");`
+`source.setPassword("testpassword");`
+`source.setMaxConnections(10);`
+
+Then code to use a connection from the pool might look like this. Note that it
+is critical that the connections are eventually closed. Else the pool will
+“leak” connections and will eventually lock all the clients out.
+
+<pre><code>
+Connection conn = null;
+try
+{
+ conn = source.getConnection();
+ // use connection
+}
+catch (SQLException e)
+{
+ // log error
+}
+finally
+{
+ if (con != null)
+ {
+ try { conn.close(); } catch (SQLException e) {}
+ }
+}
+</code></pre>
\ No newline at end of file
diff --git a/docs/documentation/92/escaped-functions.md b/docs/documentation/92/escaped-functions.md
new file mode 100644
index 0000000..f734b28
--- /dev/null
+++ b/docs/documentation/92/escaped-functions.md
@@ -0,0 +1,480 @@
+---
+layout: default_docs
+title: Escaped scalar functions
+header: Chapter 8. JDBC escapes
+resource: media
+previoustitle: Date-time escapes
+previous: escapes-datetime.html
+nexttitle: Chapter 9. PostgreSQL™ Extensions to the JDBC API
+next: ext.html
+---
+
+The JDBC specification defines functions with an escape call syntax : `{fn function_name(arguments)}`.
+The following tables show which functions are supported by the PostgresSQL™ driver.
+The driver supports the nesting and the mixing of escaped functions and escaped
+values. The appendix C of the JDBC specification describes the functions.
+
+Some functions in the following tables are translated but not reported as supported
+because they are duplicating or changing ther order of the arguments. While this
+is harmless for literal values or columns, it will cause problems when using
+prepared statements. For example "`{fn right(?,?)}`" will be translated to "`substring(? from (length(?)+1-?))`".
+As you can see the translated SQL requires more parameters than before the
+translation but the driver will not automatically handle this.
+
+<a name="escape-numeric-functions-table"></a>
+**Table 8.1. Supported escaped numeric functions**
+
+<table summary="Supported escaped numeric functions" border="1">
+ <tr>
+ <th>function</th>
+ <th>reported as supported</th>
+ <th>translation</th>
+ <th>comments</th>
+ </tr>
+ <tbody>
+ <tr>
+ <td>abs(arg1)</td>
+ <td>yes</td>
+ <td>abs(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>acos(arg1)</td>
+ <td>yes</td>
+ <td>acos(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>asin(arg1)</td>
+ <td>yes</td>
+ <td>asin(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>atan(arg1)</td>
+ <td>yes</td>
+ <td>atan(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>atan2(arg1,arg2)</td>
+ <td>yes</td>
+ <td>atan2(arg1,arg2)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>ceiling(arg1)</td>
+ <td>yes</td>
+ <td>ceil(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>cos(arg1)</td>
+ <td>yes</td>
+ <td>cos(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>cot(arg1)</td>
+ <td>yes</td>
+ <td>cot(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>degrees(arg1)</td>
+ <td>yes</td>
+ <td>degrees(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>exp(arg1)</td>
+ <td>yes</td>
+ <td>exp(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>floor(arg1)</td>
+ <td>yes</td>
+ <td>floor(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>log(arg1)</td>
+ <td>yes</td>
+ <td>ln(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>log10(arg1)</td>
+ <td>yes</td>
+ <td>log(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>mod(arg1,arg2)</td>
+ <td>yes</td>
+ <td>mod(arg1,arg2)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>pi(arg1)</td>
+ <td>yes</td>
+ <td>pi(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>power(arg1,arg2)</td>
+ <td>yes</td>
+ <td>pow(arg1,arg2)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>radians(arg1)</td>
+ <td>yes</td>
+ <td>radians(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>rand()</td>
+ <td>yes</td>
+ <td>random()</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>rand(arg1)</td>
+ <td>yes</td>
+ <td>setseed(arg1)*0+random()</td>
+ <td>The seed is initialized with the given argument and a new randow value is returned.</td>
+ </tr>
+ <tr>
+ <td>round(arg1,arg2)</td>
+ <td>yes</td>
+ <td>round(arg1,arg2)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>sign(arg1)</td>
+ <td>yes</td>
+ <td>sign(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>sin(arg1)</td>
+ <td>yes</td>
+ <td>sin(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>sqrt(arg1)</td>
+ <td>yes</td>
+ <td>sqrt(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>tan(arg1)</td>
+ <td>yes</td>
+ <td>tan(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>truncate(arg1,arg2)</td>
+ <td>yes</td>
+ <td>trunc(arg1,arg2)</td>
+ <td> </td>
+ </tr>
+ </tbody>
+</table>
+
+<a name="escape-string-functions-table"></a>
+**Table 8.2. Supported escaped string functions**
+
+<table summary="Supported escaped string functions" border="1">
+ <tr>
+ <th>function</th>
+ <th>reported as supported</th>
+ <th>translation</th>
+ <th>comments</th>
+ </tr>
+ <tbody>
+ <tr>
+ <td>ascii(arg1)</td>
+ <td>yes</td>
+ <td>ascii(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>char(arg1)</td>
+ <td>yes</td>
+ <td>chr(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>concat(arg1,arg2...)</td>
+ <td>yes</td>
+ <td>(arg1||arg2...)</td>
+ <td>The JDBC specification
+only require the two arguments version, but supporting more arguments
+was so easy...</td>
+ </tr>
+ <tr>
+ <td>insert(arg1,arg2,arg3,arg4)</td>
+ <td>no</td>
+ <td>overlay(arg1 placing arg4 from arg2 for arg3)</td>
+ <td>This function is not reported as supported since it changes
+the order of the arguments which can be a problem (for prepared
+statements by example).</td>
+ </tr>
+ <tr>
+ <td>lcase(arg1)</td>
+ <td>yes</td>
+ <td>lower(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>left(arg1,arg2)</td>
+ <td>yes</td>
+ <td>substring(arg1 for arg2)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>length(arg1)</td>
+ <td>yes</td>
+ <td>length(trim(trailing from arg1))</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>locate(arg1,arg2)</td>
+ <td>no</td>
+ <td>position(arg1 in arg2)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>locate(arg1,arg2,arg3)</td>
+ <td>no</td>
+ <td>(arg2*sign(position(arg1 in substring(arg2 from
+arg3)+position(arg1 in substring(arg2 from arg3))</td>
+ <td>Not reported as supported since the three arguments version
+duplicate and change the order of the arguments.</td>
+ </tr>
+ <tr>
+ <td>ltrim(arg1)</td>
+ <td>yes</td>
+ <td>trim(leading from arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>repeat(arg1,arg2)</td>
+ <td>yes</td>
+ <td>repeat(arg1,arg2)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>replace(arg1,arg2,arg3)</td>
+ <td>yes</td>
+ <td>replace(arg1,arg2,arg3)</td>
+ <td>Only reported as supported by 7.3 and above servers.</td>
+ </tr>
+ <tr>
+ <td>right(arg1,arg2)</td>
+ <td>no</td>
+ <td>substring(arg1 from (length(arg1)+1-arg2))</td>
+ <td>Not reported as supported since arg2 is duplicated.</td>
+ </tr>
+ <tr>
+ <td>rtrim(arg1)</td>
+ <td>yes</td>
+ <td>trim(trailing from arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>space(arg1)</td>
+ <td>yes</td>
+ <td>repeat(' ',arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>substring(arg1,arg2)</td>
+ <td>yes</td>
+ <td>substr(arg1,arg2)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>substring(arg1,arg2,arg3)</td>
+ <td>yes</td>
+ <td>substr(arg1,arg2,arg3)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>ucase(arg1)</td>
+ <td>yes</td>
+ <td>upper(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>soundex(arg1)</td>
+ <td>no</td>
+ <td>soundex(arg1)</td>
+ <td>Not reported as supported since it requires the fuzzystrmatch
+contrib module.</td>
+ </tr>
+ <tr>
+ <td>difference(arg1,arg2)</td>
+ <td>no</td>
+ <td>difference(arg1,arg2)</td>
+ <td>Not reported as supported since it requires the fuzzystrmatch
+contrib module.</td>
+ </tr>
+ </tbody>
+</table>
+
+<a name="escape-datetime-functions-table"></a>
+**Table 8.3. Supported escaped date/time functions**
+
+<table summary="Supported escaped date/time functions" border="1">
+ <tr>
+ <th>function</th>
+ <th>reported as supported</th>
+ <th>translation</th>
+ <th>comments</th>
+ </tr>
+ <tbody>
+ <tr>
+ <td>curdate()</td>
+ <td>yes</td>
+ <td>current_date</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>curtime()</td>
+ <td>yes</td>
+ <td>current_time</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>dayname(arg1)</td>
+ <td>yes</td>
+ <td>to_char(arg1,'Day')</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>dayofmonth(arg1)</td>
+ <td>yes</td>
+ <td>extract(day from arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>dayofweek(arg1)</td>
+ <td>yes</td>
+ <td>extract(dow from arg1)+1</td>
+ <td>We must add 1 to be in the expected 1-7 range.</td>
+ </tr>
+ <tr>
+ <td>dayofyear(arg1)</td>
+ <td>yes</td>
+ <td>extract(doy from arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>hour(arg1)</td>
+ <td>yes</td>
+ <td>extract(hour from arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>minute(arg1)</td>
+ <td>yes</td>
+ <td>extract(minute from arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>month(arg1)</td>
+ <td>yes</td>
+ <td>extract(month from arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>monthname(arg1)</td>
+ <td>yes</td>
+ <td>to_char(arg1,'Month')</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>now()</td>
+ <td>yes</td>
+ <td>now()</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>quarter(arg1)</td>
+ <td>yes</td>
+ <td>extract(quarter from arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>second(arg1)</td>
+ <td>yes</td>
+ <td>extract(second from arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>week(arg1)</td>
+ <td>yes</td>
+ <td>extract(week from arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>year(arg1)</td>
+ <td>yes</td>
+ <td>extract(year from arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>timestampadd(argIntervalType,argCount,argTimeStamp)</td>
+ <td>yes</td>
+ <td>('(interval according to argIntervalType and
+argCount)'+argTimeStamp)</td>
+ <td>an argIntervalType value of SQL_TSI_FRAC_SECOND
+is not implemented since backend does not support it</td>
+ </tr>
+ <tr>
+ <td>timestampdiff(argIntervalType,argTimeStamp1,argTimeStamp2)</td>
+ <td>not</td>
+ <td>extract((interval according to argIntervalType) from
+argTimeStamp2-argTimeStamp1 )</td>
+ <td>only an argIntervalType value of SQL_TSI_FRAC_SECOND, SQL_TSI_FRAC_MINUTE, SQL_TSI_FRAC_HOUR
+or SQL_TSI_FRAC_DAY is supported </td>
+ </tr>
+ </tbody>
+</table>
+
+<a name="escape-misc-functions-table"></a>
+**Table 8.4. Supported escaped misc functions**
+
+<table summary="Supported escaped misc functions" border="1">
+ <tr>
+ <th>function</th>
+ <th>reported as supported</th>
+ <th>translation</th>
+ <th>comments</th>
+ </tr>
+ <tbody>
+ <tr>
+ <td>database()</td>
+ <td>yes</td>
+ <td>current_database()</td>
+ <td>Only reported as supported by 7.3 and above servers.</td>
+ </tr>
+ <tr>
+ <td>ifnull(arg1,arg2)</td>
+ <td>yes</td>
+ <td>coalesce(arg1,arg2)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>user()</td>
+ <td>yes</td>
+ <td>user</td>
+ <td> </td>
+ </tr>
+ </tbody>
+</table>
\ No newline at end of file
diff --git a/docs/documentation/92/escapes-datetime.md b/docs/documentation/92/escapes-datetime.md
new file mode 100644
index 0000000..6d1e11d
--- /dev/null
+++ b/docs/documentation/92/escapes-datetime.md
@@ -0,0 +1,23 @@
+---
+layout: default_docs
+title: Date-time escapes
+header: Chapter 8. JDBC escapes
+resource: media
+previoustitle: Escape for outer joins
+previous: outer-joins-escape.html
+nexttitle: Escaped scalar functions
+next: escaped-functions.html
+---
+
+The JDBC specification defines escapes for specifying date, time and timestamp
+values which are supported by the driver.
+
+> date
+>> `{d 'yyyy-mm-dd'}` which is translated to `DATE 'yyyy-mm-dd'`
+
+> time
+>> `{t 'hh:mm:ss'}` which is translated to `TIME 'hh:mm:ss'`
+
+> timestamp
+>> `{ts 'yyyy-mm-dd hh:mm:ss.f...'}` which is translated to `TIMESTAMP 'yyyy-mm-dd hh:mm:ss.f'`<br /><br />
+>> The fractional seconds (.f...) portion of the TIMESTAMP can be omitted.
\ No newline at end of file
diff --git a/docs/documentation/92/escapes.md b/docs/documentation/92/escapes.md
new file mode 100644
index 0000000..3bf4f72
--- /dev/null
+++ b/docs/documentation/92/escapes.md
@@ -0,0 +1,57 @@
+---
+layout: default_docs
+title: Chapter 8. JDBC escapes
+header: Chapter 8. JDBC escapes
+resource: media
+previoustitle: Chapter 7. Storing Binary Data
+previous: binary-data.html
+nexttitle: Escape for outer joins
+next: outer-joins-escape.html
+---
+
+**Table of Contents**
+
+* [Escape for like escape character](escapes.html#like-escape)
+* [Escape for outer joins](outer-joins-escape.html)
+* [Date-time escapes](escapes-datetime.html)
+* [Escaped scalar functions](escaped-functions.html)
+
+The JDBC specification (like the ODBC specification) acknowledges the fact that
+some vendor specific SQL may be required for certain RDBMS features. To aid
+developers in writing portable JDBC applications across multiple database products,
+a special escape syntax is used to specify the generic commands the developer
+wants to be run. The JDBC driver translates these escape sequences into native
+syntax for its specific database. For more information consult the section 4.1.5
+from the [JDBC Technology Guide](http://java.sun.com/j2se/1.4.2/docs/guide/jdbc/getstart/statement.html#999472)
+(bundled with the Oracle™ JRE documentation) and the section 13.4 from the
+[JDBC 3.0 specification](http://java.sun.com/products/jdbc/download.html#corespec30).
+
+The parsing of the sql statements for these escapes can be disabled using
+`Statement.setEscapeProcessing(false)`.
+
+`Connection.nativeSQL(String sql)` provides another way to have escapes processed.
+It translates the given SQL to a SQL suitable for the PostgreSQL™ backend.
+
+<a name="escape-use-example"></a>
+**Example 8.1. Using jdbc escapes**
+
+To use the JDBC escapes, you simply write your SQL replacing date/time literal
+values, outer join and functions by the JDBC escape syntax. For example :
+
+`ResultSet rs = st.executeQuery("SELECT {fn week({d '2005-01-24'})}");`
+
+is the portable version for
+
+`ResultSet rs = st.executeQuery("SELECT extract(week from DATE '2005-01-24')");`
+
+<a name="like-escape"></a>
+# Escape for like escape character
+
+You can specify which escape character to use in strings comparison (with `LIKE`)
+to protect wildcards characters ('%' and '_') by adding the following escape :
+`{escape 'escape-character'}`. The driver supports this only at the end of the
+comparison expression.
+
+For example, you can compare string values using '|' as escape character to protect '_' :
+
+`rs = stmt.executeQuery("select str2 from comparisontest where str1 like '|_abcd' {escape '|'} ");`
diff --git a/docs/documentation/92/ext.md b/docs/documentation/92/ext.md
new file mode 100644
index 0000000..553eb57
--- /dev/null
+++ b/docs/documentation/92/ext.md
@@ -0,0 +1,36 @@
+---
+layout: default_docs
+title: Chapter 9. PostgreSQL™ Extensions to the JDBC API
+header: Chapter 9. PostgreSQL™ Extensions to the JDBC API
+resource: media
+previoustitle: Escaped scalar functions
+previous: escaped-functions.html
+nexttitle: Geometric Data Types
+next: geometric.html
+---
+
+**Table of Contents**
+
+* [Accessing the Extensions](ext.html#extensions)
+* [Geometric Data Types](geometric.html)
+* [Large Objects](largeobjects.html)
+* [Listen / Notify](listennotify.html)
+* [Server Prepared Statements](server-prepare.html)
+
+PostgreSQL™ is an extensible database system. You can add your own functions to
+the server, which can then be called from queries, or even add your own data types.
+As these are facilities unique to PostgreSQL™, we support them from Java, with a
+set of extension APIs. Some features within the core of the standard driver
+actually use these extensions to implement Large Objects, etc.
+
+<a name="extensions"></a>
+# Accessing the Extensions
+
+To access some of the extensions, you need to use some extra methods in the
+`org.postgresql.PGConnection` class. In this case, you would need to case the
+return value of `Driver.getConnection()`. For example:
+
+`Connection db = Driver.getConnection(url, username, password);`
+`// ...`
+`// later on`
+`Fastpath fp = db.unwrap(org.postgresql.PGConnection.class).getFastpathAPI();`
diff --git a/docs/documentation/92/geometric.md b/docs/documentation/92/geometric.md
new file mode 100644
index 0000000..284985c
--- /dev/null
+++ b/docs/documentation/92/geometric.md
@@ -0,0 +1,68 @@
+---
+layout: default_docs
+title: Geometric Data Types
+header: Chapter 9. PostgreSQL™ Extensions to the JDBC API
+resource: media
+previoustitle: Chapter 9. PostgreSQL™ Extensions to the JDBC API
+previous: ext.html
+nexttitle: Large Objects
+next: largeobjects.html
+---
+
+PostgreSQL™ has a set of data types that can store geometric features into a
+table. These include single points, lines, and polygons. We support these types
+in Java with the org.postgresql.geometric package. Please consult the Javadoc
+for the details of available classes and features metioned in [Chapter 12, *Further Reading*](reading.html).
+
+<a name="geometric-circle-example"></a>
+**Example 9.1. Using the CIRCLE datatype JDBC**
+
+import java.sql.*;
+
+import org.postgresql.geometric.PGpoint;
+import org.postgresql.geometric.PGcircle;
+
+public class GeometricTest {
+
+ public static void main(String args[]) throws Exception {
+ Class.forName("org.postgresql.Driver");
+ String url = "jdbc:postgresql://localhost:5432/test";
+
+ Connection conn = DriverManager.getConnection(url,"test","");
+
+ Statement stmt = conn.createStatement();
+ stmt.execute("CREATE TEMP TABLE geomtest(mycirc circle)");
+ stmt.close();
+
+ insertCircle(conn);
+ retrieveCircle(conn);
+ conn.close();
+ }
+
+ private static void insertCircle(Connection conn) throws SQLException {
+
+ PGpoint center = new PGpoint(1, 2.5);
+ double radius = 4;
+ PGcircle circle = new PGcircle(center, radius);
+
+ PreparedStatement ps = conn.prepareStatement("INSERT INTO geomtest(mycirc) VALUES (?)");
+ ps.setObject(1, circle);
+ ps.executeUpdate();
+ ps.close();
+ }
+
+ private static void retrieveCircle(Connection conn) throws SQLException {
+ Statement stmt = conn.createStatement();
+ ResultSet rs = stmt.executeQuery("SELECT mycirc, area(mycirc) FROM geomtest");
+ rs.next();
+ PGcircle circle = (PGcircle)rs.getObject(1);
+ double area = rs.getDouble(2);
+
+ PGpoint center = circle.center;
+ double radius = circle.radius;
+
+ System.out.println("Center (X, Y) = (" + center.x + ", " + center.y + ")");
+ System.out.println("Radius = " + radius);
+ System.out.println("Area = " + area);
+ }
+}
\ No newline at end of file
diff --git a/docs/documentation/92/index.html b/docs/documentation/92/index.html
new file mode 100644
index 0000000..bf391bb
--- /dev/null
+++ b/docs/documentation/92/index.html
@@ -0,0 +1,253 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en" dir="ltr">
+<head>
+ <title>The PostgreSQL™ JDBC Interface</title>
+ <meta http-equiv="Content-Type" content="text/xhtml; charset=utf-8" />
+ <meta name="description" content="The official site for the PostgreSQL JDBC Driver" />
+ <meta name="copyright" content="The PostgreSQL Global Development Group" />
+
+ <style type="text/css" media="screen" title="Normal Text">@import url("media/css/docs.css");</style>
+
+ <link rel="shortcut icon" href="media/favicon.ico" />
+</head>
+
+
+<body>
+ <div id="docHeader">
+ <div id="docHeaderLogo">
+ <a href="http://www.postgresql.org/" title="PostgreSQL"><img src="media/img/layout/hdr_left3a.png" alt="PostgreSQL" height="80" width="390" /></a>
+ </div>
+ </div>
+
+ <div id="docContainerWrap">
+ <div id="docContainer">
+ <div id="docContent">
+ <div class="BOOK">
+ <a name="POSTGRES" id="POSTGRES"></a>
+ <div class="TITLEPAGE">
+ <h1 class="TITLE">The PostgreSQL JDBC Interface</h1>
+ <hr />
+ </div>
+
+ <div class="TOC">
+ <h3 class="c2">Table of Contents</h3>
+ <dl>
+ <!-- <dt class="c1">Table of Contents</dt> -->
+
+ <dt>1. <a href="intro.html">Introduction</a></dt>
+
+ <dt>2. <a href="setup.html">Setting up the JDBC Driver</a></dt>
+ <dd>
+ <dl>
+ <dt><a href="setup.html#build">Getting the Driver</a></dt>
+ <dt><a href="classpath.html">Setting up the Class Path</a></dt>
+ <dt><a href="prepare.html">Preparing the Database Server for <acronym class="ACRONYM">JDBC</acronym></a></dt>
+ <dt><a href="your-database.html">Creating a Database</a></dt>
+ </dl>
+ </dd>
+
+ <dt>3. <a href="use.html">Initializing the Driver</a></dt>
+ <dd>
+ <dl>
+ <dt><a href="use.html#import">Importing <acronym class="ACRONYM">JDBC</acronym></a></dt>
+ <dt><a href="load.html">Loading the Driver</a></dt>
+ <dt><a href="connect.html">Connecting to the Database</a></dt>
+ <dd>
+ <dl>
+ <dt><a href="connect.html#connection-parameters">Connection Parameters</a></dt>
+ </dl>
+ </dd>
+ </dl>
+ </dd>
+
+ <dt>4. <a href="ssl.html">Using <acronym class="ACRONYM">SSL</acronym></a></dt>
+ <dd>
+ <dl>
+ <dt><a href="ssl.html#ssl-server">Configuring the Server</a></dt>
+ <dt><a href="ssl-client.html">Configuring the Client</a></dt>
+ <dd>
+ <dl>
+ <dt><a href="ssl-client.html#nonvalidating">Using SSL without Certificate Validation</a></dt>
+ </dl>
+ </dd>
+ <dt><a href="ssl-factory.html">Custom SSLSocketFactory</a></dt>
+ </dl>
+ </dd>
+
+ <dt>5. <a href="query.html">Issuing a Query and Processing the Result</a></dt>
+ <dd>
+ <dl>
+ <dt><a href="query.html#query-with-cursor">Getting results based on a cursor</a></dt>
+ <dt><a href="statement.html">Using the Statement or PreparedStatement Interface</a></dt>
+ <dt><a href="resultset.html">Using the ResultSet Interface</a></dt>
+ <dt><a href="update.html">Performing Updates</a></dt>
+ <dt><a href="ddl.html">Creating and Modifying Database Objects</a></dt>
+ </dl>
+ </dd>
+
+ <dt>6. <a href="callproc.html">Calling Stored Functions</a></dt>
+ <dd>
+ <dl>
+ <dt><a href="callproc.html#callproc-resultset">Obtaining a ResultSet from a stored function</a></dt>
+ <dd>
+ <dl>
+ <dt><a href="callproc.html#callproc-resultset-setof">From a Function Returning SETOF type</a></dt>
+ <dt><a href="callproc.html#callproc-resultset-refcursor">From a Function Returning a <span class="type">refcursor</span></a></dt>
+ </dl>
+ </dd>
+ </dl>
+ </dd>
+
+ <dt>7. <a href="binary-data.html">Storing Binary Data</a></dt>
+
+ <dt>8. <a href="escapes.html"><acronym class="ACRONYM">JDBC</acronym> escapes</a></dt>
+ <dd>
+ <dl>
+ <dt><a href="escapes.html#like-escape">Escape for like escape character</a></dt>
+ <dt><a href="outer-joins-escape.html">Escape for outer joins</a></dt>
+ <dt><a href="escapes-datetime.html">Date-time escapes</a></dt>
+ <dt><a href="escaped-functions.html">Escaped scalar functions</a></dt>
+ </dl>
+ </dd>
+
+ <dt>9. <a href="ext.html">PostgreSQL™ Extensions to the <acronym class="ACRONYM">JDBC</acronym> <acronym class="ACRONYM">API</acronym></a></dt>
+ <dd>
+ <dl>
+ <dt><a href="ext.html#extensions">Accessing the Extensions</a></dt>
+ <dt><a href="geometric.html">Geometric Data Types</a></dt>
+ <dt><a href="largeobjects.html">Large Objects</a></dt>
+ <dt><a href="listennotify.html">Listen / Notify</a></dt>
+ <dt><a href="server-prepare.html">Server Prepared Statements</a></dt>
+ </dl>
+ </dd>
+
+ <dt>10. <a href="thread.html">Using the Driver in a Multithreaded or a Servlet Environment</a></dt>
+
+ <dt>11. <a href="datasource.html">Connection Pools and Data Sources</a></dt>
+ <dd>
+ <dl>
+ <dt><a href="datasource.html#ds-intro">Overview</a></dt>
+ <dt><a href="ds-cpds.html">Application Servers: ConnectionPoolDataSource</a></dt>
+ <dt><a href="ds-ds.html">Applications: DataSource</a></dt>
+ <dt><a href="tomcat.html">Tomcat setup</a></dt>
+ <dt><a href="jndi.html">Data Sources and <acronym class="ACRONYM">JNDI</acronym></a></dt>
+ </dl>
+ </dd>
+
+ <dt>12. <a href="reading.html">Further Reading</a></dt>
+ </dl>
+ </div>
+
+ <div class="LOT">
+ <h3 class="c2">List of Tables</h3>
+ <dl class="LOT">
+ <!-- <dt class="c1">List of Tables</dt> -->
+ <dt>
+ 8.1. <a href="escaped-functions.html#escape-numeric-functions-table">Supported escaped numeric functions</a>
+ </dt>
+ <dt>
+ 8.2. <a href="escaped-functions.html#escape-string-functions-table">Supported escaped string functions</a>
+ </dt>
+ <dt>
+ 8.3. <a href="escaped-functions.html#escape-datetime-functions-table">Supported escaped date/time functions</a>
+ </dt>
+ <dt>
+ 8.4. <a href="escaped-functions.html#escape-misc-functions-table">Supported escaped misc functions</a>
+ </dt>
+ <dt>
+ 11.1. <a href="ds-cpds.html#ds-cpds-props">ConnectionPoolDataSource Configuration Properties</a>
+ </dt>
+ <dt>
+ 11.2. <a href="ds-ds.html#ds-ds-imp">DataSource Implementations</a>
+ </dt>
+ <dt>
+ 11.3. <a href="ds-ds.html#ds-ds-props">DataSource Configuration Properties</a>
+ </dt>
+ <dt>
+ 11.4. <a href="ds-ds.html#ds-ds-xprops">Additional Pooling DataSource Configuration Properties</a>
+ </dt>
+ </dl>
+ </div>
+
+ <div class="LOT">
+ <h3 class="c2">List of Examples</h3>
+ <dl class="LOT">
+ <!-- <dt class="c1">List of Examples</dt> -->
+ <dt>
+ 5.1. <a href="query.html#query-example">Processing a Simple Query in <acronym class="ACRONYM">JDBC</acronym></a>
+ </dt>
+ <dt>
+ 5.2. <a href="query.html#fetchsize-example">Setting fetch size to turn cursors on and off.</a>
+ </dt>
+ <dt>
+ 5.3. <a href="update.html#delete-example">Deleting Rows in <acronym class="ACRONYM">JDBC</acronym></a>
+ </dt>
+ <dt>
+ 5.4. <a href="ddl.html#drop-table-example">Dropping a Table in <acronym class="ACRONYM">JDBC</acronym></a>
+ </dt>
+ <dt>
+ 6.1. <a href="callproc.html#call-function-example">Calling a built in stored function</a>
+ </dt>
+ <dt>
+ 6.2. <a href="callproc.html#setof-resultset"> Getting SETOF type values from a function</a>
+ </dt>
+ <dt>
+ 6.3. <a href="callproc.html#get-refcursor-from-function-call"> Getting <span class="type">refcursor</span> Value From a Function</a>
+ </dt>
+ <dt>
+ 6.4. <a href="callproc.html#refcursor-string-example">Treating <span class="type">refcursor</span> as a cursor name</a>
+ </dt>
+ <dt>
+ 7.1. <a href="binary-data.html#binary-data-example">Processing Binary Data in <acronym class="ACRONYM">JDBC</acronym></a>
+ </dt>
+ <dt>
+ 8.1. <a href="escapes.html#escape-use-example">Using jdbc escapes</a>
+ </dt>
+ <dt>
+ 9.1. <a href="geometric.html#geometric-circle-example">Using the CIRCLE datatype from <acronym class="ACRONYM">JDBC</acronym></a>
+ </dt>
+ <dt>
+ 9.2. <a href="listennotify.html#listen-notify-example">Receiving Notifications</a>
+ </dt>
+ <dt>
+ 9.3. <a href="server-prepare.html#server-prepared-statement-example">Using server side prepared statements</a>
+ </dt>
+ <dt>
+ 11.1. <a href="ds-ds.html#ds-example">DataSource Code Example</a>
+ </dt>
+ <dt>
+ 11.2. <a href="jndi.html#ds-jndi">DataSource <acronym class="ACRONYM">JNDI</acronym> Code Example</a>
+ </dt>
+ </dl>
+ </div>
+ </div> <!-- BOOK -->
+
+ <div class="NAVFOOTER">
+ <hr class="c2" width="100%" />
+ <table summary="Footer navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
+ <tbody>
+ <tr>
+ <td valign="top" width="33%" align="left"> </td>
+ <td valign="top" width="34%" align="center"> </td>
+ <td valign="top" width="33%" align="right"><a href="intro.html" accesskey="N">Next</a></td>
+ </tr>
+ <tr>
+ <td valign="top" width="33%" align="left"> </td>
+ <td valign="top" width="34%" align="center"> </td>
+ <td valign="top" width="33%" align="right">Chapter 1. Introduction</td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </div> <!--docContent -->
+
+ <div id="docComments"></div>
+
+ <div id="docFooter">
+ <a class="navFooter" href="http://www.postgresql.org/about/privacypolicy">Privacy Policy</a> |
+ <a class="navFooter" href="http://www.postgresql.org/about/">About PostgreSQL</a><br/>
+ Copyright © 1996-2013 The PostgreSQL Global Development Group
+ </div> <!-- pgFooter -->
+ </div> <!-- docContainer -->
+ </div> <!-- docContainerWrap -->
+</body>
diff --git a/docs/documentation/92/intro.md b/docs/documentation/92/intro.md
new file mode 100644
index 0000000..f815fae
--- /dev/null
+++ b/docs/documentation/92/intro.md
@@ -0,0 +1,22 @@
+---
+layout: default_docs
+title: Chapter 1. Introduction
+header: Chapter 1. Introduction
+resource: media
+previoustitle: The PostgreSQL™ JDBC Interface
+previous: index.html
+nexttitle: Chapter 2. Setting up the JDBC Driver
+next: setup.html
+---
+
+JDBC is a core API of Java 1.1 and later. It provides a standard set of interfaces
+to SQL-compliant databases.
+
+PostgreSQL™ provides a *type 4* JDBC driver. Type 4 indicates that the driver is
+written in Pure Java, and communicates in the database system's own network protocol.
+Because of this, the driver is platform independent; once compiled, the driver
+can be used on any system.
+
+This manual is not intended as a complete guide to JDBC programming, but should
+help to get you started. For more information refer to the standard JDBC API
+documentation. Also, take a look at the examples included with the source.
\ No newline at end of file
diff --git a/docs/documentation/92/jndi.md b/docs/documentation/92/jndi.md
new file mode 100644
index 0000000..969512d
--- /dev/null
+++ b/docs/documentation/92/jndi.md
@@ -0,0 +1,68 @@
+---
+layout: default_docs
+title: Data Sources and JNDI
+header: Chapter 11. Connection Pools and Data Sources
+resource: media
+previoustitle: Tomcat setup
+previous: tomcat.html
+nexttitle: Chapter 12. Further Reading
+next: reading.html
+---
+
+All the `ConnectionPoolDataSource` and `DataSource` implementations can be stored
+in JNDI. In the case of the nonpooling implementations, a new instance will be
+created every time the object is retrieved from JNDI, with the same settings as
+the instance that was stored. For the pooling implementations, the same instance
+will be retrieved as long as it is available (e.g., not a different JVM retrieving
+the pool from JNDI), or a new instance with the same settings created otherwise.
+
+In the application server environment, typically the application server's
+`DataSource` instance will be stored in JNDI, instead of the PostgreSQL™
+`ConnectionPoolDataSource` implementation.
+
+In an application environment, the application may store the `DataSource` in JNDI
+so that it doesn't have to make a reference to the `DataSource` available to all
+application components that may need to use it. An example of this is shown in
+[Example 11.2, “`DataSource` JNDI Code Example”](jndi.html#ds-jndi).
+
+<a name="ds-jndi"></a>
+**Example 11.2. `DataSource` JNDI Code Example**
+
+Application code to initialize a pooling `DataSource` and add it to JNDI might
+look like this:
+
+`PGPoolingDataSource source = new PGPoolingDataSource();`
+`source.setDataSourceName("A Data Source");`
+`source.setServerName("localhost");`
+`source.setDatabaseName("test");`
+`source.setUser("testuser");`
+`source.setPassword("testpassword");`
+`source.setMaxConnections(10);`
+`new InitialContext().rebind("DataSource", source);`
+
+Then code to use a connection from the pool might look like this:
+
+<pre><code>
+Connection conn = null;
+try
+{
+ DataSource source = (DataSource)new InitialContext().lookup("DataSource");
+ conn = source.getConnection();
+ // use connection
+}
+catch (SQLException e)
+{
+ // log error
+}
+catch (NamingException e)
+{
+ // DataSource wasn't found in JNDI
+}
+finally
+{
+ if (con != null)
+ {
+ try { conn.close(); } catch (SQLException e) {}
+ }
+}
+</code></pre>
\ No newline at end of file
diff --git a/docs/documentation/92/largeobjects.md b/docs/documentation/92/largeobjects.md
new file mode 100644
index 0000000..cbcdbad
--- /dev/null
+++ b/docs/documentation/92/largeobjects.md
@@ -0,0 +1,20 @@
+---
+layout: default_docs
+title: Large Objects
+header: Chapter 9. PostgreSQL™ Extensions to the JDBC API
+resource: media
+previoustitle: Geometric Data Types
+previous: geometric.html
+nexttitle: Listen / Notify
+next: listennotify.html
+---
+
+Large objects are supported in the standard JDBC specification. However, that
+interface is limited, and the API provided by PostgreSQL™ allows for random
+access to the objects contents, as if it was a local file.
+
+The org.postgresql.largeobject package provides to Java the libpq C interface's
+large object API. It consists of two classes, `LargeObjectManager`, which deals
+with creating, opening and deleting large objects, and `LargeObject` which deals
+with an individual object. For an example usage of this API, please see
+[Example 7.1, “Processing Binary Data in JDBC”](binary-data.html#binary-data-example).
\ No newline at end of file
diff --git a/docs/documentation/92/listennotify.md b/docs/documentation/92/listennotify.md
new file mode 100644
index 0000000..3ad4e2d
--- /dev/null
+++ b/docs/documentation/92/listennotify.md
@@ -0,0 +1,148 @@
+---
+layout: default_docs
+title: Listen / Notify
+header: Chapter 9. PostgreSQL™ Extensions to the JDBC API
+resource: media
+previoustitle: Large Objects
+previous: largeobjects.html
+nexttitle: Server Prepared Statements
+next: server-prepare.html
+---
+
+Listen and Notify provide a simple form of signal or interprocess communication
+mechanism for a collection of processes accessing the same PostgreSQL™ database.
+For more information on notifications consult the main server documentation. This
+section only deals with the JDBC specific aspects of notifications.
+
+Standard `LISTEN`, `NOTIFY`, and `UNLISTEN` commands are issued via the standard
+`Statement` interface. To retrieve and process retrieved notifications the
+`Connection` must be cast to the PostgreSQL™ specific extension interface
+`PGConnection`. From there the `getNotifications()` method can be used to retrieve
+any outstanding notifications.
+
+### Note
+
+> A key limitation of the JDBC driver is that it cannot receive asynchronous
+notifications and must poll the backend to check if any notifications were issued.
+
+<a name="listen-notify-example"></a>
+**Example 9.2. Receiving Notifications**
+
+<pre><code>
+import java.sql.*;
+
+public class NotificationTest
+{
+ public static void main(String args[]) throws Exception
+ {
+ Class.forName("org.postgresql.Driver");
+ String url = "jdbc:postgresql://localhost:5432/test";
+
+ // Create two distinct connections, one for the notifier
+ // and another for the listener to show the communication
+ // works across connections although this example would
+ // work fine with just one connection.
+
+ Connection lConn = DriverManager.getConnection(url,"test","");
+ Connection nConn = DriverManager.getConnection(url,"test","");
+
+ // Create two threads, one to issue notifications and
+ // the other to receive them.
+
+ Listener listener = new Listener(lConn);
+ Notifier notifier = new Notifier(nConn);
+ listener.start();
+ notifier.start();
+ }
+}
+</code></pre>
+
+<pre><code>
+class Listener extends Thread
+{
+ private Connection conn;
+ private org.postgresql.PGConnection pgconn;
+
+ Listener(Connection conn) throws SQLException
+ {
+ this.conn = conn;
+ this.pgconn = conn.unwrap(org.postgresql.PGConnection.class);
+ Statement stmt = conn.createStatement();
+ stmt.execute("LISTEN mymessage");
+ stmt.close();
+ }
+
+ public void run()
+ {
+ while (true)
+ {
+ try
+ {
+ // issue a dummy query to contact the backend
+ // and receive any pending notifications.
+
+ Statement stmt = conn.createStatement();
+ ResultSet rs = stmt.executeQuery("SELECT 1");
+ rs.close();
+ stmt.close();
+
+ org.postgresql.PGNotification notifications[] = pgconn.getNotifications();
+
+ if (notifications != null)
+ {
+ for (int i=0; i<notifications.length; i++)
+ System.out.println("Got notification: " + notifications[i].getName());
+ }
+
+ // wait a while before checking again for new
+ // notifications
+
+ Thread.sleep(500);
+ }
+ catch (SQLException sqle)
+ {
+ sqle.printStackTrace();
+ }
+ catch (InterruptedException ie)
+ {
+ ie.printStackTrace();
+ }
+ }
+ }
+}
+</code></pre>
+
+<pre><code>
+class Notifier extends Thread
+{
+ private Connection conn;
+
+ public Notifier(Connection conn)
+ {
+ this.conn = conn;
+ }
+
+ public void run()
+ {
+ while (true)
+ {
+ try
+ {
+ Statement stmt = conn.createStatement();
+ stmt.execute("NOTIFY mymessage");
+ stmt.close();
+ Thread.sleep(2000);
+ }
+ catch (SQLException sqle)
+ {
+ sqle.printStackTrace();
+ }
+ catch (InterruptedException ie)
+ {
+ ie.printStackTrace();
+ }
+ }
+ }
+
+}
+</code></pre>
diff --git a/docs/documentation/92/load.md b/docs/documentation/92/load.md
new file mode 100644
index 0000000..e4996a8
--- /dev/null
+++ b/docs/documentation/92/load.md
@@ -0,0 +1,47 @@
+---
+layout: default_docs
+title: Loading the Driver
+header: Chapter 3. Initializing the Driver
+resource: media
+previoustitle: Chapter 3. Initializing the Driver
+previous: use.html
+nexttitle: Connecting to the Database
+next: connect.html
+---
+
+Before you can connect to a database, you need to load the driver. There are two
+methods available, and it depends on your code which is the best one to use.
+
+In the first method, your code implicitly loads the driver using the `Class.forName()`
+method. For PostgreSQL™, you would use:
+
+Class.forName("org.postgresql.Driver");
+
+This will load the driver, and while loading, the driver will automatically
+register itself with JDBC.
+
+### Note
+
+The `forName()` method can throw a `ClassNotFoundException` if the driver is not
+available.
+
+This is the most common method to use, but restricts your code to use just PostgreSQL™.
+If your code may access another database system in the future, and you do not
+use any PostgreSQL™-specific extensions, then the second method is advisable.
+
+The second method passes the driver as a parameter to the JVM as it starts, using
+the `-D` argument. Example:
+
+`java -Djdbc.drivers=org.postgresql.Driver example.ImageViewer`
+
+In this example, the JVM will attempt to load the driver as part of its initialization.
+Once done, the ImageViewer is started.
+
+Now, this method is the better one to use because it allows your code to be used
+with other database packages without recompiling the code. The only thing that
+would also change is the connection URL, which is covered next.
+
+One last thing: When your code then tries to open a `Connection`, and you get a
+No driver available `SQLException` being thrown, this is probably caused by the
+driver not being in the class path, or the value in the parameter not being
+correct.
\ No newline at end of file
diff --git a/docs/documentation/92/media/css/docs.css b/docs/documentation/92/media/css/docs.css
new file mode 100644
index 0000000..b168780
--- /dev/null
+++ b/docs/documentation/92/media/css/docs.css
@@ -0,0 +1,450 @@
+/* PostgreSQL.org Documentation Style */
+
+ at import url("global.css");
+ at import url("table.css");
+ at import url("text.css");
+
+body {
+ font-size: 76%;
+}
+
+div.NAVHEADER table {
+ margin-left: 0;
+}
+
+/* Container Definitions */
+
+#docContainerWrap {
+ text-align: center; /* Win IE5 */
+}
+
+#docContainer {
+ margin: 0 auto;
+ width: 90%;
+ padding-bottom: 2em;
+ display: block;
+ text-align: left; /* Win IE5 */
+}
+
+#docHeader {
+ background-image: url("../img/docs/bg_hdr.png");
+ height: 83px;
+ margin: 0px;
+ padding: 0px;
+ display: block;
+}
+
+#docHeaderLogo {
+ position: relative;
+ width: 206px;
+ height: 83px;
+ border: 0px;
+ padding: 0px;
+ margin: 0 0 0 20px;
+}
+
+#docHeaderLogo img {
+ border: 0px;
+}
+
+#docNavSearchContainer {
+ padding-bottom: 2px;
+}
+
+#docNav, #docVersions {
+ position: relative;
+ text-align: left;
+ margin-left: 10px;
+ margin-top: 5px;
+ color: #666;
+ font-size: 0.95em;
+}
+
+#docSearch {
+ position: relative;
+ text-align: right;
+ padding: 0;
+ margin: 0;
+ color: #666;
+}
+
+#docTextSize {
+ text-align: right;
+ white-space: nowrap;
+ margin-top: 7px;
+ font-size: 0.95em;
+}
+
+#docSearch form {
+ position: relative;
+ top: 5px;
+ right: 0;
+ margin: 0; /* need for IE 5.5 OSX */
+ text-align: right; /* need for IE 5.5 OSX */
+ white-space: nowrap; /* for Opera */
+}
+
+#docSearch form label {
+ color: #666;
+ font-size: 0.95em;
+}
+
+#docSearch form input {
+ font-size: 0.95em;
+}
+
+#docSearch form #submit {
+ font-size: 0.95em;
+ background: #7A7A7A;
+ color: #fff;
+ border: 1px solid #7A7A7A;
+ padding: 1px 4px;
+}
+
+#docSearch form #q {
+ width: 170px;
+ font-size: 0.95em;
+ border: 1px solid #7A7A7A;
+ background: #E1E1E1;
+ color: #000000;
+ padding: 2px;
+}
+
+.frmDocSearch {
+ padding: 0;
+ margin: 0;
+ display: inline;
+}
+
+.inpDocSearch {
+ padding: 0;
+ margin: 0;
+ color: #000;
+}
+
+#docContent {
+ position: relative;
+ margin-left: 10px;
+ margin-right: 10px;
+ margin-top: 40px;
+}
+
+#docFooter {
+ position: relative;
+ font-size: 0.9em;
+ color: #666;
+ line-height: 1.3em;
+ margin-left: 10px;
+ margin-right: 10px;
+}
+
+#docComments {
+ margin-top: 10px;
+}
+
+#docClear {
+ clear: both;
+ margin: 0;
+ padding: 0;
+}
+
+/* Heading Definitions */
+
+h1, h2, h3 {
+ font-weight: bold;
+ margin-top: 2ex;
+}
+
+h1 {
+ font-size: 1.4em;
+}
+
+h2 {
+ font-size: 1.2em !important;
+}
+
+h3 {
+ font-size: 1.1em;
+}
+
+h1 a:hover {
+ color: #EC5800;
+ text-decoration: none;
+}
+
+h2 a:hover,
+h3 a:hover,
+h4 a:hover {
+ color: #666666;
+ text-decoration: none;
+}
+
+/* Text Styles */
+
+div.SECT2 {
+ margin-top: 4ex;
+}
+
+div.SECT3 {
+ margin-top: 3ex;
+ margin-left: 3ex;
+}
+
+.txtCurrentLocation {
+ font-weight: bold;
+}
+
+p, ol, ul, li {
+ line-height: 1.5em;
+}
+
+.txtCommentsWrap {
+ border: 2px solid #F5F5F5;
+ width: 100%;
+}
+
+.txtCommentsContent {
+ background: #F5F5F5;
+ padding: 3px;
+}
+
+.txtCommentsPoster {
+ float: left;
+}
+
+.txtCommentsDate {
+ float: right;
+}
+
+.txtCommentsComment {
+ padding: 3px;
+}
+
+#docContainer p code,
+#docContainer ul code,
+#docContainer pre code,
+#docContainer pre tt,
+#docContainer pre pre,
+#docContainer tt tt,
+#docContainer tt code,
+#docContainer tt pre {
+ font-size: 1.5em;
+}
+
+pre.LITERALLAYOUT,
+.SCREEN,
+.SYNOPSIS,
+.PROGRAMLISTING,
+.REFSYNOPSISDIV p,
+table.CAUTION,
+table.WARNING,
+blockquote.NOTE,
+blockquote.TIP,
+table.CALSTABLE {
+ -moz-box-shadow: 3px 3px 5px #DFDFDF;
+ -webkit-box-shadow: 3px 3px 5px #DFDFDF;
+ -khtml-box-shadow: 3px 3px 5px #DFDFDF;
+ -o-box-shadow: 3px 3px 5px #DFDFDF;
+ box-shadow: 3px 3px 5px #DFDFDF;
+}
+
+pre.LITERALLAYOUT,
+.SCREEN,
+.SYNOPSIS,
+.PROGRAMLISTING,
+.REFSYNOPSISDIV p,
+table.CAUTION,
+table.WARNING,
+blockquote.NOTE,
+blockquote.TIP {
+ color: black;
+ border-width: 1px;
+ border-style: solid;
+ padding: 2ex;
+ margin: 2ex 0 2ex 2ex;
+ overflow: auto;
+ -moz-border-radius: 8px;
+ -webkit-border-radius: 8px;
+ -khtml-border-radius: 8px;
+ border-radius: 8px;
+}
+
+pre.LITERALLAYOUT,
+pre.SYNOPSIS,
+pre.PROGRAMLISTING,
+.REFSYNOPSISDIV p,
+.SCREEN {
+ border-color: #CFCFCF;
+ background-color: #F7F7F7;
+}
+
+blockquote.NOTE,
+blockquote.TIP {
+ border-color: #DBDBCC;
+ background-color: #EEEEDD;
+ padding: 14px;
+ width: 572px;
+}
+
+blockquote.NOTE,
+blockquote.TIP,
+table.CAUTION,
+table.WARNING {
+ margin: 4ex auto;
+}
+
+blockquote.NOTE p,
+blockquote.TIP p {
+ margin: 0;
+}
+
+blockquote.NOTE pre,
+blockquote.NOTE code,
+blockquote.TIP pre,
+blockquote.TIP code {
+ margin-left: 0;
+ margin-right: 0;
+ -moz-box-shadow: none;
+ -webkit-box-shadow: none;
+ -khtml-box-shadow: none;
+ -o-box-shadow: none;
+ box-shadow: none;
+}
+
+.emphasis,
+.c2 {
+ font-weight: bold;
+}
+
+.REPLACEABLE {
+ font-style: italic;
+}
+
+/* Table Styles */
+
+table {
+ margin-left: 2ex;
+}
+
+table.CALSTABLE td,
+table.CALSTABLE th,
+table.CAUTION td,
+table.CAUTION th,
+table.WARNING td,
+table.WARNING th {
+ border-style: solid;
+}
+
+table.CALSTABLE,
+table.CAUTION,
+table.WARNING {
+ border-spacing: 0;
+ border-collapse: collapse;
+}
+
+table.CALSTABLE
+{
+ margin: 2ex 0 2ex 2ex;
+ background-color: #E0ECEF;
+ border: 2px solid #A7C6DF;
+}
+
+table.CALSTABLE tr:hover td
+{
+ background-color: #EFEFEF;
+}
+
+table.CALSTABLE td {
+ background-color: #FFF;
+}
+
+table.CALSTABLE td,
+table.CALSTABLE th {
+ border: 1px solid #A7C6DF;
+ padding: 0.5ex 0.5ex;
+}
+
+table.CAUTION,
+table.WARNING {
+ border-collapse: separate;
+ display: block;
+ padding: 0;
+ max-width: 600px;
+}
+
+table.CAUTION {
+ background-color: #F5F5DC;
+ border-color: #DEDFA7;
+}
+
+table.WARNING {
+ background-color: #FFD7D7;
+ border-color: #DF421E;
+}
+
+table.CAUTION td,
+table.CAUTION th,
+table.WARNING td,
+table.WARNING th {
+ border-width: 0;
+ padding-left: 2ex;
+ padding-right: 2ex;
+}
+
+table.CAUTION td,
+table.CAUTION th {
+ border-color: #F3E4D5
+}
+
+table.WARNING td,
+table.WARNING th {
+ border-color: #FFD7D7;
+}
+
+td.c1,
+td.c2,
+td.c3,
+td.c4,
+td.c5,
+td.c6 {
+ font-size: 1.1em;
+ font-weight: bold;
+ border-bottom: 0px solid #FFEFEF;
+ padding: 1ex 2ex 0;
+}
+
+/* Link Styles */
+
+#docNav a {
+ font-weight: bold;
+}
+
+a:link,
+a:visited,
+a:active,
+a:hover {
+ text-decoration: underline;
+}
+
+a:link,
+a:active {
+ color:#0066A2;
+}
+
+a:visited {
+ color:#004E66;
+}
+
+a:hover {
+ color:#000000;
+}
+
+#docFooter a:link,
+#docFooter a:visited,
+#docFooter a:active {
+ color:#666;
+}
+
+#docContainer code.FUNCTION tt {
+ font-size: 1em;
+}
diff --git a/docs/documentation/92/media/css/docs.css~ b/docs/documentation/92/media/css/docs.css~
new file mode 100644
index 0000000..0cbe23e
--- /dev/null
+++ b/docs/documentation/92/media/css/docs.css~
@@ -0,0 +1,450 @@
+/* PostgreSQL.org Documentation Style */
+
+ at import url("global.css");
+ at import url("table.css");
+ at import url("text.css");
+
+body {
+ font-size: 76%;
+}
+
+div.NAVHEADER table {
+ margin-left: 0;
+}
+
+/* Container Definitions */
+
+#docContainerWrap {
+ text-align: center; /* Win IE5 */
+}
+
+#docContainer {
+ margin: 0 auto;
+ width: 90%;
+ padding-bottom: 2em;
+ display: block;
+ text-align: left; /* Win IE5 */
+}
+
+#docHeader {
+ background-image: url("../img/docs/bg_hdr.png");
+ height: 83px;
+ margin: 0px;
+ padding: 0px;
+ display: block;
+}
+
+#docHeaderLogo {
+ position: relative;
+ width: 206px;
+ height: 83px;
+ border: 0px;
+ padding: 0px;
+ margin: 0 0 0 20px;
+}
+
+#docHeaderLogo img {
+ border: 0px;
+}
+
+#docNavSearchContainer {
+ padding-bottom: 2px;
+}
+
+#docNav, #docVersions {
+ position: relative;
+ text-align: left;
+ margin-left: 10px;
+ margin-top: 5px;
+ color: #666;
+ font-size: 0.95em;
+}
+
+#docSearch {
+ position: relative;
+ text-align: right;
+ padding: 0;
+ margin: 0;
+ color: #666;
+}
+
+#docTextSize {
+ text-align: right;
+ white-space: nowrap;
+ margin-top: 7px;
+ font-size: 0.95em;
+}
+
+#docSearch form {
+ position: relative;
+ top: 5px;
+ right: 0;
+ margin: 0; /* need for IE 5.5 OSX */
+ text-align: right; /* need for IE 5.5 OSX */
+ white-space: nowrap; /* for Opera */
+}
+
+#docSearch form label {
+ color: #666;
+ font-size: 0.95em;
+}
+
+#docSearch form input {
+ font-size: 0.95em;
+}
+
+#docSearch form #submit {
+ font-size: 0.95em;
+ background: #7A7A7A;
+ color: #fff;
+ border: 1px solid #7A7A7A;
+ padding: 1px 4px;
+}
+
+#docSearch form #q {
+ width: 170px;
+ font-size: 0.95em;
+ border: 1px solid #7A7A7A;
+ background: #E1E1E1;
+ color: #000000;
+ padding: 2px;
+}
+
+.frmDocSearch {
+ padding: 0;
+ margin: 0;
+ display: inline;
+}
+
+.inpDocSearch {
+ padding: 0;
+ margin: 0;
+ color: #000;
+}
+
+#docContent {
+ position: relative;
+ margin-left: 10px;
+ margin-right: 10px;
+ margin-top: 40px;
+}
+
+#docFooter {
+ position: relative;
+ font-size: 0.9em;
+ color: #666;
+ line-height: 1.3em;
+ margin-left: 10px;
+ margin-right: 10px;
+}
+
+#docComments {
+ margin-top: 10px;
+}
+
+#docClear {
+ clear: both;
+ margin: 0;
+ padding: 0;
+}
+
+/* Heading Definitions */
+
+h1, h2, h3 {
+ font-weight: bold;
+ margin-top: 2ex;
+}
+
+h1 {
+ font-size: 1.4em;
+}
+
+h2 {
+ font-size: 1.2em !important;
+}
+
+h3 {
+ font-size: 1.1em;
+}
+
+h1 a:hover {
+ color: #EC5800;
+ text-decoration: none;
+}
+
+h2 a:hover,
+h3 a:hover,
+h4 a:hover {
+ color: #666666;
+ text-decoration: none;
+}
+
+/* Text Styles */
+
+div.SECT2 {
+ margin-top: 4ex;
+}
+
+div.SECT3 {
+ margin-top: 3ex;
+ margin-left: 3ex;
+}
+
+.txtCurrentLocation {
+ font-weight: bold;
+}
+
+p, ol, ul, li {
+ line-height: 1.5em;
+}
+
+.txtCommentsWrap {
+ border: 2px solid #F5F5F5;
+ width: 100%;
+}
+
+.txtCommentsContent {
+ background: #F5F5F5;
+ padding: 3px;
+}
+
+.txtCommentsPoster {
+ float: left;
+}
+
+.txtCommentsDate {
+ float: right;
+}
+
+.txtCommentsComment {
+ padding: 3px;
+}
+
+#docContainer p code,
+#docContainer dt code,
+#docContainer pre code,
+#docContainer pre tt,
+#docContainer pre pre,
+#docContainer tt tt,
+#docContainer tt code,
+#docContainer tt pre {
+ font-size: 1.5em;
+}
+
+pre.LITERALLAYOUT,
+.SCREEN,
+.SYNOPSIS,
+.PROGRAMLISTING,
+.REFSYNOPSISDIV p,
+table.CAUTION,
+table.WARNING,
+blockquote.NOTE,
+blockquote.TIP,
+table.CALSTABLE {
+ -moz-box-shadow: 3px 3px 5px #DFDFDF;
+ -webkit-box-shadow: 3px 3px 5px #DFDFDF;
+ -khtml-box-shadow: 3px 3px 5px #DFDFDF;
+ -o-box-shadow: 3px 3px 5px #DFDFDF;
+ box-shadow: 3px 3px 5px #DFDFDF;
+}
+
+pre.LITERALLAYOUT,
+.SCREEN,
+.SYNOPSIS,
+.PROGRAMLISTING,
+.REFSYNOPSISDIV p,
+table.CAUTION,
+table.WARNING,
+blockquote.NOTE,
+blockquote.TIP {
+ color: black;
+ border-width: 1px;
+ border-style: solid;
+ padding: 2ex;
+ margin: 2ex 0 2ex 2ex;
+ overflow: auto;
+ -moz-border-radius: 8px;
+ -webkit-border-radius: 8px;
+ -khtml-border-radius: 8px;
+ border-radius: 8px;
+}
+
+pre.LITERALLAYOUT,
+pre.SYNOPSIS,
+pre.PROGRAMLISTING,
+.REFSYNOPSISDIV p,
+.SCREEN {
+ border-color: #CFCFCF;
+ background-color: #F7F7F7;
+}
+
+blockquote.NOTE,
+blockquote.TIP {
+ border-color: #DBDBCC;
+ background-color: #EEEEDD;
+ padding: 14px;
+ width: 572px;
+}
+
+blockquote.NOTE,
+blockquote.TIP,
+table.CAUTION,
+table.WARNING {
+ margin: 4ex auto;
+}
+
+blockquote.NOTE p,
+blockquote.TIP p {
+ margin: 0;
+}
+
+blockquote.NOTE pre,
+blockquote.NOTE code,
+blockquote.TIP pre,
+blockquote.TIP code {
+ margin-left: 0;
+ margin-right: 0;
+ -moz-box-shadow: none;
+ -webkit-box-shadow: none;
+ -khtml-box-shadow: none;
+ -o-box-shadow: none;
+ box-shadow: none;
+}
+
+.emphasis,
+.c2 {
+ font-weight: bold;
+}
+
+.REPLACEABLE {
+ font-style: italic;
+}
+
+/* Table Styles */
+
+table {
+ margin-left: 2ex;
+}
+
+table.CALSTABLE td,
+table.CALSTABLE th,
+table.CAUTION td,
+table.CAUTION th,
+table.WARNING td,
+table.WARNING th {
+ border-style: solid;
+}
+
+table.CALSTABLE,
+table.CAUTION,
+table.WARNING {
+ border-spacing: 0;
+ border-collapse: collapse;
+}
+
+table.CALSTABLE
+{
+ margin: 2ex 0 2ex 2ex;
+ background-color: #E0ECEF;
+ border: 2px solid #A7C6DF;
+}
+
+table.CALSTABLE tr:hover td
+{
+ background-color: #EFEFEF;
+}
+
+table.CALSTABLE td {
+ background-color: #FFF;
+}
+
+table.CALSTABLE td,
+table.CALSTABLE th {
+ border: 1px solid #A7C6DF;
+ padding: 0.5ex 0.5ex;
+}
+
+table.CAUTION,
+table.WARNING {
+ border-collapse: separate;
+ display: block;
+ padding: 0;
+ max-width: 600px;
+}
+
+table.CAUTION {
+ background-color: #F5F5DC;
+ border-color: #DEDFA7;
+}
+
+table.WARNING {
+ background-color: #FFD7D7;
+ border-color: #DF421E;
+}
+
+table.CAUTION td,
+table.CAUTION th,
+table.WARNING td,
+table.WARNING th {
+ border-width: 0;
+ padding-left: 2ex;
+ padding-right: 2ex;
+}
+
+table.CAUTION td,
+table.CAUTION th {
+ border-color: #F3E4D5
+}
+
+table.WARNING td,
+table.WARNING th {
+ border-color: #FFD7D7;
+}
+
+td.c1,
+td.c2,
+td.c3,
+td.c4,
+td.c5,
+td.c6 {
+ font-size: 1.1em;
+ font-weight: bold;
+ border-bottom: 0px solid #FFEFEF;
+ padding: 1ex 2ex 0;
+}
+
+/* Link Styles */
+
+#docNav a {
+ font-weight: bold;
+}
+
+a:link,
+a:visited,
+a:active,
+a:hover {
+ text-decoration: underline;
+}
+
+a:link,
+a:active {
+ color:#0066A2;
+}
+
+a:visited {
+ color:#004E66;
+}
+
+a:hover {
+ color:#000000;
+}
+
+#docFooter a:link,
+#docFooter a:visited,
+#docFooter a:active {
+ color:#666;
+}
+
+#docContainer code.FUNCTION tt {
+ font-size: 1em;
+}
diff --git a/docs/documentation/92/media/css/global.css b/docs/documentation/92/media/css/global.css
new file mode 100644
index 0000000..1706e11
--- /dev/null
+++ b/docs/documentation/92/media/css/global.css
@@ -0,0 +1,98 @@
+/*
+ PostgreSQL.org - Global Styles
+*/
+
+body {
+ margin: 0;
+ padding: 0;
+ font-family: verdana, sans-serif;
+ font-size: 69%;
+ color: #000;
+ background-color: #fff;
+}
+
+h1 {
+ font-size: 1.4em;
+ font-weight: bold;
+ margin-top: 0em;
+ margin-bottom: 0em;
+}
+
+h2 {
+ font-size: 1.2em;
+ margin: 1.2em 0em 1.2em 0em;
+ font-weight: bold;
+}
+
+h3 {
+ font-size: 1.0em;
+ margin: 1.2em 0em 1.2em 0em;
+ font-weight: bold;
+}
+
+h4 {
+ font-size: 0.95em;
+ margin: 1.2em 0em 1.2em 0em;
+ font-weight: normal;
+}
+
+h5 {
+ font-size: 0.9em;
+ margin: 1.2em 0em 1.2em 0em;
+ font-weight: normal;
+}
+
+h6 {
+ font-size: 0.85em;
+ margin: 1.2em 0em 1.2em 0em;
+ font-weight: normal;
+}
+
+img {
+ border: 0;
+}
+
+ol, ul, li {/*
+ list-style: none;*/
+ font-size: 1.0em;
+ line-height: 1.2em;
+ margin-top: 0.2em;
+ margin-bottom: 0.1em;
+}
+
+p {
+ font-size: 1.0em;
+ line-height: 1.2em;
+ margin: 1.2em 0em;
+}
+
+td p {
+ margin: 0em 0em 1.2em;
+}
+
+li > p {
+ margin-top: 0.2em;
+}
+
+pre {
+ font-family: monospace;
+ font-size: 1.0em;
+}
+
+div#pgContentWrap code {
+ font-size: 1.2em;
+ padding: 1em;
+ margin: 2ex 0 2ex 2ex;
+ background: #F7F7F7;
+ border: 1px solid #CFCFCF;
+ -moz-border-radius: 8px;
+ -webkit-border-radius: 8px;
+ -khtml-border-radius: 8px;
+ border-radius: 8px;
+ display: block;
+ overflow: auto;
+}
+
+strong, b {
+ font-weight: bold;
+}
diff --git a/docs/documentation/92/media/css/table.css b/docs/documentation/92/media/css/table.css
new file mode 100644
index 0000000..cf2fd7d
--- /dev/null
+++ b/docs/documentation/92/media/css/table.css
@@ -0,0 +1,101 @@
+/*
+ PostgreSQL.org - Table Styles
+*/
+
+div.tblBasic h2 {
+ margin: 25px 0 .5em 0;
+}
+
+div.tblBasic table {
+ background: #F5F5F5 url(../img/layout/nav_tbl_top_lft.png) top left no-repeat;
+ margin-left: 2ex;
+ margin-bottom: 15px;
+}
+
+div.tblBasic table th {
+ padding-top: 20px;
+ border-bottom: 1px solid #EFEFEF;
+ vertical-align: bottom;
+}
+
+div.tblBasic table td {
+ border-bottom: 1px solid #EFEFEF;
+}
+
+div.tblBasic table th,
+div.tblBasic table td {
+ padding: 8px 11px;
+ color: #555555;
+}
+
+div.tblBasic table td.indented {
+ text-indent: 30px;
+}
+
+div.tblBasic table.tblCompact td {
+ padding: 3px 3px;
+}
+
+div.tblBasic table tr.lastrow td {
+ border-bottom: none;
+ padding-bottom: 13px;
+}
+
+div.tblBasic table.tblCompact tr.lastrow td {
+ padding-bottom: 3px;
+}
+
+div.tblBasic table tr.lastrow td.colFirstT,
+div.tblBasic table tr.lastrow td.colFirst {
+ background: url(../img/layout/nav_tbl_btm_lft.png) bottom left no-repeat;
+}
+
+div.tblBasic table.tblBasicGrey th.colLast,
+div.tblBasic table.tblCompact th.colLast {
+ background: #F5F5F5 url(../img/layout/nav_tbl_top_rgt.png) top right no-repeat;
+}
+
+div.tblBasic table.tblBasicGrey tr.lastrow td.colLastT,
+div.tblBasic table.tblBasicGrey tr.lastrow td.colLast,
+div.tblBasic table.tblCompact tr.lastrow td.colLast,
+div.tblBasic table.tblCompact tr.lastrow td.colLastT{
+ background: #F5F5F5 url(../img/layout/nav_tbl_btm_rgt.png) bottom right no-repeat;
+}
+
+div.tblBasic table.tblBasicGrey tr.firstrow td.colLastT,
+div.tblBasic table.tblBasicGrey tr.firstrow td.colLast,
+div tblBasic table.tblCompact tr.firstrow td.colLast {
+ background: #F5F5F5 url(../img/layout/nav_tbl_top_rgt.png) top right no-repeat;
+}
+
+div.tblBasic table th.colMid,
+div.tblBasic table td.colMid,
+div.tblBasic table th.colLast,
+div.tblBasic table td.colLast {
+ background-color: #F5F5F5 ;
+}
+
+div.tblBasic table th.colLastC,
+div.tblBasic table td.colFirstC,
+div.tblBasic table td.colLastC {
+ text-align: center;
+}
+
+div.tblBasic table th.colLastR,
+div.tblBasic table td.colFirstR,
+div.tblBasic table td.colLastR {
+ text-align: right;
+}
+
+div.tblBasic table td.colFirstT,
+div.tblBasic table td.colMidT,
+div.tblBasic table td.colLastT {
+ vertical-align: top;
+}
+
+div.tblBasic table th.colLastRT,
+div.tblBasic table td.colFirstRT,
+div.tblBasic table td.colLastRT {
+ text-align: right;
+ vertical-align: top;
+}
diff --git a/docs/documentation/92/media/css/table.css~ b/docs/documentation/92/media/css/table.css~
new file mode 100644
index 0000000..3aba3ca
--- /dev/null
+++ b/docs/documentation/92/media/css/table.css~
@@ -0,0 +1,101 @@
+/*
+ PostgreSQL.org - Table Styles
+*/
+
+div.tblBasic h2 {
+ margin: 25px 0 .5em 0;
+}
+
+div.tblBasic table {
+ background: #F5F5F5 url(media/img/layout/nav_tbl_top_lft.png) top left no-repeat;
+ margin-left: 2ex;
+ margin-bottom: 15px;
+}
+
+div.tblBasic table th {
+ padding-top: 20px;
+ border-bottom: 1px solid #EFEFEF;
+ vertical-align: bottom;
+}
+
+div.tblBasic table td {
+ border-bottom: 1px solid #EFEFEF;
+}
+
+div.tblBasic table th,
+div.tblBasic table td {
+ padding: 8px 11px;
+ color: #555555;
+}
+
+div.tblBasic table td.indented {
+ text-indent: 30px;
+}
+
+div.tblBasic table.tblCompact td {
+ padding: 3px 3px;
+}
+
+div.tblBasic table tr.lastrow td {
+ border-bottom: none;
+ padding-bottom: 13px;
+}
+
+div.tblBasic table.tblCompact tr.lastrow td {
+ padding-bottom: 3px;
+}
+
+div.tblBasic table tr.lastrow td.colFirstT,
+div.tblBasic table tr.lastrow td.colFirst {
+ background: url(media/img/layout/nav_tbl_btm_lft.png) bottom left no-repeat;
+}
+
+div.tblBasic table.tblBasicGrey th.colLast,
+div.tblBasic table.tblCompact th.colLast {
+ background: #F5F5F5 url(media/img/layout/nav_tbl_top_rgt.png) top right no-repeat;
+}
+
+div.tblBasic table.tblBasicGrey tr.lastrow td.colLastT,
+div.tblBasic table.tblBasicGrey tr.lastrow td.colLast,
+div.tblBasic table.tblCompact tr.lastrow td.colLast,
+div.tblBasic table.tblCompact tr.lastrow td.colLastT{
+ background: #F5F5F5 url(media/img/layout/nav_tbl_btm_rgt.png) bottom right no-repeat;
+}
+
+div.tblBasic table.tblBasicGrey tr.firstrow td.colLastT,
+div.tblBasic table.tblBasicGrey tr.firstrow td.colLast,
+div tblBasic table.tblCompact tr.firstrow td.colLast {
+ background: #F5F5F5 url(media/img/layout/nav_tbl_top_rgt.png) top right no-repeat;
+}
+
+div.tblBasic table th.colMid,
+div.tblBasic table td.colMid,
+div.tblBasic table th.colLast,
+div.tblBasic table td.colLast {
+ background-color: #F5F5F5 ;
+}
+
+div.tblBasic table th.colLastC,
+div.tblBasic table td.colFirstC,
+div.tblBasic table td.colLastC {
+ text-align: center;
+}
+
+div.tblBasic table th.colLastR,
+div.tblBasic table td.colFirstR,
+div.tblBasic table td.colLastR {
+ text-align: right;
+}
+
+div.tblBasic table td.colFirstT,
+div.tblBasic table td.colMidT,
+div.tblBasic table td.colLastT {
+ vertical-align: top;
+}
+
+div.tblBasic table th.colLastRT,
+div.tblBasic table td.colFirstRT,
+div.tblBasic table td.colLastRT {
+ text-align: right;
+ vertical-align: top;
+}
diff --git a/docs/documentation/92/media/css/text.css b/docs/documentation/92/media/css/text.css
new file mode 100644
index 0000000..902a118
--- /dev/null
+++ b/docs/documentation/92/media/css/text.css
@@ -0,0 +1,162 @@
+/*
+ PostgreSQL.org - Text Styles
+*/
+
+/* Heading Definitions */
+
+h1 {
+ color: #EC5800;
+}
+
+h2 {
+ color: #666;
+}
+
+h3 {
+ color: #666;
+}
+
+h4 {
+ color: #666;
+}
+
+/* Text Styles */
+
+.txtColumn1 {
+ width: 50%;
+ line-height: 1.3em;
+}
+
+.txtColumn2 {
+ width: 50%;
+ line-height: 1.5em;
+}
+
+.txtCurrentLocation {
+ font-weight: bold;
+}
+
+.txtDivider {
+ font-size: 0.8em;
+ color: #E1E1E1;
+ padding-left: 4px;
+ padding-right: 4px;
+}
+
+.txtNewsEvent {
+ font-size: 0.9em;
+ color: #0094C7;
+}
+
+.txtDate {
+ font-size: 0.9em;
+ color: #666;
+}
+
+.txtMediumGrey {
+ color: #666;
+}
+
+.txtFormLabel {
+ color: #666;
+ font-weight: bold;
+ text-align: right;
+ vertical-align: top;
+}
+
+.txtRequiredField {
+ color: #EC5800;
+}
+
+.txtImportant {
+ color: #EC5800;
+}
+
+.txtOffScreen {
+ position: absolute;
+ left: -1999px;
+ width: 1990px;
+}
+
+#txtFrontFeatureHeading {
+ padding-bottom: 1.1em;
+}
+
+#txtFrontFeatureLink a {
+ font-size: 1.2em;
+ font-weight: bold;
+ padding-left: 5px;
+}
+
+#txtFrontUserText {
+ font-size: 1.0em;
+ color: #666;
+ margin-top: 12px;
+}
+
+#txtFrontUserName {
+ font-size: 0.9em;
+ color: #666;
+ margin-top: 9px;
+ font-weight: bold;
+}
+
+#txtFrontUserLink {
+ font-size: 0.9em;
+ color: #666;
+ margin-top: 11px;
+ margin-left: 1px;
+}
+
+#txtFrontUserLink img {
+ padding-right: 5px;
+}
+
+#txtFrontSupportUsText {
+ font-size: 1.0em;
+ margin-top: 9px;
+}
+
+#txtFrontSupportUsLink {
+ font-size: 0.9em;
+ margin-top: 6px;
+}
+
+#txtFrontSupportUsLink img {
+ padding-right: 7px;
+}
+
+/* Link Styles */
+
+a:link { color:#0085B0; text-decoration: underline; }
+a:visited { color:#004E66; text-decoration: underline; }
+a:active { color:#0085B0; text-decoration: underline; }
+a:hover { color:#000000; text-decoration: underline; }
+
+#pgFooter a:link { color:#666; text-decoration: underline; }
+#pgFooter a:visited { color:#666; text-decoration: underline; }
+#pgFooter a:active { color:#666; text-decoration: underline; }
+#pgFooter a:hover { color:#000000; text-decoration: underline; }
+
+#txtFrontUserName a:link { color:#666; text-decoration: underline; }
+#txtFrontUserName a:visited { color:#666; text-decoration: underline; }
+#txtFrontUserName a:active { color:#666; text-decoration: underline; }
+#txtFrontUserName a:hover { color:#000; text-decoration: underline; }
+
+#txtArchives a:visited { color:#00536E; text-decoration: underline; }
+#txtArchives pre { word-wrap: break-word; font-size: 150%; }
+#txtArchives tt { word-wrap: break-word; font-size: 150%; }
+
+#pgFrontUSSContainer h2, #pgFrontUSSContainer h3 {
+ margin: 0;
+ padding: 0;
+}
+
+#pgFrontNewsEventsContainer h2, #pgFrontNewsEventsContainer h3 {
+ margin: 0;
+ padding: 0;
+}
+
+#pgFrontNewsEventsContainer h3 img {
+ margin-bottom: 10px;
+}
diff --git a/docs/documentation/92/media/favicon.ico b/docs/documentation/92/media/favicon.ico
new file mode 100644
index 0000000..a1cc036
Binary files /dev/null and b/docs/documentation/92/media/favicon.ico differ
diff --git a/docs/documentation/92/media/img/docs/bg_hdr.png b/docs/documentation/92/media/img/docs/bg_hdr.png
new file mode 100644
index 0000000..07c3b65
Binary files /dev/null and b/docs/documentation/92/media/img/docs/bg_hdr.png differ
diff --git a/docs/documentation/92/media/img/layout/hdr_left3a.png b/docs/documentation/92/media/img/layout/hdr_left3a.png
new file mode 100644
index 0000000..fb1f70d
Binary files /dev/null and b/docs/documentation/92/media/img/layout/hdr_left3a.png differ
diff --git a/docs/documentation/92/media/img/layout/nav_tbl_btm.png b/docs/documentation/92/media/img/layout/nav_tbl_btm.png
new file mode 100644
index 0000000..ec897af
Binary files /dev/null and b/docs/documentation/92/media/img/layout/nav_tbl_btm.png differ
diff --git a/docs/documentation/92/media/img/layout/nav_tbl_top.png b/docs/documentation/92/media/img/layout/nav_tbl_top.png
new file mode 100644
index 0000000..3a22368
Binary files /dev/null and b/docs/documentation/92/media/img/layout/nav_tbl_top.png differ
diff --git a/docs/documentation/92/outer-joins-escape.md b/docs/documentation/92/outer-joins-escape.md
new file mode 100644
index 0000000..6ab79e5
--- /dev/null
+++ b/docs/documentation/92/outer-joins-escape.md
@@ -0,0 +1,17 @@
+---
+layout: default_docs
+title: Escape for outer joins
+header: Chapter 8. JDBC escapes
+resource: media
+previoustitle: Chapter 8. JDBC escapes
+previous: escapes.html
+nexttitle: Date-time escapes
+next: escapes-datetime.html
+---
+
+You can specify outer joins using the following syntax: `{oj table (LEFT|RIGHT|FULL) OUTER JOIN (table | outer-join)
+ON search-condition }`
+
+For example :
+
+`rs = stmt.executeQuery( "select * from {oj a left outer join b on (a.i=b.i)} ");`
\ No newline at end of file
diff --git a/docs/documentation/92/prepare.md b/docs/documentation/92/prepare.md
new file mode 100644
index 0000000..d57b525
--- /dev/null
+++ b/docs/documentation/92/prepare.md
@@ -0,0 +1,25 @@
+---
+layout: default_docs
+title: Preparing the Database Server for JDBC
+header: Chapter 2. Setting up the JDBC Driver
+resource: media
+previoustitle: Setting up the Class Path
+previous: classpath.html
+nexttitle: Creating a Database
+next: your-database.html
+---
+
+Because Java does not support using unix sockets the PostgreSQL™ server must be
+configured to allow TCP/IP connections. Starting with server version 8.0 TCP/IP
+connections are allowed from `localhost`. To allow connections to other interfaces
+than the loopback interface, you must modify the `postgresql.conf` file's `listen_addresses`
+setting.
+
+For server versions prior to 8.0 the server does not listen on any interface by
+default, and you must set `tcpip_socket = true` in the `postgresql.conf` file.
+
+Once you have made sure the server is correctly listening for TCP/IP connections
+the next step is to verify that users are allowed to connect to the server. Client
+authentication is setup in `pg_hba.conf`. Refer to the main PostgreSQL™ documentation
+for details. The JDBC driver supports the `trust`, `ident`, `password`, `md5`, and
+`crypt` authentication methods.
\ No newline at end of file
diff --git a/docs/documentation/92/query.md b/docs/documentation/92/query.md
new file mode 100644
index 0000000..88fa831
--- /dev/null
+++ b/docs/documentation/92/query.md
@@ -0,0 +1,113 @@
+---
+layout: default_docs
+title: Chapter 5. Issuing a Query and Processing the Result
+header: Chapter 5. Issuing a Query and Processing the Result
+resource: media
+previoustitle: Custom SSLSocketFactory
+previous: ssl-factory.html
+nexttitle: Using the Statement or PreparedStatement Interface
+next: statement.html
+---
+
+**Table of Contents**
+
+* [Getting results based on a cursor](query.html#query-with-cursor)
+* [Using the `Statement` or `PreparedStatement` Interface](statement.html)
+* [Using the `ResultSet` Interface](resultset.html)
+* [Performing Updates](update.html)
+* [Creating and Modifying Database Objects](ddl.html)
+
+Any time you want to issue SQL statements to the database, you require a `Statement`
+or `PreparedStatement` instance. Once you have a `Statement` or `PreparedStatement`,
+you can use issue a query. This will return a `ResultSet` instance, which contains
+the entire result (see the section called [“Getting results based on a cursor”](query.html#query-with-cursor)
+here for how to alter this behaviour). [Example 5.1, “Processing a Simple Query in JDBC”](query.html#query-example)
+illustrates this process.
+
+<a name="query-example"></a>
+**Example 5.1. Processing a Simple Query in JDBC**
+
+This example will issue a simple query and print out the first column of each
+row using a `Statement`.
+
+`Statement st = conn.createStatement();`
+`ResultSet rs = st.executeQuery("SELECT * FROM mytable WHERE columnfoo = 500");`
+`while (rs.next())`
+`{`
+ `System.out.print("Column 1 returned ");`
+ `System.out.println(rs.getString(1));`
+`}`
+`rs.close();`
+`st.close();`
+
+This example issues the same query as before but uses a `PreparedStatement` and
+a bind value in the query.
+
+`int foovalue = 500;`
+`PreparedStatement st = conn.prepareStatement("SELECT * FROM mytable WHERE columnfoo = ?");`
+`st.setInt(1, foovalue);`
+`ResultSet rs = st.executeQuery();`
+`while (rs.next())`
+`{`
+ `System.out.print("Column 1 returned ");`
+ `System.out.println(rs.getString(1));`
+`}`
+`rs.close();`
+`st.close();`
+
+<a name="query-with-cursor"></a>
+# Getting results based on a cursor
+
+By default the driver collects all the results for the query at once. This can
+be inconvenient for large data sets so the JDBC driver provides a means of basing
+a `ResultSet` on a database cursor and only fetching a small number of rows.
+
+A small number of rows are cached on the client side of the connection and when
+exhausted the next block of rows is retrieved by repositioning the cursor.
+
+### Note
+
+> Cursor based `ResultSets` cannot be used in all situations. There a number of
+ restrictions which will make the driver silently fall back to fetching the
+ whole `ResultSet` at once.
+
+* The connection to the server must be using the V3 protocol. This is the default
+ for (and is only supported by) server versions 7.4 and later.
+* The `Connection` must not be in autocommit mode. The backend closes cursors at
+ the end of transactions, so in autocommit mode the backend will have
+ closed the cursor before anything can be fetched from it.
+*The `Statement` must be created with a `ResultSet` type of `ResultSet.TYPE_FORWARD_ONLY`.
+ This is the default, so no code will need to be rewritten to take advantage
+ of this, but it also means that you cannot scroll backwards or otherwise
+ jump around in the `ResultSet`.
+* The query given must be a single statement, not multiple statements strung
+ together with semicolons.
+
+<a name="fetchsize-example"></a>
+**Example 5.2. Setting fetch size to turn cursors on and off.**
+
+Changing code to cursor mode is as simple as setting the fetch size of the
+`Statement` to the appropriate size. Setting the fetch size back to 0 will cause
+all rows to be cached (the default behaviour).
+
+`// make sure autocommit is off`
+`conn.setAutoCommit(false);`
+`Statement st = conn.createStatement();`<br /><br />
+`// Turn use of the cursor on.`
+`st.setFetchSize(50);`
+`ResultSet rs = st.executeQuery("SELECT * FROM mytable");`
+`while (rs.next())`
+`{`
+ `System.out.print("a row was returned.");`
+`}`
+`rs.close();`<br /><br />
+`// Turn the cursor off.`
+`st.setFetchSize(0);`
+`rs = st.executeQuery("SELECT * FROM mytable");`
+`while (rs.next())`
+`{`
+ `System.out.print("many rows were returned.");`
+`}`
+`rs.close();`<br /><br />
+`// Close the statement.`
+`st.close();`
\ No newline at end of file
diff --git a/docs/documentation/92/reading.md b/docs/documentation/92/reading.md
new file mode 100644
index 0000000..10428bf
--- /dev/null
+++ b/docs/documentation/92/reading.md
@@ -0,0 +1,18 @@
+---
+layout: default_docs
+title: Chapter 12. Further Reading
+header: Chapter 12. Further Reading
+resource: media
+previoustitle: Data Sources and JNDI
+previous: jndi.html
+nexttitle: The PostgreSQL™ JDBC Interface
+next: index.html
+---
+
+If you have not yet read it, you are advised you read the JDBC API Documentation
+(supplied with Oracle's JDK) and the JDBC Specification. Both are available from
+[http://www.oracle.com/technetwork/java/javase/jdbc/index.html](http://www.oracle.com/technetwork/java/javase/jdbc/index.html).
+
+[http://jdbc.postgresql.org/index.html](http://jdbc.postgresql.org/index.html)
+contains updated information not included in this manual including Javadoc class
+documentation and a FAQ. Additionally it offers precompiled drivers.
diff --git a/docs/documentation/92/resultset.md b/docs/documentation/92/resultset.md
new file mode 100644
index 0000000..58c5f5a
--- /dev/null
+++ b/docs/documentation/92/resultset.md
@@ -0,0 +1,19 @@
+---
+layout: default_docs
+title: Using the ResultSet Interface
+header: Chapter 5. Issuing a Query and Processing the Result
+resource: media
+previoustitle: Using the Statement or PreparedStatement Interface
+previous: statement.html
+nexttitle: Performing Updates
+next: update.html
+---
+
+The following must be considered when using the `ResultSet` interface:
+
+* Before reading any values, you must call `next()`. This returns true if there
+ is a result, but more importantly, it prepares the row for processing.
+* You must close a `ResultSet` by calling `close()` once you have finished using
+ it.
+* Once you make another query with the `Statement` used to create a `ResultSet`,
+ the currently open `ResultSet` instance is closed automatically.
\ No newline at end of file
diff --git a/docs/documentation/92/server-prepare.md b/docs/documentation/92/server-prepare.md
new file mode 100644
index 0000000..446e7ff
--- /dev/null
+++ b/docs/documentation/92/server-prepare.md
@@ -0,0 +1,121 @@
+---
+layout: default_docs
+title: Server Prepared Statements
+header: Chapter 9. PostgreSQL™ Extensions to the JDBC API
+resource: media
+previoustitle: Listen / Notify
+previous: listennotify.html
+nexttitle: Chapter 10. Using the Driver in a Multithreaded or a Servlet Environment
+next: thread.html
+---
+
+The PostgreSQL™ server allows clients to compile sql statements that are expected
+to be reused to avoid the overhead of parsing and planning the statement for every
+execution. This functionality is available at the SQL level via PREPARE and EXECUTE
+beginning with server version 7.3, and at the protocol level beginning with server
+version 7.4, but as Java developers we really just want to use the standard
+`PreparedStatement` interface.
+
+### Note
+
+> Previous versions of the driver used PREPARE and EXECUTE to implement
+server-prepared statements. This is supported on all server versions beginning
+with 7.3, but produced application-visible changes in query results, such as
+missing ResultSet metadata and row update counts. The current driver uses the V3
+protocol-level equivalents which avoid these changes in query results, but the
+V3 protocol is only available beginning with server version 7.4. Enabling server-prepared
+statements will have no affect when connected to a 7.3 server or when explicitly
+using the V2 protocol to connect to a 7.4 server.
+
+There are a number of ways to enable server side prepared statements depending on
+your application's needs. The general method is to set a threshold for a
+`PreparedStatement`. An internal counter keeps track of how many times the
+statement has been executed and when it reaches the threshold it will start to
+use server side prepared statements.
+
+### Note
+
+> Server side prepared statements are planned only once by the server. This avoids
+the cost of replanning the query every time, but also means that the planner
+cannot take advantage of the particular parameter values used in a particular
+execution of the query. You should be cautious about enabling the use of server
+side prepared statements globally.
+
+<a name="server-prepared-statement-example"></a>
+**Example 9.3. Using server side prepared statements**
+
+import java.sql.*;
+
+public class ServerSidePreparedStatement
+{
+
+ public static void main(String args[]) throws Exception
+ {
+ Class.forName("org.postgresql.Driver");
+ String url = "jdbc:postgresql://localhost:5432/test";
+ Connection conn = DriverManager.getConnection(url,"test","");
+
+ PreparedStatement pstmt = conn.prepareStatement("SELECT ?");
+
+ // cast to the pg extension interface
+ org.postgresql.PGStatement pgstmt = pstmt.unwrap(org.postgresql.PGStatement.class);
+
+ // on the third execution start using server side statements
+ pgstmt.setPrepareThreshold(3);
+
+ for (int i=1; i<=5; i++)
+ {
+ pstmt.setInt(1,i);
+ boolean usingServerPrepare = pgstmt.isUseServerPrepare();
+ ResultSet rs = pstmt.executeQuery();
+ rs.next();
+ System.out.println("Execution: "+i+", Used server side: " + usingServerPrepare + ", Result: "+rs.getInt(1));
+ rs.close();
+ }
+
+ pstmt.close();
+ conn.close();
+ }
+}
+
+Which produces the expected result of using server side prepared statements upon
+the third execution.
+
+`Execution: 1, Used server side: false, Result: 1`
+`Execution: 2, Used server side: false, Result: 2`
+`Execution: 3, Used server side: true, Result: 3`
+`Execution: 4, Used server side: true, Result: 4`
+`Execution: 5, Used server side: true, Result: 5`
+
+The example shown above requires the programmer to use PostgreSQL™ specific code
+in a supposedly portable API which is not ideal. Also it sets the threshold only
+for that particular statement which is some extra typing if we wanted to use that
+threshold for every statement. Let's take a look at the other ways to set the
+threshold to enable server side prepared statements. There is already a hierarchy
+in place above a `PreparedStatement`, the `Connection` it was created from, and
+above that the source of the connection be it a `Datasource` or a URL. The server
+side prepared statement threshold can be set at any of these levels such that
+the value will be the default for all of it's children.
+
+`// pg extension interfaces`
+`org.postgresql.PGConnection pgconn;`
+`org.postgresql.PGStatement pgstmt;`
+
+`// set a prepared statement threshold for connections created from this url`
+`String url = "jdbc:postgresql://localhost:5432/test?prepareThreshold=3";`
+
+`// see that the connection has picked up the correct threshold from the url`
+`Connection conn = DriverManager.getConnection(url,"test","");`
+`pgconn = conn.unwrap(org.postgresql.PGConnection.class);`
+`System.out.println(pgconn.getPrepareThreshold()); // Should be 3`
+
+`// see that the statement has picked up the correct threshold from the connection`
+`PreparedStatement pstmt = conn.prepareStatement("SELECT ?");`
+`pgstmt = pstmt.unwrap(org.postgresql.PGStatement.class);`
+`System.out.println(pgstmt.getPrepareThreshold()); // Should be 3`
+
+`// change the connection's threshold and ensure that new statements pick it up`
+`pgconn.setPrepareThreshold(5);`
+`PreparedStatement pstmt = conn.prepareStatement("SELECT ?");`
+`pgstmt = pstmt.unwrap(org.postgresql.PGStatement.class);`
+`System.out.println(pgstmt.getPrepareThreshold()); // Should be 5`
diff --git a/docs/documentation/92/setup.md b/docs/documentation/92/setup.md
new file mode 100644
index 0000000..4668660
--- /dev/null
+++ b/docs/documentation/92/setup.md
@@ -0,0 +1,44 @@
+---
+layout: default_docs
+title: Chapter 2. Setting up the JDBC Driver
+header: Chapter 2. Setting up the JDBC Driver
+resource: media
+previoustitle: Chapter 1. Introduction
+previous: intro.html
+nexttitle: Setting up the Class Path
+next: classpath.html
+---
+
+**Table of Contents**
+
+* [Getting the Driver](setup.html#build)
+* [Setting up the Class Path](classpath.html)
+* [Preparing the Database Server for JDBC](prepare.html)
+* [Creating a Database](your-database.html)
+
+This section describes the steps you need to take before you can write or run
+programs that use the JDBC interface.
+
+<a name="build"></a>
+# Getting the Driver
+
+Precompiled versions of the driver can be downloaded from the [PostgreSQL™ JDBC web site](http://jdbc.postgresql.org).
+
+Alternatively you can build the driver from source, but you should only need to
+do this if you are making changes to the source code. To build the JDBC driver,
+you need Ant 1.5 or higher and a JDK. Ant is a special tool for building Java-based
+packages. It can be downloaded from the [Ant web site](http://ant.apache.org/index.html).
+
+If you have several Java compilers installed, it depends on the Ant configuration
+which one gets used. Precompiled Ant distributions are typically set up to read
+a file `.antrc` in the current user's home directory for configuration. For example,
+to use a different JDK than the default, this may work:
+
+`JAVA_HOME=/usr/local/jdk1.6.0_07`
+`JAVACMD=$JAVA_HOME/bin/java`
+
+To compile the driver simply run **ant** in the top level directory. The compiled
+driver will be placed in `jars/postgresql.jar`. The resulting driver will be built
+for the version of Java you are running. If you build with a 1.4 or 1.5 JDK you
+will build a version that supports the JDBC 3 specification and if you build with
+a 1.6 or higher JDK you will build a version that supports the JDBC 4 specification.
\ No newline at end of file
diff --git a/docs/documentation/92/ssl-client.md b/docs/documentation/92/ssl-client.md
new file mode 100644
index 0000000..18dd55a
--- /dev/null
+++ b/docs/documentation/92/ssl-client.md
@@ -0,0 +1,70 @@
+---
+layout: default_docs
+title: Configuring the Client
+header: Chapter 4. Using SSL
+resource: media
+previoustitle: Chapter 4. Using SSL
+previous: ssl.html
+nexttitle: Custom SSLSocketFactory
+next: ssl-factory.html
+---
+
+Unlike psql and other libpq based programs the JDBC driver does server certificate
+validation by default. This means that when establishing a SSL connection the
+JDBC driver will validate the server's identity preventing "man in the middle"
+attacks. It does this by checking that the server certificate is signed by a
+trusted authority. If you have a certificate signed by a global certificate
+authority (CA), there is nothing further to do because Java comes with copies of
+the most common CA's certificates. If you are dealing with a self-signed certificate
+though, you need to make this available to the Java client to enable it to validate
+the server's certificate.
+
+> ### Note
+
+> Only the JDBC 3 driver supports SSL. The 1.4 JDK was the first version to come
+bundled with SSL support. Previous JDK versions that wanted to use SSL could
+make use of the additional JSSE library, but it does not support the full range
+of features utilized by the PostgreSQL™ JDBC driver.
+
+To make the server certificate available to Java, the first step is to convert
+it to a form Java understands.
+
+`openssl x509 -in server.crt -out server.crt.der -outform der`
+
+From here the easiest thing to do is import this certificate into Java's system
+truststore.
+
+`keytool -keystore $JAVA_HOME/lib/security/cacerts -alias postgresql -import -file server.crt.der`
+
+The default password for the cacerts keystore is `changeit`. The alias to postgesql
+is not important and you may select any name you desire.
+
+If you do not have access to the system cacerts truststore you can create your
+own truststore.
+
+`keytool -keystore mystore -alias postgresql -import -file server.crt.der.`
+
+When starting your Java application you must specify this keystore and password
+to use.
+
+`java -Djavax.net.ssl.trustStore=mystore -Djavax.net.ssl.trustStorePassword=mypassword com.mycompany.MyApp`
+
+In the event of problems extra debugging information is available by adding
+`-Djavax.net.debug=ssl` to your command line.
+
+To instruct the JDBC driver to try and establish a SSL connection you must add
+the connection URL parameter `ssl=true`.
+
+<a name="nonvalidating"></a>
+## Using SSL without Certificate Validation
+
+In some situations it may not be possible to configure your Java environment to
+make the server certificate available, for example in an applet. For a large
+scale deployment it would be best to get a certificate signed by recognized
+certificate authority, but that is not always an option. The JDBC driver provides
+an option to establish a SSL connection without doing any validation, but please
+understand the risk involved before enabling this option.
+
+A non-validating connection is established via a custom `SSLSocketFactory` class
+that is provided with the driver. Setting the connection URL parameter `sslfactory=org.postgresql.ssl.NonValidatingFactory`
+will turn off all SSL validation.
\ No newline at end of file
diff --git a/docs/documentation/92/ssl-factory.md b/docs/documentation/92/ssl-factory.md
new file mode 100644
index 0000000..a7e31ee
--- /dev/null
+++ b/docs/documentation/92/ssl-factory.md
@@ -0,0 +1,29 @@
+---
+layout: default_docs
+title: Custom SSLSocketFactory
+header: Chapter 4. Using SSL
+resource: media
+previoustitle: Configuring the Client
+previous: ssl-client.html
+nexttitle: Chapter 5. Issuing a Query and Processing the Result
+next: query.html
+---
+
+PostgreSQL™ provides a way for developers to customize how a SSL connection is
+established. This may be used to provide a custom certificate source or other
+extensions by allowing the developer to create their own `SSLContext` instance.
+The connection URL parameters `sslfactory` and `sslfactoryarg` allow the user
+to specify which custom class to use for creating the `SSLSocketFactory`. The
+class name specified by `sslfactory` must extend `javax.net.ssl.SSLSocketFactory`
+and be available to the driver's classloader. This class must have a zero argument
+constructor or a single argument constructor taking a String argument. This
+argument may optionally be supplied by `sslfactoryarg`.
+
+Information on how to actually implement such a class is beyond the scope of this
+documentation. Places to look for help are the [JSSE Reference Guide](https://docs.oracle.com/javase/8/docs/technotes/guides/security/jsse/JSSERefGuide.html)
+and the source to the `NonValidatingFactory` provided by the JDBC driver.
+
+The Java SSL API is not very well known to the JDBC driver developers and we
+would be interested in any interesting and generally useful extensions that you
+have implemented using this mechanism. Specifically it would be nice to be able
+to provide client certificates to be validated by the server.
diff --git a/docs/documentation/92/ssl.md b/docs/documentation/92/ssl.md
new file mode 100644
index 0000000..af93238
--- /dev/null
+++ b/docs/documentation/92/ssl.md
@@ -0,0 +1,37 @@
+---
+layout: default_docs
+title: Chapter 4. Using SSL
+header: Chapter 4. Using SSL
+resource: media
+previoustitle: Connecting to the Database
+previous: connect.html
+nexttitle: Configuring the Client
+next: ssl-client.html
+---
+
+**Table of Contents**
+
+* [Configuring the Server](ssl.html#ssl-server)
+* [Configuring the Client](ssl-client.html)
+ * [Using SSL without Certificate Validation](ssl-client.html#nonvalidating)
+* [Custom SSLSocketFactory](ssl-factory.html)
+
+<a name="ssl-server"></a>
+# Configuring the Server
+
+Configuring the PostgreSQL™ server for SSL is covered in the [main
+documentation](http://www.postgresql.org/docs/current/static/ssl-tcp.html),
+so it will not be repeated here. Before trying to access your SSL enabled
+server from Java, make sure you can get to it via **psql**. You should
+see output like the following if you have established a SSL connnection.
+
+`$ ./bin/psql -h localhost`
+`Welcome to psql 8.0.0rc5, the PostgreSQL interactive terminal.`
+
+`Type: \copyright for distribution terms`
+ `\h for help with SQL commands`
+ `\? for help with psql commands`
+ `\g or terminate with semicolon to execute query`
+ `\q to quit`
+
+`SSL connection (cipher: DHE-RSA-AES256-SHA, bits: 256)`
\ No newline at end of file
diff --git a/docs/documentation/92/statement.md b/docs/documentation/92/statement.md
new file mode 100644
index 0000000..20f3e5f
--- /dev/null
+++ b/docs/documentation/92/statement.md
@@ -0,0 +1,25 @@
+---
+layout: default_docs
+title: Using the Statement or PreparedStatement Interface
+header: Chapter 5. Issuing a Query and Processing the Result
+resource: media
+previoustitle: Chapter 5. Issuing a Query and Processing the Result
+previous: query.html
+nexttitle: Using the ResultSet Interface
+next: resultset.html
+---
+
+The following must be considered when using the `Statement` or `PreparedStatement`
+interface:
+
+* You can use a single `Statement` instance as many times as you want. You could
+ create one as soon as you open the connection and use it for the connection's
+ lifetime. But you have to remember that only one `ResultSet` can exist
+ per `Statement` or `PreparedStatement` at a given time.
+* If you need to perform a query while processing a `ResultSet`, you can simply
+ create and use another `Statement`.
+* If you are using threads, and several are using the database, you must use a
+ separate `Statement` for each thread. Refer to [Chapter 10, *Using the Driver in a Multithreaded or a Servlet Environment*](thread.html)
+ if you are thinking of using threads, as it covers some important points.
+* When you are done using the `Statement` or `PreparedStatement` you should close
+ it.
\ No newline at end of file
diff --git a/docs/documentation/92/thread.md b/docs/documentation/92/thread.md
new file mode 100644
index 0000000..d79f25b
--- /dev/null
+++ b/docs/documentation/92/thread.md
@@ -0,0 +1,38 @@
+---
+layout: default_docs
+title: Chapter 10. Using the Driver in a Multithreaded or a Servlet Environment
+header: Chapter 10. Using the Driver in a Multithreaded or a Servlet Environment
+resource: media
+previoustitle: Server Prepared Statements
+previous: server-prepare.html
+nexttitle: Chapter 11. Connection Pools and Data Sources
+next: datasource.html
+---
+
+A problem with many JDBC drivers is that only one thread can use a `Connection`
+at any one time --- otherwise a thread could send a query while another one is
+receiving results, and this could cause severe confusion.
+
+The PostgreSQL™ JDBC driver is thread safe. Consequently, if your application
+uses multiple threads then you do not have to worry about complex algorithms to
+ensure that only one thread uses the database at a time.
+
+If a thread attempts to use the connection while another one is using it, it
+will wait until the other thread has finished its current operation. If the
+operation is a regular SQL statement, then the operation consists of sending the
+statement and retrieving any `ResultSet` (in full). If it is a fast-path call
+(e.g., reading a block from a large object) then it consists of sending and
+retrieving the respective data.
+
+This is fine for applications and applets but can cause a performance problem
+with servlets. If you have several threads performing queries then each but one
+will pause. To solve this, you are advised to create a pool of connections. When
+ever a thread needs to use the database, it asks a manager class for a `Connection`
+object. The manager hands a free connection to the thread and marks it as busy.
+If a free connection is not available, it opens one. Once the thread has
+finished using the connection, it returns it to the manager which can then either
+close it or add it to the pool. The manager would also check that the connection
+is still alive and remove it from the pool if it is dead. The down side of a
+connection pool is that it increases the load on the server because a new session
+is created for each `Connection` object. It is up to you and your applications's
+requirements.
\ No newline at end of file
diff --git a/docs/documentation/92/tomcat.md b/docs/documentation/92/tomcat.md
new file mode 100644
index 0000000..ece8816
--- /dev/null
+++ b/docs/documentation/92/tomcat.md
@@ -0,0 +1,121 @@
+---
+layout: default_docs
+title: Tomcat setup
+header: Chapter 11. Connection Pools and Data Sources
+resource: media
+previoustitle: Applications DataSource
+previous: ds-ds.html
+nexttitle: Data Sources and JNDI
+next: jndi.html
+---
+
+### Note
+
+The postgresql.jar file must be placed in $CATALINA_HOME/common/lib in both
+Tomcat 4 and 5.
+
+The absolute easiest way to set this up in either tomcat instance is to use the
+admin web application that comes with Tomcat, simply add the datasource to the
+context you want to use it in.
+
+Setup for Tomcat 4 place the following inside the <Context> tag inside
+conf/server.xml
+
+<pre><code>
+<Resource name="jdbc/postgres" scope="Shareable" type="javax.sql.DataSource"/>
+<ResourceParams name="jdbc/postgres">
+ <parameter>
+ <name>validationQuery</name>
+ <value>select version();</value>
+ </parameter>
+ <parameter>
+ <name>url</name>
+ <value>jdbc:postgresql://localhost/davec</value>
+ </parameter>
+ <parameter>
+ <name>password</name>
+ <value>davec</value>
+ </parameter>
+ <parameter>
+ <name>maxActive</name>
+ <value>4</value>
+ </parameter>
+ <parameter>
+ <name>maxWait</name>
+ <value>5000</value>
+ </parameter>
+ <parameter>
+ <name>driverClassName</name>
+ <value>org.postgresql.Driver</value>
+ </parameter>
+ <parameter>
+ <name>username</name>
+ <value>davec</value>
+ </parameter>
+ <parameter>
+ <name>maxIdle</name>
+ <value>2</value>
+ </parameter>
+</ResourceParams>
+</code></pre>
+
+Setup for Tomcat 5, you can use the above method, except that it goes inside the
+<DefaultContext> tag inside the <Host> tag. eg. <Host> ... <DefaultContext> ...
+
+Alternatively there is a conf/Catalina/hostname/context.xml file. For example
+http://localhost:8080/servlet-example has a directory $CATALINA_HOME/conf/Catalina/localhost/servlet-example.xml file.
+Inside this file place the above xml inside the <Context> tag
+
+Then you can use the following code to access the connection.
+
+<pre><code>
+import javax.naming.*;
+import javax.sql.*;
+import java.sql.*;
+public class DBTest
+{
+
+ String foo = "Not Connected";
+ int bar = -1;
+
+ public void init()
+ {
+ try
+ {
+ Context ctx = new InitialContext();
+ if(ctx == null )
+ throw new Exception("Boom - No Context");
+
+ // /jdbc/postgres is the name of the resource above
+ DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/postgres");
+
+ if (ds != null)
+ {
+ Connection conn = ds.getConnection();
+
+ if(conn != null)
+ {
+ foo = "Got Connection "+conn.toString();
+ Statement stmt = conn.createStatement();
+ ResultSet rst = stmt.executeQuery("select id, foo, bar from testdata");
+
+ if(rst.next())
+ {
+ foo=rst.getString(2);
+ bar=rst.getInt(3);
+ }
+ conn.close();
+ }
+ }
+ }
+ catch(Exception e)
+ {
+ e.printStackTrace();
+ }
+ }
+
+ public String getFoo() { return foo; }
+
+ public int getBar() { return bar;}
+}
+</code></pre>
\ No newline at end of file
diff --git a/docs/documentation/92/update.md b/docs/documentation/92/update.md
new file mode 100644
index 0000000..a681c41
--- /dev/null
+++ b/docs/documentation/92/update.md
@@ -0,0 +1,30 @@
+---
+layout: default_docs
+title: Performing Updates
+header: Chapter 5. Issuing a Query and Processing the Result
+resource: media
+previoustitle: Using the ResultSet Interface
+previous: resultset.html
+nexttitle: Creating and Modifying Database Objects
+next: ddl.html
+---
+
+To change data (perform an `INSERT`, `UPDATE`, or `DELETE`) you use the
+`executeUpdate()` method. This method is similar to the method `executeQuery()`
+used to issue a `SELECT` statement, but it doesn't return a `ResultSet`; instead
+it returns the number of rows affected by the `INSERT`, `UPDATE`, or `DELETE`
+statement. [Example 5.3, “Deleting Rows in JDBC”](update.html#delete-example)
+illustrates the usage.
+
+<a name="delete-example"></a>
+**Example 5.3. Deleting Rows in JDBC**
+
+This example will issue a simple `DELETE` statement and print out the number of
+rows deleted.
+
+`int foovalue = 500;`
+`PreparedStatement st = conn.prepareStatement("DELETE FROM mytable WHERE columnfoo = ?");`
+`st.setInt(1, foovalue);`
+`int rowsDeleted = st.executeUpdate();`
+`System.out.println(rowsDeleted + " rows deleted");`
+`st.close();`
\ No newline at end of file
diff --git a/docs/documentation/92/use.md b/docs/documentation/92/use.md
new file mode 100644
index 0000000..97f27f9
--- /dev/null
+++ b/docs/documentation/92/use.md
@@ -0,0 +1,32 @@
+---
+layout: default_docs
+title: Chapter 3. Initializing the Driver
+header: Chapter 3. Initializing the Driver
+resource: media
+previoustitle: Creating a Database
+previous: your-database.html
+nexttitle: Chapter 3. Loading the Driver
+next: load.html
+---
+
+**Table of Contents**
+
+
+* [Importing JDBC](use.html#import)
+* [Loading the Driver](load.html)
+* [Connecting to the Databas](connect.html)
+ * [Connection Parameters](connect.html#connection-parameters)
+
+This section describes how to load and initialize the JDBC driver in your programs.
+
+<a name="import"></a>
+# Importing JDBC
+
+Any source that uses JDBC needs to import the `java.sql` package, using:
+
+import java.sql.*;
+
+### Note
+
+You should not import the `org.postgresql` package unless you are not using standard
+PostgreSQL™ extensions to the JDBC API.
\ No newline at end of file
diff --git a/docs/documentation/92/your-database.md b/docs/documentation/92/your-database.md
new file mode 100644
index 0000000..e809e74
--- /dev/null
+++ b/docs/documentation/92/your-database.md
@@ -0,0 +1,20 @@
+---
+layout: default_docs
+title: Creating a Database
+header: Chapter 2. Setting up the JDBC Driver
+resource: media
+previoustitle: Preparing the Database Server for JDBC
+previous: prepare.html
+nexttitle: Chapter 3. Initializing the Driver
+next: use.html
+---
+
+When creating a database to be accessed via JDBC it is important to select an
+appropriate encoding for your data. Many other client interfaces do not care
+what data you send back and forth, and will allow you to do inappropriate things,
+but Java makes sure that your data is correctly encoded. Do not use a database
+that uses the `SQL_ASCII` encoding. This is not a real encoding and you will
+have problems the moment you store data in it that does not fit in the seven
+bit ASCII character set. If you do not know what your encoding will be or are
+otherwise unsure about what you will be storing the `UNICODE` encoding is a
+reasonable default to use.
\ No newline at end of file
diff --git a/docs/documentation/93/binary-data.md b/docs/documentation/93/binary-data.md
new file mode 100644
index 0000000..16470e1
--- /dev/null
+++ b/docs/documentation/93/binary-data.md
@@ -0,0 +1,179 @@
+---
+layout: default_docs
+title: Chapter 7. Storing Binary Data
+header: Chapter 7. Storing Binary Data
+resource: media
+previoustitle: Chapter 6. Calling Stored Functions
+previous: callproc.html
+nexttitle: Chapter 8. JDBC escapes
+next: escapes.html
+---
+
+PostgreSQL™ provides two distinct ways to store binary data. Binary data can be
+stored in a table using the data type BYTEA or by using the Large Object feature
+which stores the binary data in a separate table in a special format and refers
+to that table by storing a value of type OID in your table.
+
+In order to determine which method is appropriate you need to understand the
+limitations of each method. The BYTEA data type is not well suited for storing
+very large amounts of binary data. While a column of type BYTEA can hold up to
+1 GB of binary data, it would require a huge amount of memory to process such a
+large value. The Large Object method for storing binary data is better suited to
+storing very large values, but it has its own limitations. Specifically deleting
+a row that contains a Large Object reference does not delete the Large Object.
+Deleting the Large Object is a separate operation that needs to be performed.
+Large Objects also have some security issues since anyone connected to the
+database can view and/or modify any Large Object, even if they don't have
+permissions to view/update the row containing the Large Object reference.
+
+Version 7.2 was the first release of the JDBC driver that supports the BYTEA
+data type. The introduction of this functionality in 7.2 has introduced a change
+in behavior as compared to previous releases. Since 7.2, the methods `getBytes()`,
+`setBytes()`, `getBinaryStream()`, and `setBinaryStream()` operate on the BYTEA
+data type. In 7.1 and earlier, these methods operated on the OID data type
+associated with Large Objects. It is possible to revert the driver back to the
+old 7.1 behavior by setting the property `compatible` on the `Connection` object
+to the value `7.1`. More details on connection properties are available in the
+section called [“Connection Parameters”](connect.html#connection-parameters).
+
+To use the BYTEA data type you should simply use the `getBytes()`, `setBytes()`,
+`getBinaryStream()`, or `setBinaryStream()` methods.
+
+To use the Large Object functionality you can use either the `LargeObject` class
+provided by the PostgreSQL™ JDBC driver, or by using the `getBLOB()` and `setBLOB()`
+methods.
+
+### Important
+
+> You must access Large Objects within an SQL transaction block. You can start a
+transaction block by calling `setAutoCommit(false)`.
+
+[Example 7.1, “Processing Binary Data in JDBC”](binary-data.html#binary-data-example)
+contains some examples on how to process binary data using the PostgreSQL™ JDBC
+driver.
+
+<a name="binary-data-example"></a>
+***Example 7.1. Processing Binary Data in JDBC***
+
+For example, suppose you have a table containing the file names of images and you
+also want to store the image in a BYTEA column:
+
+`CREATE TABLE images (imgname text, img bytea);`
+
+To insert an image, you would use:
+
+`File file = new File("myimage.gif");`
+`FileInputStream fis = new FileInputStream(file);`
+`PreparedStatement ps = conn.prepareStatement("INSERT INTO images VALUES (?, ?)");`
+`ps.setString(1, file.getName());`
+`ps.setBinaryStream(2, fis, (int)file.length());`
+`ps.executeUpdate();`
+`ps.close();`
+`fis.close();`
+
+Here, `setBinaryStream()` transfers a set number of bytes from a stream into the
+column of type BYTEA. This also could have been done using the `setBytes()` method
+if the contents of the image was already in a `byte[]`.
+
+### Note
+
+> The length parameter to `setBinaryStream` must be correct. There is no way to
+indicate that the stream is of unknown length. If you are in this situation, you
+must read the stream yourself into temporary storage and determine the length.
+Now with the correct length you may send the data from temporary storage on to
+the driver.
+
+Retrieving an image is even easier. (We use `PreparedStatement` here, but the
+`Statement` class can equally be used.)
+
+`PreparedStatement ps = conn.prepareStatement("SELECT img FROM images WHERE imgname = ?");`
+`ps.setString(1, "myimage.gif");`
+`ResultSet rs = ps.executeQuery();`
+`while (rs.next())`
+`{`
+ `byte[] imgBytes = rs.getBytes(1);`
+ `// use the data in some way here`
+`}`
+`rs.close();`
+`ps.close();`
+
+Here the binary data was retrieved as an `byte[]`. You could have used a
+`InputStream` object instead.
+
+Alternatively you could be storing a very large file and want to use the
+`LargeObject` API to store the file:
+
+`CREATE TABLE imageslo (imgname text, imgoid oid);`
+
+To insert an image, you would use:
+
+
+`// All LargeObject API calls must be within a transaction block`
+`conn.setAutoCommit(false);``<br />
+
+`// Get the Large Object Manager to perform operations with`
+`LargeObjectManager lobj = conn.unwrap(org.postgresql.PGConnection.class).getLargeObjectAPI();`<br />
+
+`// Create a new large object`
+`long oid = lobj.createLO(LargeObjectManager.READ | LargeObjectManager.WRITE);`<br />
+
+`// Open the large object for writing`
+`LargeObject obj = lobj.open(oid, LargeObjectManager.WRITE);`<br />
+
+`// Now open the file`
+`File file = new File("myimage.gif");`
+`FileInputStream fis = new FileInputStream(file);`<br />
+
+`// Copy the data from the file to the large object`
+`byte buf[] = new byte[2048];`
+`int s, tl = 0;`
+`while ((s = fis.read(buf, 0, 2048)) > 0)`
+`{`
+ `obj.write(buf, 0, s);`
+ `tl += s;`
+`}`<br />
+
+`// Close the large object`
+`obj.close();`<br />
+
+`// Now insert the row into imageslo`
+`PreparedStatement ps = conn.prepareStatement("INSERT INTO imageslo VALUES (?, ?)");`
+`ps.setString(1, file.getName());`
+`ps.setLong(2, oid);`
+`ps.executeUpdate();`
+`ps.close();`
+`fis.close();`<br />
+
+`// Finally, commit the transaction.`
+`conn.commit();`
+
+Retrieving the image from the Large Object:
+
+`// All LargeObject API calls must be within a transaction block`
+`conn.setAutoCommit(false);`<br />
+
+`// Get the Large Object Manager to perform operations with`
+`LargeObjectManager lobj = conn.unwrap(org.postgresql.PGConnection.class).getLargeObjectAPI();`<br />
+
+`PreparedStatement ps = conn.prepareStatement("SELECT imgoid FROM imageslo WHERE imgname = ?");`
+`ps.setString(1, "myimage.gif");`
+`ResultSet rs = ps.executeQuery();`
+`while (rs.next())`
+`{`
+ `// Open the large object for reading`
+ `long oid = rs.getLong(1);`
+ `LargeObject obj = lobj.open(oid, LargeObjectManager.READ);`<br />
+
+ `// Read the data`
+ `byte buf[] = new byte[obj.size()];`
+ `obj.read(buf, 0, obj.size());`
+ `// Do something with the data read here`<br />
+
+ `// Close the object`
+ `obj.close();`
+`}`
+`rs.close();`
+`ps.close();`<br />
+
+`// Finally, commit the transaction.`
+`conn.commit();`
diff --git a/docs/documentation/93/callproc.md b/docs/documentation/93/callproc.md
new file mode 100644
index 0000000..bc16a35
--- /dev/null
+++ b/docs/documentation/93/callproc.md
@@ -0,0 +1,116 @@
+---
+layout: default_docs
+title: Chapter 6. Calling Stored Functions
+header: Chapter 6. Calling Stored Functions
+resource: media
+previoustitle: Creating and Modifying Database Objects
+previous: ddl.html
+nexttitle: Chapter 7. Storing Binary Data
+next: binary-data.html
+---
+
+**Table of Contents**
+
+* [Obtaining a `ResultSet` from a stored function](callproc.html#callproc-resultset)
+ * [From a Function Returning `SETOF` type](callproc.html#callproc-resultset-setof)
+ * [From a Function Returning a refcursor](callproc.html#callproc-resultset-refcursor)
+
+<a name="call-function-example"></a>
+**Example 6.1. Calling a built in stored function**
+
+This example shows how to call a PostgreSQL™ built in function, `upper`, which
+simply converts the supplied string argument to uppercase.
+
+`CallableStatement upperProc = conn.prepareCall("{ ? = call upper( ? ) }");`
+`upperProc.registerOutParameter(1, Types.VARCHAR);`
+`upperProc.setString(2, "lowercase to uppercase");`
+`upperProc.execute();`
+`String upperCased = upperProc.getString(1);`
+`upperProc.close();`
+
+<a name="callproc-resultset"></a>
+# Obtaining a `ResultSet` from a stored function
+
+PostgreSQL's™ stored functions can return results in two different ways. The
+function may return either a refcursor value or a `SETOF` some datatype. Depending
+on which of these return methods are used determines how the function should be
+called.
+
+<a name="callproc-resultset-setof"></a>
+## From a Function Returning `SETOF` type
+
+Functions that return data as a set should not be called via the `CallableStatement`
+interface, but instead should use the normal `Statement` or `PreparedStatement`
+interfaces.
+
+<a name="setof-resultset"></a>
+**Example 6.2. Getting `SETOF` type values from a function**
+
+`Statement stmt = conn.createStatement();`
+`stmt.execute("CREATE OR REPLACE FUNCTION setoffunc() RETURNS SETOF int AS "`
+ `+ "' SELECT 1 UNION SELECT 2;' LANGUAGE sql");`
+`ResultSet rs = stmt.executeQuery("SELECT * FROM setoffunc()");`
+`while (rs.next())`
+`{`
+ `// do something`
+`}`
+`rs.close();`
+`stmt.close();`
+
+<a name="callproc-resultset-refcursor"></a>
+## From a Function Returning a refcursor
+
+When calling a function that returns a refcursor you must cast the return type of
+`getObject` to a `ResultSet`
+
+### Note
+
+> One notable limitation of the current support for a `ResultSet` created from
+a refcursor is that even though it is a cursor backed `ResultSet`, all data will
+be retrieved and cached on the client. The `Statement` fetch size parameter
+described in the section called [“Getting results based on a cursor”](query.html#query-with-cursor)
+is ignored. This limitation is a deficiency of the JDBC driver, not the server,
+and it is technically possible to remove it, we just haven't found the time.
+
+<a name="get-refcursor-from-function-call"></a>
+**Example 6.3. Getting refcursor Value From a Function**
+
+`// Setup function to call.`
+`Statement stmt = conn.createStatement();`
+`stmt.execute("CREATE OR REPLACE FUNCTION refcursorfunc() RETURNS refcursor AS '"`
+ `+ " DECLARE "`
+ `+ " mycurs refcursor; "`
+ `+ " BEGIN "`
+ `+ " OPEN mycurs FOR SELECT 1 UNION SELECT 2; "`
+ `+ " RETURN mycurs; "`
+ `+ " END;' language plpgsql");`
+`stmt.close();`<br />
+
+`// We must be inside a transaction for cursors to work.`
+`conn.setAutoCommit(false);`<br />
+
+`// Procedure call.`
+`CallableStatement proc = conn.prepareCall("{ ? = call refcursorfunc() }");`
+`proc.registerOutParameter(1, Types.OTHER);`
+`proc.execute();`
+`ResultSet results = (ResultSet) proc.getObject(1);`
+`while (results.next())`
+`{`
+ `// do something with the results.`
+`}`
+`results.close();`
+`proc.close();`
+
+It is also possible to treat the refcursor return value as a cursor name directly.
+To do this, use the `getString` of `ResultSet`. With the underlying cursor name,
+you are free to directly use cursor commands on it, such as `FETCH` and `MOVE`.
+
+<a name="refcursor-string-example"></a>
+**Example 6.4. Treating refcursor as a cursor name**
+
+`conn.setAutoCommit(false);`
+`CallableStatement proc = conn.prepareCall("{ ? = call refcursorfunc() }");`
+`proc.registerOutParameter(1, Types.OTHER);`
+`proc.execute();`
+`String cursorName = proc.getString(1);`
+`proc.close();`
\ No newline at end of file
diff --git a/docs/documentation/93/classpath.md b/docs/documentation/93/classpath.md
new file mode 100644
index 0000000..e4d0c50
--- /dev/null
+++ b/docs/documentation/93/classpath.md
@@ -0,0 +1,26 @@
+---
+layout: default_docs
+title: Setting up the Class Path
+header: Chapter 2. Setting up the JDBC Driver
+resource: media
+previoustitle: Chapter 2. Setting up the JDBC Driver
+previous: setup.html
+nexttitle: Preparing the Database Server for JDBC
+next: prepare.html
+---
+
+To use the driver, the JAR archive named `postgresql.jar` if you built from source,
+otherwise it will likely be (named with the following convention: `postgresql-*[server version]*.*[build number]*.jdbc*[JDBC version]*.jar`,
+for example `postgresql-8.0-310.jdbc3.jar`) needs to be included in the class path,
+either by putting it in the `CLASSPATH` environment variable, or by using flags on
+the **java** command line.
+
+For instance, assume we have an application that uses the JDBC driver to access
+a database, and that application is installed as `/usr/local/lib/myapp.jar`. The
+PostgreSQL™ JDBC driver installed as `/usr/local/pgsql/share/java/postgresql.jar`.
+To run the application, we would use:
+
+*export CLASSPATH=/usr/local/lib/myapp.jar:/usr/local/pgsql/share/java/postgresql.jar:*.
+*java MyApp*
+
+Loading the driver from within the application is covered in [Chapter 3, Initializing the Driver](use.html).
\ No newline at end of file
diff --git a/docs/documentation/93/connect.md b/docs/documentation/93/connect.md
new file mode 100644
index 0000000..ed1a972
--- /dev/null
+++ b/docs/documentation/93/connect.md
@@ -0,0 +1,234 @@
+---
+layout: default_docs
+title: Connecting to the Database
+header: Chapter 3. Initializing the Driver
+resource: media
+previoustitle: Loading the Driver
+previous: load.html
+nexttitle: Chapter 4. Using SSL
+next: ssl.html
+---
+
+With JDBC, a database is represented by a URL (Uniform Resource Locator). With
+PostgreSQL™, this takes one of the following forms:
+
+* jdbc:postgresql:*`database`*
+* jdbc:postgresql:/
+* jdbc:postgresql://*`host/database`*
+* jdbc:postgresql://*`host/`*
+* jdbc:postgresql://*`host:port/database`*
+* jdbc:postgresql://*`host:port/`*
+
+The parameters have the following meanings:
+
+* *`host`*
+
+ The host name of the server. Defaults to `localhost`. To specify an IPv6
+ address your must enclose the `host` parameter with square brackets, for
+ example:
+
+ jdbc:postgresql://[::1]:5740/accounting
+
+* *`port`*
+
+ The port number the server is listening on. Defaults to the PostgreSQL™
+ standard port number (5432).
+
+* *`database`*
+
+ The database name. The default is to connect to a database with the same name
+ as the user name.
+
+To connect, you need to get a `Connection` instance from JDBC. To do this, you use
+the `DriverManager.getConnection()` method:
+
+`Connection db = DriverManager.getConnection(url, username, password)`;
+
+<a name="connection-parameters"></a>
+## Connection Parameters
+
+In addition to the standard connection parameters the driver supports a number
+of additional properties which can be used to specify additional driver behaviour
+specific to PostgreSQL™. These properties may be specified in either the connection
+URL or an additional `Properties` object parameter to `DriverManager.getConnection`.
+The following examples illustrate the use of both methods to establish a SSL
+connection.
+
+`String url = "jdbc:postgresql://localhost/test";`
+`Properties props = new Properties();`
+`props.setProperty("user","fred");`
+`props.setProperty("password","secret");`
+`props.setProperty("ssl","true");`
+`Connection conn = DriverManager.getConnection(url, props);`
+
+`String url = "jdbc:postgresql://localhost/test?user=fred&password=secret&ssl=true";`
+`Connection conn = DriverManager.getConnection(url);`
+
+* `user = String`
+
+ The database user on whose behalf the connection is being made.
+
+* `password = String`
+
+ The database user's password.
+
+* `ssl`
+
+ Connect using SSL. The driver must have been compiled with SSL support.
+ This property does not need a value associated with it. The mere presence
+ of it specifies a SSL connection. However, for compatibility with future
+ versions, the value "true" is preferred. For more information see [Chapter
+ 4, *Using SSL*](ssl.html).
+
+* `sslfactory = String`
+
+ The provided value is a class name to use as the `SSLSocketFactory` when
+ establishing a SSL connection. For more information see the section
+ called [“Custom SSLSocketFactory”](ssl-factory.html).
+
+* `sslfactoryarg = String`
+
+ This value is an optional argument to the constructor of the sslfactory
+ class provided above. For more information see the section called [“Custom SSLSocketFactory”](ssl-factory.html).
+
+* `compatible = String`
+
+ Act like an older version of the driver to retain compatibility with older
+ applications. At the moment this controls two driver behaviours: the
+ handling of binary data fields, and the handling of parameters set via
+ `setString()`.
+
+ Older versions of the driver used this property to also control the
+ protocol used to connect to the backend. This is now controlled by the
+ `protocolVersion` property.
+
+ Information on binary data handling is detailed in [Chapter 7, Storing Binary Data](binary-data.html).
+ To force the use of Large Objects set the compatible property to 7.1.
+
+ When `compatible` is set to 7.4 or below, the default for the `stringtype`
+ parameter is changed to `unspecified`.
+
+* `sendBufferSize = int`
+ Sets SO_SNDBUF on the connection stream
+
+* `recvBufferSize = int`
+ Sets SO_RCVBUF on the connection stream
+
+* `protocolVersion = String`
+
+ The driver supports both the V2 and V3 frontend/backend protocols. The
+ V3 protocol was introduced in 7.4 and the driver will by default try to
+ connect using the V3 protocol, if that fails it will fall back to the V2
+ protocol. If the protocolVersion property is specified, the driver will
+ try only the specified protocol (which should be either "2" or "3").
+ Setting protocolVersion to "2" may be used to avoid the failed attempt
+ to use the V3 protocol when connecting to a version 7.3 or earlier server,
+ or to force the driver to use the V2 protocol despite connecting to a 7.4
+ or greater server.
+
+* `loglevel = int`
+
+ Set the amount of logging information printed to the DriverManager's
+ current value for LogStream or LogWriter. It currently supports values
+ of `org.postgresql.Driver.DEBUG` (2) and `org.postgresql.Driver.INFO` (1).
+ `INFO` will log very little information while `DEBUG` will produce significant
+ detail. This property is only really useful if you are a developer or
+ are having problems with the driver.
+
+* `charSet = String`
+
+ The character set to use for data sent to the database or received from
+ the database. This property is only relevant for server versions less
+ than or equal to 7.2. The 7.3 release was the first with multibyte support
+ compiled by default and the driver uses its character set translation
+ facilities instead of trying to do it itself.
+
+* `allowEncodingChanges = boolean`
+
+ When using the V3 protocol the driver monitors changes in certain server
+ configuration parameters that should not be touched by end users. The
+ `client_encoding` setting is set by the driver and should not be altered.
+ If the driver detects a change it will abort the connection. There is
+ one legitimate exception to this behaviour though, using the `COPY` command
+ on a file residing on the server's filesystem. The only means of specifying
+ the encoding of this file is by altering the `client_encoding` setting.
+ The JDBC team considers this a failing of the `COPY` command and hopes to
+ provide an alternate means of specifying the encoding in the future, but
+ for now there is this URL parameter. Enable this only if you need to
+ override the client encoding when doing a copy.
+
+* `logUnclosedConnections = boolean`
+
+ Clients may leak `Connection` objects by failing to call its `close()`
+ method. Eventually these objects will be garbage collected and the
+ `finalize()` method will be called which will close the `Connection` if
+ caller has neglected to do this himself. The usage of a finalizer is just
+ a stopgap solution. To help developers detect and correct the source of
+ these leaks the `logUnclosedConnections` URL parameter has been added.
+ It captures a stacktrace at each `Connection` opening and if the `finalize()`
+ method is reached without having been closed the stacktrace is printed
+ to the log.
+
+* `prepareThreshold = int`
+
+ Determine the number of `PreparedStatement` executions required before
+ switching over to use server side prepared statements. The default is
+ five, meaning start using server side prepared statements on the fifth
+ execution of the same `PreparedStatement` object. More information on
+ server side prepared statements is available in the section called
+ [“Server Prepared Statements”](server-prepare.html).
+
+* `loginTimeout = int`
+
+ Specify how long to wait for establishment of a database connection. The
+ timeout is specified in seconds.
+
+* `socketTimeout = int`
+
+ The timeout value used for socket read operations. If reading from the
+ server takes longer than this value, the connection is closed. This can
+ be used as both a brute force global query timeout and a method of
+ detecting network problems. The timeout is specified in seconds and a
+ value of zero means that it is disabled.
+
+* `tcpKeepAlive = boolean`
+
+ Enable or disable TCP keep-alive probe. The default is `false`.
+
+* `unknownLength = int`
+
+ Certain postgresql types such as `TEXT` do not have a well defined length.
+ When returning meta-data about these types through functions like
+ `ResultSetMetaData.getColumnDisplaySize` and `ResultSetMetaData.getPrecision`
+ we must provide a value and various client tools have different ideas
+ about what they would like to see. This parameter specifies the length
+ to return for types of unknown length.
+
+* `stringtype = String`
+
+ Specify the type to use when binding `PreparedStatement` parameters set
+ via `setString()`. If `stringtype` is set to `VARCHAR` (the default), such
+ parameters will be sent to the server as varchar parameters. If `stringtype`
+ is set to `unspecified`, parameters will be sent to the server as untyped
+ values, and the server will attempt to infer an appropriate type. This
+ is useful if you have an existing application that uses `setString()` to
+ set parameters that are actually some other type, such as integers, and
+ you are unable to change the application to use an appropriate method
+ such as `setInt()`.
+
+* `kerberosServerName = String`
+
+ The Kerberos service name to use when authenticating with GSSAPI. This
+ is equivalent to libpq's PGKRBSRVNAME environment variable and defaults
+ to "postgres".
+
+* `jaasApplicationName = String`
+
+ Specifies the name of the JAAS system or application login configuration.
+
+* `ApplicationName = String`
+
+ Specifies the name of the application that is using the connection.
+ This allows a database administrator to see what applications are
+ connected to the server and what resources they are using through views like pg_stat_activity.
+
diff --git a/docs/documentation/93/datasource.md b/docs/documentation/93/datasource.md
new file mode 100644
index 0000000..c67b1c4
--- /dev/null
+++ b/docs/documentation/93/datasource.md
@@ -0,0 +1,44 @@
+---
+layout: default_docs
+title: Chapter 11. Connection Pools and Data Sources
+header: Chapter 11. Connection Pools and Data Sources
+resource: media
+previoustitle: Chapter 10. Using the Driver in a Multithreaded or a Servlet Environment
+previous: thread.html
+nexttitle: Application Servers ConnectionPoolDataSource
+next: ds-cpds.html
+---
+
+**Table of Contents**
+
+* [Overview](datasource.html#ds-intro)
+* [Application Servers: `ConnectionPoolDataSource`](ds-cpds.html)
+* [Applications: `DataSource`](ds-ds.html)
+* [Tomcat setup](tomcat.html)
+* [Data Sources and JNDI](jndi.html)
+
+JDBC 2 introduced standard connection pooling features in an add-on API known as
+the JDBC 2.0 Optional Package (also known as the JDBC 2.0 Standard Extension).
+These features have since been included in the core JDBC 3 API.
+
+<a name="ds-intro"></a>
+# Overview
+
+The JDBC API provides a client and a server interface for connection pooling.
+The client interface is `javax.sql.DataSource`, which is what application code
+will typically use to acquire a pooled database connection. The server interface
+is `javax.sql.ConnectionPoolDataSource`, which is how most application servers
+will interface with the PostgreSQL™ JDBC driver.
+
+In an application server environment, the application server configuration will
+typically refer to the PostgreSQL™ `ConnectionPoolDataSource` implementation,
+while the application component code will typically acquire a `DataSource`
+implementation provided by the application server (not by PostgreSQL™).
+
+For an environment without an application server, PostgreSQL™ provides two
+implementations of `DataSource` which an application can use directly. One
+implementation performs connection pooling, while the other simply provides
+access to database connections through the `DataSource` interface without any
+pooling. Again, these implementations should not be used in an application server
+environment unless the application server does not support the `ConnectionPoolDataSource`
+interface.
\ No newline at end of file
diff --git a/docs/documentation/93/ddl.md b/docs/documentation/93/ddl.md
new file mode 100644
index 0000000..a6cadad
--- /dev/null
+++ b/docs/documentation/93/ddl.md
@@ -0,0 +1,24 @@
+---
+layout: default_docs
+title: Creating and Modifying Database Objects
+header: Chapter 5. Issuing a Query and Processing the Result
+resource: media
+previoustitle: Performing Updates
+previous: update.html
+nexttitle: Chapter 6. Calling Stored Functions
+next: callproc.html
+---
+
+To create, modify or drop a database object like a table or view you use the
+`execute()` method. This method is similar to the method `executeQuery()`, but
+it doesn't return a result. [Example 5.4, “Dropping a Table in JDBC](ddl.html#drop-table-example)
+illustrates the usage.
+
+<a name="drop-table-example"></a>
+**Example 5.4. Dropping a Table in JDBC**
+
+This example will drop a table.
+
+`Statement st = conn.createStatement();`
+`st.execute("DROP TABLE mytable");`
+`st.close();`
\ No newline at end of file
diff --git a/docs/documentation/93/ds-cpds.md b/docs/documentation/93/ds-cpds.md
new file mode 100644
index 0000000..c066e4a
--- /dev/null
+++ b/docs/documentation/93/ds-cpds.md
@@ -0,0 +1,93 @@
+---
+layout: default_docs
+title: Application Servers ConnectionPoolDataSource
+header: Chapter 11. Connection Pools and Data Sources
+resource: media
+previoustitle: Chapter 11. Connection Pools and Data Sources
+previous: datasource.html
+nexttitle: Applications DataSource
+next: ds-ds.html
+---
+
+PostgreSQL™ includes one implementation of `ConnectionPoolDataSource` named
+`org.postgresql.ds.PGConnectionPoolDataSource`.
+
+JDBC requires that a `ConnectionPoolDataSource` be configured via JavaBean
+properties, shown in [Table 11.1, “`ConnectionPoolDataSource` Configuration Properties”](ds-cpds.html#ds-cpds-props),
+so there are get and set methods for each of these properties.
+
+<a name="ds-cpds-props"></a>
+**Table 11.1. `ConnectionPoolDataSource` Configuration Properties**
+
+<table summary="ConnectionPoolDataSource Configuration Properties"
+ border="1">
+ <tr>
+ <th>Property</th>
+ <th>Type</th>
+ <th>Description</th>
+ </tr>
+ <tbody>
+ <tr>
+ <td>serverName</td>
+ <td>STRING</td>
+ <td>PostgreSQL™ database server
+host name</td>
+ </tr>
+ <tr>
+ <td>databaseName</td>
+ <td>STRING</td>
+ <td>PostgreSQL™ database name</td>
+ </tr>
+ <tr>
+ <td>portNumber</td>
+ <td>INT</td>
+ <td> TCP port which the PostgreSQL™
+
+database server is listening on (or 0 to use the default port) </td>
+ </tr>
+ <tr>
+ <td>user</td>
+ <td>STRING</td>
+ <td>User used to make database connections</td>
+ </tr>
+ <tr>
+ <td>password</td>
+ <td>STRING</td>
+ <td>Password used to make database connections</td>
+ </tr>
+ <tr>
+ <td>ssl</td>
+ <td>BOOLEAN</td>
+ <td> If `true`, use SSL encrypted
+connections (default `false`) </td>
+ </tr>
+ <tr>
+ <td>sslfactory</td>
+ <td>STRING</td>
+ <td> Custom `javax.net.ssl.SSLSocketFactory`
+class name (see the section called [“Custom
+SSLSocketFactory”](ssl-factory.html)) </td>
+ </tr>
+ <tr>
+ <td>defaultAutoCommit</td>
+ <td>BOOLEAN</td>
+ <td> Whether connections should have autocommit enabled or
+disabled when they are supplied to the caller. The default is `false`, to disable autocommit. </td>
+ </tr>
+ </tbody>
+</table>
+
+Many application servers use a properties-style syntax to configure these
+properties, so it would not be unusual to enter properties as a block of text.
+If the application server provides a single area to enter all the properties,
+they might be listed like this:
+
+`serverName=localhost`
+`databaseName=test`
+`user=testuser`
+`password=testpassword`
+
+Or, if semicolons are used as separators instead of newlines, it could look like
+this:
+
+`serverName=localhost;databaseName=test;user=testuser;password=testpassword`
\ No newline at end of file
diff --git a/docs/documentation/93/ds-ds.md b/docs/documentation/93/ds-ds.md
new file mode 100644
index 0000000..2f6d59b
--- /dev/null
+++ b/docs/documentation/93/ds-ds.md
@@ -0,0 +1,178 @@
+---
+layout: default_docs
+title: Applications DataSource
+header: Chapter 11. Connection Pools and Data Sources
+resource: media
+previoustitle: Application Servers ConnectionPoolDataSource
+previous: ds-cpds.html
+nexttitle: Tomcat setup
+next: tomcat.html
+---
+
+PostgreSQL™ includes two implementations of `DataSource`, as shown in [Table 11.2, “`DataSource` Implementations”](ds-ds.html#ds-ds-imp).
+One that does pooling and the other that does not. The pooling implementation
+does not actually close connections when the client calls the `close` method,
+but instead returns the connections to a pool of available connections for other
+clients to use. This avoids any overhead of repeatedly opening and closing
+connections, and allows a large number of clients to share a small number of
+database connections.
+
+The pooling data-source implementation provided here is not the most feature-rich
+in the world. Among other things, connections are never closed until the pool
+itself is closed; there is no way to shrink the pool. As well, connections
+requested for users other than the default configured user are not pooled. Its
+error handling sometimes cannot remove a broken connection from the pool. In
+general it is not recommended to use the PostgreSQL™ provided connection pool.
+Check your application server or check out the excellent [jakarta commons DBCP](http://jakarta.apache.org/commons/dbcp/)
+project.
+
+<a name="ds-ds-imp"></a>
+**Table 11.2. `DataSource` Implementations**
+
+<table summary="DataSource Implementations" border="1">
+ <tr>
+ <th>Pooling</th>
+ <th>Implementation Class</th>
+ </tr>
+ <tbody>
+ <tr>
+ <td>No</td>
+ <td>`org.postgresql.ds.PGSimpleDataSource</td>
+ </tr>
+ <tr>
+ <td>Yes</td>
+ <td>`org.postgresql.ds.PGPoolingDataSource</td>
+ </tr>
+ </tbody>
+</table>
+
+Both implementations use the same configuration scheme. JDBC requires that a
+`DataSource` be configured via JavaBean properties, shown in [Table 11.3, “`DataSource` Configuration Properties”](ds-ds.html#ds-ds-props),
+so there are get and set methods for each of these properties.
+
+<a name="ds-ds-props"></a>
+**Table 11.3. `DataSource` Configuration Properties**
+
+<table summary="DataSource Configuration Properties" border="1">
+ <tr>
+ <th>Property</th>
+ <th>Type</th>
+ <th>Description</th>
+ </tr>
+ <tbody>
+ <tr>
+ <td>serverName</td>
+ <td>STRING</td>
+ <td>PostgreSQL™ database server host name</td>
+ </tr>
+ <tr>
+ <td>databaseName</td>
+ <td>STRING</td>
+ <td>PostgreSQL™ database name</td>
+ </tr>
+ <tr>
+ <td>portNumber</td>
+ <td>INT</td>
+ <td>TCP port which the PostgreSQL™
+database server is listening on (or 0 to use the default port)</td>
+ </tr>
+ <tr>
+ <td>user</td>
+ <td>STRING</td>
+ <td>User used to make database connections</td>
+ </tr>
+ <tr>
+ <td>password</td>
+ <td>STRING</td>
+ <td>Password used to make database connections</td>
+ </tr>
+ <tr>
+ <td>ssl</td>
+ <td>BOOLEAN</td>
+ <td> If true, use SSL encrypted
+connections (default false) </td>
+ </tr>
+ <tr>
+ <td>sslfactory</td>
+ <td>STRING</td>
+ <td> Custom javax.net.ssl.SSLSocketFactory
+class name (see the section called [“Custom
+SSLSocketFactory”](ssl-factory.html))</td>
+ </tr>
+ </tbody>
+</table>
+
+The pooling implementation requires some additional configuration properties,
+which are shown in [Table 11.4, “Additional Pooling `DataSource` Configuration Properties](ds-ds.html#ds-ds-xprops).
+
+<a name="ds-ds-xprops"></a>
+**Table 11.4. Additional Pooling `DataSource` Configuration Properties**
+
+<table summary="Additional Pooling DataSource Configuration Properties" border="1">
+ <tr>
+ <th>Property</th>
+ <th>Type</th>
+ <th>Description</th>
+ </tr>
+ <tbody>
+ <tr>
+ <td>dataSourceName</td>
+ <td>STRING</td>
+ <td>Every pooling DataSource must
+have a unique name.</td>
+ </tr>
+ <tr>
+ <td>initialConnections</td>
+ <td>INT</td>
+ <td>The number of database connections to be created when the
+pool is initialized.</td>
+ </tr>
+ <tr>
+ <td>maxConnections</td>
+ <td>INT</td>
+ <td>The maximum number of open database connections to allow.
+When more connections are requested, the caller will hang until a
+connection is returned to the pool.</td>
+ </tr>
+ </tbody>
+</table>
+
+[Example 11.1, “`DataSource` Code Example”](ds-ds.html#ds-example) shows an example
+of typical application code using a pooling `DataSource`.
+
+<a name="ds-example"></a>
+**Example 11.1. `DataSource` Code Example**
+
+Code to initialize a pooling `DataSource` might look like this:
+
+`PGPoolingDataSource source = new PGPoolingDataSource();`
+`source.setDataSourceName("A Data Source");`
+`source.setServerName("localhost");`
+`source.setDatabaseName("test");`
+`source.setUser("testuser");`
+`source.setPassword("testpassword");`
+`source.setMaxConnections(10);`
+
+Then code to use a connection from the pool might look like this. Note that it
+is critical that the connections are eventually closed. Else the pool will
+“leak” connections and will eventually lock all the clients out.
+
+<pre><code>
+Connection conn = null;
+try
+{
+ conn = source.getConnection();
+ // use connection
+}
+catch (SQLException e)
+{
+ // log error
+}
+finally
+{
+ if (con != null)
+ {
+ try { conn.close(); } catch (SQLException e) {}
+ }
+}
+</code></pre>
\ No newline at end of file
diff --git a/docs/documentation/93/escaped-functions.md b/docs/documentation/93/escaped-functions.md
new file mode 100644
index 0000000..f734b28
--- /dev/null
+++ b/docs/documentation/93/escaped-functions.md
@@ -0,0 +1,480 @@
+---
+layout: default_docs
+title: Escaped scalar functions
+header: Chapter 8. JDBC escapes
+resource: media
+previoustitle: Date-time escapes
+previous: escapes-datetime.html
+nexttitle: Chapter 9. PostgreSQL™ Extensions to the JDBC API
+next: ext.html
+---
+
+The JDBC specification defines functions with an escape call syntax : `{fn function_name(arguments)}`.
+The following tables show which functions are supported by the PostgresSQL™ driver.
+The driver supports the nesting and the mixing of escaped functions and escaped
+values. The appendix C of the JDBC specification describes the functions.
+
+Some functions in the following tables are translated but not reported as supported
+because they are duplicating or changing ther order of the arguments. While this
+is harmless for literal values or columns, it will cause problems when using
+prepared statements. For example "`{fn right(?,?)}`" will be translated to "`substring(? from (length(?)+1-?))`".
+As you can see the translated SQL requires more parameters than before the
+translation but the driver will not automatically handle this.
+
+<a name="escape-numeric-functions-table"></a>
+**Table 8.1. Supported escaped numeric functions**
+
+<table summary="Supported escaped numeric functions" border="1">
+ <tr>
+ <th>function</th>
+ <th>reported as supported</th>
+ <th>translation</th>
+ <th>comments</th>
+ </tr>
+ <tbody>
+ <tr>
+ <td>abs(arg1)</td>
+ <td>yes</td>
+ <td>abs(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>acos(arg1)</td>
+ <td>yes</td>
+ <td>acos(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>asin(arg1)</td>
+ <td>yes</td>
+ <td>asin(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>atan(arg1)</td>
+ <td>yes</td>
+ <td>atan(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>atan2(arg1,arg2)</td>
+ <td>yes</td>
+ <td>atan2(arg1,arg2)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>ceiling(arg1)</td>
+ <td>yes</td>
+ <td>ceil(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>cos(arg1)</td>
+ <td>yes</td>
+ <td>cos(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>cot(arg1)</td>
+ <td>yes</td>
+ <td>cot(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>degrees(arg1)</td>
+ <td>yes</td>
+ <td>degrees(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>exp(arg1)</td>
+ <td>yes</td>
+ <td>exp(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>floor(arg1)</td>
+ <td>yes</td>
+ <td>floor(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>log(arg1)</td>
+ <td>yes</td>
+ <td>ln(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>log10(arg1)</td>
+ <td>yes</td>
+ <td>log(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>mod(arg1,arg2)</td>
+ <td>yes</td>
+ <td>mod(arg1,arg2)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>pi(arg1)</td>
+ <td>yes</td>
+ <td>pi(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>power(arg1,arg2)</td>
+ <td>yes</td>
+ <td>pow(arg1,arg2)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>radians(arg1)</td>
+ <td>yes</td>
+ <td>radians(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>rand()</td>
+ <td>yes</td>
+ <td>random()</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>rand(arg1)</td>
+ <td>yes</td>
+ <td>setseed(arg1)*0+random()</td>
+ <td>The seed is initialized with the given argument and a new randow value is returned.</td>
+ </tr>
+ <tr>
+ <td>round(arg1,arg2)</td>
+ <td>yes</td>
+ <td>round(arg1,arg2)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>sign(arg1)</td>
+ <td>yes</td>
+ <td>sign(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>sin(arg1)</td>
+ <td>yes</td>
+ <td>sin(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>sqrt(arg1)</td>
+ <td>yes</td>
+ <td>sqrt(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>tan(arg1)</td>
+ <td>yes</td>
+ <td>tan(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>truncate(arg1,arg2)</td>
+ <td>yes</td>
+ <td>trunc(arg1,arg2)</td>
+ <td> </td>
+ </tr>
+ </tbody>
+</table>
+
+<a name="escape-string-functions-table"></a>
+**Table 8.2. Supported escaped string functions**
+
+<table summary="Supported escaped string functions" border="1">
+ <tr>
+ <th>function</th>
+ <th>reported as supported</th>
+ <th>translation</th>
+ <th>comments</th>
+ </tr>
+ <tbody>
+ <tr>
+ <td>ascii(arg1)</td>
+ <td>yes</td>
+ <td>ascii(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>char(arg1)</td>
+ <td>yes</td>
+ <td>chr(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>concat(arg1,arg2...)</td>
+ <td>yes</td>
+ <td>(arg1||arg2...)</td>
+ <td>The JDBC specification
+only require the two arguments version, but supporting more arguments
+was so easy...</td>
+ </tr>
+ <tr>
+ <td>insert(arg1,arg2,arg3,arg4)</td>
+ <td>no</td>
+ <td>overlay(arg1 placing arg4 from arg2 for arg3)</td>
+ <td>This function is not reported as supported since it changes
+the order of the arguments which can be a problem (for prepared
+statements by example).</td>
+ </tr>
+ <tr>
+ <td>lcase(arg1)</td>
+ <td>yes</td>
+ <td>lower(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>left(arg1,arg2)</td>
+ <td>yes</td>
+ <td>substring(arg1 for arg2)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>length(arg1)</td>
+ <td>yes</td>
+ <td>length(trim(trailing from arg1))</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>locate(arg1,arg2)</td>
+ <td>no</td>
+ <td>position(arg1 in arg2)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>locate(arg1,arg2,arg3)</td>
+ <td>no</td>
+ <td>(arg2*sign(position(arg1 in substring(arg2 from
+arg3)+position(arg1 in substring(arg2 from arg3))</td>
+ <td>Not reported as supported since the three arguments version
+duplicate and change the order of the arguments.</td>
+ </tr>
+ <tr>
+ <td>ltrim(arg1)</td>
+ <td>yes</td>
+ <td>trim(leading from arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>repeat(arg1,arg2)</td>
+ <td>yes</td>
+ <td>repeat(arg1,arg2)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>replace(arg1,arg2,arg3)</td>
+ <td>yes</td>
+ <td>replace(arg1,arg2,arg3)</td>
+ <td>Only reported as supported by 7.3 and above servers.</td>
+ </tr>
+ <tr>
+ <td>right(arg1,arg2)</td>
+ <td>no</td>
+ <td>substring(arg1 from (length(arg1)+1-arg2))</td>
+ <td>Not reported as supported since arg2 is duplicated.</td>
+ </tr>
+ <tr>
+ <td>rtrim(arg1)</td>
+ <td>yes</td>
+ <td>trim(trailing from arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>space(arg1)</td>
+ <td>yes</td>
+ <td>repeat(' ',arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>substring(arg1,arg2)</td>
+ <td>yes</td>
+ <td>substr(arg1,arg2)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>substring(arg1,arg2,arg3)</td>
+ <td>yes</td>
+ <td>substr(arg1,arg2,arg3)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>ucase(arg1)</td>
+ <td>yes</td>
+ <td>upper(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>soundex(arg1)</td>
+ <td>no</td>
+ <td>soundex(arg1)</td>
+ <td>Not reported as supported since it requires the fuzzystrmatch
+contrib module.</td>
+ </tr>
+ <tr>
+ <td>difference(arg1,arg2)</td>
+ <td>no</td>
+ <td>difference(arg1,arg2)</td>
+ <td>Not reported as supported since it requires the fuzzystrmatch
+contrib module.</td>
+ </tr>
+ </tbody>
+</table>
+
+<a name="escape-datetime-functions-table"></a>
+**Table 8.3. Supported escaped date/time functions**
+
+<table summary="Supported escaped date/time functions" border="1">
+ <tr>
+ <th>function</th>
+ <th>reported as supported</th>
+ <th>translation</th>
+ <th>comments</th>
+ </tr>
+ <tbody>
+ <tr>
+ <td>curdate()</td>
+ <td>yes</td>
+ <td>current_date</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>curtime()</td>
+ <td>yes</td>
+ <td>current_time</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>dayname(arg1)</td>
+ <td>yes</td>
+ <td>to_char(arg1,'Day')</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>dayofmonth(arg1)</td>
+ <td>yes</td>
+ <td>extract(day from arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>dayofweek(arg1)</td>
+ <td>yes</td>
+ <td>extract(dow from arg1)+1</td>
+ <td>We must add 1 to be in the expected 1-7 range.</td>
+ </tr>
+ <tr>
+ <td>dayofyear(arg1)</td>
+ <td>yes</td>
+ <td>extract(doy from arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>hour(arg1)</td>
+ <td>yes</td>
+ <td>extract(hour from arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>minute(arg1)</td>
+ <td>yes</td>
+ <td>extract(minute from arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>month(arg1)</td>
+ <td>yes</td>
+ <td>extract(month from arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>monthname(arg1)</td>
+ <td>yes</td>
+ <td>to_char(arg1,'Month')</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>now()</td>
+ <td>yes</td>
+ <td>now()</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>quarter(arg1)</td>
+ <td>yes</td>
+ <td>extract(quarter from arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>second(arg1)</td>
+ <td>yes</td>
+ <td>extract(second from arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>week(arg1)</td>
+ <td>yes</td>
+ <td>extract(week from arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>year(arg1)</td>
+ <td>yes</td>
+ <td>extract(year from arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>timestampadd(argIntervalType,argCount,argTimeStamp)</td>
+ <td>yes</td>
+ <td>('(interval according to argIntervalType and
+argCount)'+argTimeStamp)</td>
+ <td>an argIntervalType value of SQL_TSI_FRAC_SECOND
+is not implemented since backend does not support it</td>
+ </tr>
+ <tr>
+ <td>timestampdiff(argIntervalType,argTimeStamp1,argTimeStamp2)</td>
+ <td>not</td>
+ <td>extract((interval according to argIntervalType) from
+argTimeStamp2-argTimeStamp1 )</td>
+ <td>only an argIntervalType value of SQL_TSI_FRAC_SECOND, SQL_TSI_FRAC_MINUTE, SQL_TSI_FRAC_HOUR
+or SQL_TSI_FRAC_DAY is supported </td>
+ </tr>
+ </tbody>
+</table>
+
+<a name="escape-misc-functions-table"></a>
+**Table 8.4. Supported escaped misc functions**
+
+<table summary="Supported escaped misc functions" border="1">
+ <tr>
+ <th>function</th>
+ <th>reported as supported</th>
+ <th>translation</th>
+ <th>comments</th>
+ </tr>
+ <tbody>
+ <tr>
+ <td>database()</td>
+ <td>yes</td>
+ <td>current_database()</td>
+ <td>Only reported as supported by 7.3 and above servers.</td>
+ </tr>
+ <tr>
+ <td>ifnull(arg1,arg2)</td>
+ <td>yes</td>
+ <td>coalesce(arg1,arg2)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>user()</td>
+ <td>yes</td>
+ <td>user</td>
+ <td> </td>
+ </tr>
+ </tbody>
+</table>
\ No newline at end of file
diff --git a/docs/documentation/93/escapes-datetime.md b/docs/documentation/93/escapes-datetime.md
new file mode 100644
index 0000000..6d1e11d
--- /dev/null
+++ b/docs/documentation/93/escapes-datetime.md
@@ -0,0 +1,23 @@
+---
+layout: default_docs
+title: Date-time escapes
+header: Chapter 8. JDBC escapes
+resource: media
+previoustitle: Escape for outer joins
+previous: outer-joins-escape.html
+nexttitle: Escaped scalar functions
+next: escaped-functions.html
+---
+
+The JDBC specification defines escapes for specifying date, time and timestamp
+values which are supported by the driver.
+
+> date
+>> `{d 'yyyy-mm-dd'}` which is translated to `DATE 'yyyy-mm-dd'`
+
+> time
+>> `{t 'hh:mm:ss'}` which is translated to `TIME 'hh:mm:ss'`
+
+> timestamp
+>> `{ts 'yyyy-mm-dd hh:mm:ss.f...'}` which is translated to `TIMESTAMP 'yyyy-mm-dd hh:mm:ss.f'`<br /><br />
+>> The fractional seconds (.f...) portion of the TIMESTAMP can be omitted.
\ No newline at end of file
diff --git a/docs/documentation/93/escapes.md b/docs/documentation/93/escapes.md
new file mode 100644
index 0000000..3bf4f72
--- /dev/null
+++ b/docs/documentation/93/escapes.md
@@ -0,0 +1,57 @@
+---
+layout: default_docs
+title: Chapter 8. JDBC escapes
+header: Chapter 8. JDBC escapes
+resource: media
+previoustitle: Chapter 7. Storing Binary Data
+previous: binary-data.html
+nexttitle: Escape for outer joins
+next: outer-joins-escape.html
+---
+
+**Table of Contents**
+
+* [Escape for like escape character](escapes.html#like-escape)
+* [Escape for outer joins](outer-joins-escape.html)
+* [Date-time escapes](escapes-datetime.html)
+* [Escaped scalar functions](escaped-functions.html)
+
+The JDBC specification (like the ODBC specification) acknowledges the fact that
+some vendor specific SQL may be required for certain RDBMS features. To aid
+developers in writing portable JDBC applications across multiple database products,
+a special escape syntax is used to specify the generic commands the developer
+wants to be run. The JDBC driver translates these escape sequences into native
+syntax for its specific database. For more information consult the section 4.1.5
+from the [JDBC Technology Guide](http://java.sun.com/j2se/1.4.2/docs/guide/jdbc/getstart/statement.html#999472)
+(bundled with the Oracle™ JRE documentation) and the section 13.4 from the
+[JDBC 3.0 specification](http://java.sun.com/products/jdbc/download.html#corespec30).
+
+The parsing of the sql statements for these escapes can be disabled using
+`Statement.setEscapeProcessing(false)`.
+
+`Connection.nativeSQL(String sql)` provides another way to have escapes processed.
+It translates the given SQL to a SQL suitable for the PostgreSQL™ backend.
+
+<a name="escape-use-example"></a>
+**Example 8.1. Using jdbc escapes**
+
+To use the JDBC escapes, you simply write your SQL replacing date/time literal
+values, outer join and functions by the JDBC escape syntax. For example :
+
+`ResultSet rs = st.executeQuery("SELECT {fn week({d '2005-01-24'})}");`
+
+is the portable version for
+
+`ResultSet rs = st.executeQuery("SELECT extract(week from DATE '2005-01-24')");`
+
+<a name="like-escape"></a>
+# Escape for like escape character
+
+You can specify which escape character to use in strings comparison (with `LIKE`)
+to protect wildcards characters ('%' and '_') by adding the following escape :
+`{escape 'escape-character'}`. The driver supports this only at the end of the
+comparison expression.
+
+For example, you can compare string values using '|' as escape character to protect '_' :
+
+`rs = stmt.executeQuery("select str2 from comparisontest where str1 like '|_abcd' {escape '|'} ");`
diff --git a/docs/documentation/93/ext.md b/docs/documentation/93/ext.md
new file mode 100644
index 0000000..553eb57
--- /dev/null
+++ b/docs/documentation/93/ext.md
@@ -0,0 +1,36 @@
+---
+layout: default_docs
+title: Chapter 9. PostgreSQL™ Extensions to the JDBC API
+header: Chapter 9. PostgreSQL™ Extensions to the JDBC API
+resource: media
+previoustitle: Escaped scalar functions
+previous: escaped-functions.html
+nexttitle: Geometric Data Types
+next: geometric.html
+---
+
+**Table of Contents**
+
+* [Accessing the Extensions](ext.html#extensions)
+* [Geometric Data Types](geometric.html)
+* [Large Objects](largeobjects.html)
+* [Listen / Notify](listennotify.html)
+* [Server Prepared Statements](server-prepare.html)
+
+PostgreSQL™ is an extensible database system. You can add your own functions to
+the server, which can then be called from queries, or even add your own data types.
+As these are facilities unique to PostgreSQL™, we support them from Java, with a
+set of extension APIs. Some features within the core of the standard driver
+actually use these extensions to implement Large Objects, etc.
+
+<a name="extensions"></a>
+# Accessing the Extensions
+
+To access some of the extensions, you need to use some extra methods in the
+`org.postgresql.PGConnection` class. In this case, you would need to case the
+return value of `Driver.getConnection()`. For example:
+
+`Connection db = Driver.getConnection(url, username, password);`
+`// ...`
+`// later on`
+`Fastpath fp = db.unwrap(org.postgresql.PGConnection.class).getFastpathAPI();`
diff --git a/docs/documentation/93/geometric.md b/docs/documentation/93/geometric.md
new file mode 100644
index 0000000..284985c
--- /dev/null
+++ b/docs/documentation/93/geometric.md
@@ -0,0 +1,68 @@
+---
+layout: default_docs
+title: Geometric Data Types
+header: Chapter 9. PostgreSQL™ Extensions to the JDBC API
+resource: media
+previoustitle: Chapter 9. PostgreSQL™ Extensions to the JDBC API
+previous: ext.html
+nexttitle: Large Objects
+next: largeobjects.html
+---
+
+PostgreSQL™ has a set of data types that can store geometric features into a
+table. These include single points, lines, and polygons. We support these types
+in Java with the org.postgresql.geometric package. Please consult the Javadoc
+for the details of available classes and features metioned in [Chapter 12, *Further Reading*](reading.html).
+
+<a name="geometric-circle-example"></a>
+**Example 9.1. Using the CIRCLE datatype JDBC**
+
+import java.sql.*;
+
+import org.postgresql.geometric.PGpoint;
+import org.postgresql.geometric.PGcircle;
+
+public class GeometricTest {
+
+ public static void main(String args[]) throws Exception {
+ Class.forName("org.postgresql.Driver");
+ String url = "jdbc:postgresql://localhost:5432/test";
+
+ Connection conn = DriverManager.getConnection(url,"test","");
+
+ Statement stmt = conn.createStatement();
+ stmt.execute("CREATE TEMP TABLE geomtest(mycirc circle)");
+ stmt.close();
+
+ insertCircle(conn);
+ retrieveCircle(conn);
+ conn.close();
+ }
+
+ private static void insertCircle(Connection conn) throws SQLException {
+
+ PGpoint center = new PGpoint(1, 2.5);
+ double radius = 4;
+ PGcircle circle = new PGcircle(center, radius);
+
+ PreparedStatement ps = conn.prepareStatement("INSERT INTO geomtest(mycirc) VALUES (?)");
+ ps.setObject(1, circle);
+ ps.executeUpdate();
+ ps.close();
+ }
+
+ private static void retrieveCircle(Connection conn) throws SQLException {
+ Statement stmt = conn.createStatement();
+ ResultSet rs = stmt.executeQuery("SELECT mycirc, area(mycirc) FROM geomtest");
+ rs.next();
+ PGcircle circle = (PGcircle)rs.getObject(1);
+ double area = rs.getDouble(2);
+
+ PGpoint center = circle.center;
+ double radius = circle.radius;
+
+ System.out.println("Center (X, Y) = (" + center.x + ", " + center.y + ")");
+ System.out.println("Radius = " + radius);
+ System.out.println("Area = " + area);
+ }
+}
\ No newline at end of file
diff --git a/docs/documentation/93/index.html b/docs/documentation/93/index.html
new file mode 100644
index 0000000..bf391bb
--- /dev/null
+++ b/docs/documentation/93/index.html
@@ -0,0 +1,253 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en" dir="ltr">
+<head>
+ <title>The PostgreSQL™ JDBC Interface</title>
+ <meta http-equiv="Content-Type" content="text/xhtml; charset=utf-8" />
+ <meta name="description" content="The official site for the PostgreSQL JDBC Driver" />
+ <meta name="copyright" content="The PostgreSQL Global Development Group" />
+
+ <style type="text/css" media="screen" title="Normal Text">@import url("media/css/docs.css");</style>
+
+ <link rel="shortcut icon" href="media/favicon.ico" />
+</head>
+
+
+<body>
+ <div id="docHeader">
+ <div id="docHeaderLogo">
+ <a href="http://www.postgresql.org/" title="PostgreSQL"><img src="media/img/layout/hdr_left3a.png" alt="PostgreSQL" height="80" width="390" /></a>
+ </div>
+ </div>
+
+ <div id="docContainerWrap">
+ <div id="docContainer">
+ <div id="docContent">
+ <div class="BOOK">
+ <a name="POSTGRES" id="POSTGRES"></a>
+ <div class="TITLEPAGE">
+ <h1 class="TITLE">The PostgreSQL JDBC Interface</h1>
+ <hr />
+ </div>
+
+ <div class="TOC">
+ <h3 class="c2">Table of Contents</h3>
+ <dl>
+ <!-- <dt class="c1">Table of Contents</dt> -->
+
+ <dt>1. <a href="intro.html">Introduction</a></dt>
+
+ <dt>2. <a href="setup.html">Setting up the JDBC Driver</a></dt>
+ <dd>
+ <dl>
+ <dt><a href="setup.html#build">Getting the Driver</a></dt>
+ <dt><a href="classpath.html">Setting up the Class Path</a></dt>
+ <dt><a href="prepare.html">Preparing the Database Server for <acronym class="ACRONYM">JDBC</acronym></a></dt>
+ <dt><a href="your-database.html">Creating a Database</a></dt>
+ </dl>
+ </dd>
+
+ <dt>3. <a href="use.html">Initializing the Driver</a></dt>
+ <dd>
+ <dl>
+ <dt><a href="use.html#import">Importing <acronym class="ACRONYM">JDBC</acronym></a></dt>
+ <dt><a href="load.html">Loading the Driver</a></dt>
+ <dt><a href="connect.html">Connecting to the Database</a></dt>
+ <dd>
+ <dl>
+ <dt><a href="connect.html#connection-parameters">Connection Parameters</a></dt>
+ </dl>
+ </dd>
+ </dl>
+ </dd>
+
+ <dt>4. <a href="ssl.html">Using <acronym class="ACRONYM">SSL</acronym></a></dt>
+ <dd>
+ <dl>
+ <dt><a href="ssl.html#ssl-server">Configuring the Server</a></dt>
+ <dt><a href="ssl-client.html">Configuring the Client</a></dt>
+ <dd>
+ <dl>
+ <dt><a href="ssl-client.html#nonvalidating">Using SSL without Certificate Validation</a></dt>
+ </dl>
+ </dd>
+ <dt><a href="ssl-factory.html">Custom SSLSocketFactory</a></dt>
+ </dl>
+ </dd>
+
+ <dt>5. <a href="query.html">Issuing a Query and Processing the Result</a></dt>
+ <dd>
+ <dl>
+ <dt><a href="query.html#query-with-cursor">Getting results based on a cursor</a></dt>
+ <dt><a href="statement.html">Using the Statement or PreparedStatement Interface</a></dt>
+ <dt><a href="resultset.html">Using the ResultSet Interface</a></dt>
+ <dt><a href="update.html">Performing Updates</a></dt>
+ <dt><a href="ddl.html">Creating and Modifying Database Objects</a></dt>
+ </dl>
+ </dd>
+
+ <dt>6. <a href="callproc.html">Calling Stored Functions</a></dt>
+ <dd>
+ <dl>
+ <dt><a href="callproc.html#callproc-resultset">Obtaining a ResultSet from a stored function</a></dt>
+ <dd>
+ <dl>
+ <dt><a href="callproc.html#callproc-resultset-setof">From a Function Returning SETOF type</a></dt>
+ <dt><a href="callproc.html#callproc-resultset-refcursor">From a Function Returning a <span class="type">refcursor</span></a></dt>
+ </dl>
+ </dd>
+ </dl>
+ </dd>
+
+ <dt>7. <a href="binary-data.html">Storing Binary Data</a></dt>
+
+ <dt>8. <a href="escapes.html"><acronym class="ACRONYM">JDBC</acronym> escapes</a></dt>
+ <dd>
+ <dl>
+ <dt><a href="escapes.html#like-escape">Escape for like escape character</a></dt>
+ <dt><a href="outer-joins-escape.html">Escape for outer joins</a></dt>
+ <dt><a href="escapes-datetime.html">Date-time escapes</a></dt>
+ <dt><a href="escaped-functions.html">Escaped scalar functions</a></dt>
+ </dl>
+ </dd>
+
+ <dt>9. <a href="ext.html">PostgreSQL™ Extensions to the <acronym class="ACRONYM">JDBC</acronym> <acronym class="ACRONYM">API</acronym></a></dt>
+ <dd>
+ <dl>
+ <dt><a href="ext.html#extensions">Accessing the Extensions</a></dt>
+ <dt><a href="geometric.html">Geometric Data Types</a></dt>
+ <dt><a href="largeobjects.html">Large Objects</a></dt>
+ <dt><a href="listennotify.html">Listen / Notify</a></dt>
+ <dt><a href="server-prepare.html">Server Prepared Statements</a></dt>
+ </dl>
+ </dd>
+
+ <dt>10. <a href="thread.html">Using the Driver in a Multithreaded or a Servlet Environment</a></dt>
+
+ <dt>11. <a href="datasource.html">Connection Pools and Data Sources</a></dt>
+ <dd>
+ <dl>
+ <dt><a href="datasource.html#ds-intro">Overview</a></dt>
+ <dt><a href="ds-cpds.html">Application Servers: ConnectionPoolDataSource</a></dt>
+ <dt><a href="ds-ds.html">Applications: DataSource</a></dt>
+ <dt><a href="tomcat.html">Tomcat setup</a></dt>
+ <dt><a href="jndi.html">Data Sources and <acronym class="ACRONYM">JNDI</acronym></a></dt>
+ </dl>
+ </dd>
+
+ <dt>12. <a href="reading.html">Further Reading</a></dt>
+ </dl>
+ </div>
+
+ <div class="LOT">
+ <h3 class="c2">List of Tables</h3>
+ <dl class="LOT">
+ <!-- <dt class="c1">List of Tables</dt> -->
+ <dt>
+ 8.1. <a href="escaped-functions.html#escape-numeric-functions-table">Supported escaped numeric functions</a>
+ </dt>
+ <dt>
+ 8.2. <a href="escaped-functions.html#escape-string-functions-table">Supported escaped string functions</a>
+ </dt>
+ <dt>
+ 8.3. <a href="escaped-functions.html#escape-datetime-functions-table">Supported escaped date/time functions</a>
+ </dt>
+ <dt>
+ 8.4. <a href="escaped-functions.html#escape-misc-functions-table">Supported escaped misc functions</a>
+ </dt>
+ <dt>
+ 11.1. <a href="ds-cpds.html#ds-cpds-props">ConnectionPoolDataSource Configuration Properties</a>
+ </dt>
+ <dt>
+ 11.2. <a href="ds-ds.html#ds-ds-imp">DataSource Implementations</a>
+ </dt>
+ <dt>
+ 11.3. <a href="ds-ds.html#ds-ds-props">DataSource Configuration Properties</a>
+ </dt>
+ <dt>
+ 11.4. <a href="ds-ds.html#ds-ds-xprops">Additional Pooling DataSource Configuration Properties</a>
+ </dt>
+ </dl>
+ </div>
+
+ <div class="LOT">
+ <h3 class="c2">List of Examples</h3>
+ <dl class="LOT">
+ <!-- <dt class="c1">List of Examples</dt> -->
+ <dt>
+ 5.1. <a href="query.html#query-example">Processing a Simple Query in <acronym class="ACRONYM">JDBC</acronym></a>
+ </dt>
+ <dt>
+ 5.2. <a href="query.html#fetchsize-example">Setting fetch size to turn cursors on and off.</a>
+ </dt>
+ <dt>
+ 5.3. <a href="update.html#delete-example">Deleting Rows in <acronym class="ACRONYM">JDBC</acronym></a>
+ </dt>
+ <dt>
+ 5.4. <a href="ddl.html#drop-table-example">Dropping a Table in <acronym class="ACRONYM">JDBC</acronym></a>
+ </dt>
+ <dt>
+ 6.1. <a href="callproc.html#call-function-example">Calling a built in stored function</a>
+ </dt>
+ <dt>
+ 6.2. <a href="callproc.html#setof-resultset"> Getting SETOF type values from a function</a>
+ </dt>
+ <dt>
+ 6.3. <a href="callproc.html#get-refcursor-from-function-call"> Getting <span class="type">refcursor</span> Value From a Function</a>
+ </dt>
+ <dt>
+ 6.4. <a href="callproc.html#refcursor-string-example">Treating <span class="type">refcursor</span> as a cursor name</a>
+ </dt>
+ <dt>
+ 7.1. <a href="binary-data.html#binary-data-example">Processing Binary Data in <acronym class="ACRONYM">JDBC</acronym></a>
+ </dt>
+ <dt>
+ 8.1. <a href="escapes.html#escape-use-example">Using jdbc escapes</a>
+ </dt>
+ <dt>
+ 9.1. <a href="geometric.html#geometric-circle-example">Using the CIRCLE datatype from <acronym class="ACRONYM">JDBC</acronym></a>
+ </dt>
+ <dt>
+ 9.2. <a href="listennotify.html#listen-notify-example">Receiving Notifications</a>
+ </dt>
+ <dt>
+ 9.3. <a href="server-prepare.html#server-prepared-statement-example">Using server side prepared statements</a>
+ </dt>
+ <dt>
+ 11.1. <a href="ds-ds.html#ds-example">DataSource Code Example</a>
+ </dt>
+ <dt>
+ 11.2. <a href="jndi.html#ds-jndi">DataSource <acronym class="ACRONYM">JNDI</acronym> Code Example</a>
+ </dt>
+ </dl>
+ </div>
+ </div> <!-- BOOK -->
+
+ <div class="NAVFOOTER">
+ <hr class="c2" width="100%" />
+ <table summary="Footer navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
+ <tbody>
+ <tr>
+ <td valign="top" width="33%" align="left"> </td>
+ <td valign="top" width="34%" align="center"> </td>
+ <td valign="top" width="33%" align="right"><a href="intro.html" accesskey="N">Next</a></td>
+ </tr>
+ <tr>
+ <td valign="top" width="33%" align="left"> </td>
+ <td valign="top" width="34%" align="center"> </td>
+ <td valign="top" width="33%" align="right">Chapter 1. Introduction</td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </div> <!--docContent -->
+
+ <div id="docComments"></div>
+
+ <div id="docFooter">
+ <a class="navFooter" href="http://www.postgresql.org/about/privacypolicy">Privacy Policy</a> |
+ <a class="navFooter" href="http://www.postgresql.org/about/">About PostgreSQL</a><br/>
+ Copyright © 1996-2013 The PostgreSQL Global Development Group
+ </div> <!-- pgFooter -->
+ </div> <!-- docContainer -->
+ </div> <!-- docContainerWrap -->
+</body>
diff --git a/docs/documentation/93/intro.md b/docs/documentation/93/intro.md
new file mode 100644
index 0000000..f815fae
--- /dev/null
+++ b/docs/documentation/93/intro.md
@@ -0,0 +1,22 @@
+---
+layout: default_docs
+title: Chapter 1. Introduction
+header: Chapter 1. Introduction
+resource: media
+previoustitle: The PostgreSQL™ JDBC Interface
+previous: index.html
+nexttitle: Chapter 2. Setting up the JDBC Driver
+next: setup.html
+---
+
+JDBC is a core API of Java 1.1 and later. It provides a standard set of interfaces
+to SQL-compliant databases.
+
+PostgreSQL™ provides a *type 4* JDBC driver. Type 4 indicates that the driver is
+written in Pure Java, and communicates in the database system's own network protocol.
+Because of this, the driver is platform independent; once compiled, the driver
+can be used on any system.
+
+This manual is not intended as a complete guide to JDBC programming, but should
+help to get you started. For more information refer to the standard JDBC API
+documentation. Also, take a look at the examples included with the source.
\ No newline at end of file
diff --git a/docs/documentation/93/jndi.md b/docs/documentation/93/jndi.md
new file mode 100644
index 0000000..969512d
--- /dev/null
+++ b/docs/documentation/93/jndi.md
@@ -0,0 +1,68 @@
+---
+layout: default_docs
+title: Data Sources and JNDI
+header: Chapter 11. Connection Pools and Data Sources
+resource: media
+previoustitle: Tomcat setup
+previous: tomcat.html
+nexttitle: Chapter 12. Further Reading
+next: reading.html
+---
+
+All the `ConnectionPoolDataSource` and `DataSource` implementations can be stored
+in JNDI. In the case of the nonpooling implementations, a new instance will be
+created every time the object is retrieved from JNDI, with the same settings as
+the instance that was stored. For the pooling implementations, the same instance
+will be retrieved as long as it is available (e.g., not a different JVM retrieving
+the pool from JNDI), or a new instance with the same settings created otherwise.
+
+In the application server environment, typically the application server's
+`DataSource` instance will be stored in JNDI, instead of the PostgreSQL™
+`ConnectionPoolDataSource` implementation.
+
+In an application environment, the application may store the `DataSource` in JNDI
+so that it doesn't have to make a reference to the `DataSource` available to all
+application components that may need to use it. An example of this is shown in
+[Example 11.2, “`DataSource` JNDI Code Example”](jndi.html#ds-jndi).
+
+<a name="ds-jndi"></a>
+**Example 11.2. `DataSource` JNDI Code Example**
+
+Application code to initialize a pooling `DataSource` and add it to JNDI might
+look like this:
+
+`PGPoolingDataSource source = new PGPoolingDataSource();`
+`source.setDataSourceName("A Data Source");`
+`source.setServerName("localhost");`
+`source.setDatabaseName("test");`
+`source.setUser("testuser");`
+`source.setPassword("testpassword");`
+`source.setMaxConnections(10);`
+`new InitialContext().rebind("DataSource", source);`
+
+Then code to use a connection from the pool might look like this:
+
+<pre><code>
+Connection conn = null;
+try
+{
+ DataSource source = (DataSource)new InitialContext().lookup("DataSource");
+ conn = source.getConnection();
+ // use connection
+}
+catch (SQLException e)
+{
+ // log error
+}
+catch (NamingException e)
+{
+ // DataSource wasn't found in JNDI
+}
+finally
+{
+ if (con != null)
+ {
+ try { conn.close(); } catch (SQLException e) {}
+ }
+}
+</code></pre>
\ No newline at end of file
diff --git a/docs/documentation/93/largeobjects.md b/docs/documentation/93/largeobjects.md
new file mode 100644
index 0000000..cbcdbad
--- /dev/null
+++ b/docs/documentation/93/largeobjects.md
@@ -0,0 +1,20 @@
+---
+layout: default_docs
+title: Large Objects
+header: Chapter 9. PostgreSQL™ Extensions to the JDBC API
+resource: media
+previoustitle: Geometric Data Types
+previous: geometric.html
+nexttitle: Listen / Notify
+next: listennotify.html
+---
+
+Large objects are supported in the standard JDBC specification. However, that
+interface is limited, and the API provided by PostgreSQL™ allows for random
+access to the objects contents, as if it was a local file.
+
+The org.postgresql.largeobject package provides to Java the libpq C interface's
+large object API. It consists of two classes, `LargeObjectManager`, which deals
+with creating, opening and deleting large objects, and `LargeObject` which deals
+with an individual object. For an example usage of this API, please see
+[Example 7.1, “Processing Binary Data in JDBC”](binary-data.html#binary-data-example).
\ No newline at end of file
diff --git a/docs/documentation/93/listennotify.md b/docs/documentation/93/listennotify.md
new file mode 100644
index 0000000..3ad4e2d
--- /dev/null
+++ b/docs/documentation/93/listennotify.md
@@ -0,0 +1,148 @@
+---
+layout: default_docs
+title: Listen / Notify
+header: Chapter 9. PostgreSQL™ Extensions to the JDBC API
+resource: media
+previoustitle: Large Objects
+previous: largeobjects.html
+nexttitle: Server Prepared Statements
+next: server-prepare.html
+---
+
+Listen and Notify provide a simple form of signal or interprocess communication
+mechanism for a collection of processes accessing the same PostgreSQL™ database.
+For more information on notifications consult the main server documentation. This
+section only deals with the JDBC specific aspects of notifications.
+
+Standard `LISTEN`, `NOTIFY`, and `UNLISTEN` commands are issued via the standard
+`Statement` interface. To retrieve and process retrieved notifications the
+`Connection` must be cast to the PostgreSQL™ specific extension interface
+`PGConnection`. From there the `getNotifications()` method can be used to retrieve
+any outstanding notifications.
+
+### Note
+
+> A key limitation of the JDBC driver is that it cannot receive asynchronous
+notifications and must poll the backend to check if any notifications were issued.
+
+<a name="listen-notify-example"></a>
+**Example 9.2. Receiving Notifications**
+
+<pre><code>
+import java.sql.*;
+
+public class NotificationTest
+{
+ public static void main(String args[]) throws Exception
+ {
+ Class.forName("org.postgresql.Driver");
+ String url = "jdbc:postgresql://localhost:5432/test";
+
+ // Create two distinct connections, one for the notifier
+ // and another for the listener to show the communication
+ // works across connections although this example would
+ // work fine with just one connection.
+
+ Connection lConn = DriverManager.getConnection(url,"test","");
+ Connection nConn = DriverManager.getConnection(url,"test","");
+
+ // Create two threads, one to issue notifications and
+ // the other to receive them.
+
+ Listener listener = new Listener(lConn);
+ Notifier notifier = new Notifier(nConn);
+ listener.start();
+ notifier.start();
+ }
+}
+</code></pre>
+
+<pre><code>
+class Listener extends Thread
+{
+ private Connection conn;
+ private org.postgresql.PGConnection pgconn;
+
+ Listener(Connection conn) throws SQLException
+ {
+ this.conn = conn;
+ this.pgconn = conn.unwrap(org.postgresql.PGConnection.class);
+ Statement stmt = conn.createStatement();
+ stmt.execute("LISTEN mymessage");
+ stmt.close();
+ }
+
+ public void run()
+ {
+ while (true)
+ {
+ try
+ {
+ // issue a dummy query to contact the backend
+ // and receive any pending notifications.
+
+ Statement stmt = conn.createStatement();
+ ResultSet rs = stmt.executeQuery("SELECT 1");
+ rs.close();
+ stmt.close();
+
+ org.postgresql.PGNotification notifications[] = pgconn.getNotifications();
+
+ if (notifications != null)
+ {
+ for (int i=0; i<notifications.length; i++)
+ System.out.println("Got notification: " + notifications[i].getName());
+ }
+
+ // wait a while before checking again for new
+ // notifications
+
+ Thread.sleep(500);
+ }
+ catch (SQLException sqle)
+ {
+ sqle.printStackTrace();
+ }
+ catch (InterruptedException ie)
+ {
+ ie.printStackTrace();
+ }
+ }
+ }
+}
+</code></pre>
+
+<pre><code>
+class Notifier extends Thread
+{
+ private Connection conn;
+
+ public Notifier(Connection conn)
+ {
+ this.conn = conn;
+ }
+
+ public void run()
+ {
+ while (true)
+ {
+ try
+ {
+ Statement stmt = conn.createStatement();
+ stmt.execute("NOTIFY mymessage");
+ stmt.close();
+ Thread.sleep(2000);
+ }
+ catch (SQLException sqle)
+ {
+ sqle.printStackTrace();
+ }
+ catch (InterruptedException ie)
+ {
+ ie.printStackTrace();
+ }
+ }
+ }
+
+}
+</code></pre>
diff --git a/docs/documentation/93/load.md b/docs/documentation/93/load.md
new file mode 100644
index 0000000..e4996a8
--- /dev/null
+++ b/docs/documentation/93/load.md
@@ -0,0 +1,47 @@
+---
+layout: default_docs
+title: Loading the Driver
+header: Chapter 3. Initializing the Driver
+resource: media
+previoustitle: Chapter 3. Initializing the Driver
+previous: use.html
+nexttitle: Connecting to the Database
+next: connect.html
+---
+
+Before you can connect to a database, you need to load the driver. There are two
+methods available, and it depends on your code which is the best one to use.
+
+In the first method, your code implicitly loads the driver using the `Class.forName()`
+method. For PostgreSQL™, you would use:
+
+Class.forName("org.postgresql.Driver");
+
+This will load the driver, and while loading, the driver will automatically
+register itself with JDBC.
+
+### Note
+
+The `forName()` method can throw a `ClassNotFoundException` if the driver is not
+available.
+
+This is the most common method to use, but restricts your code to use just PostgreSQL™.
+If your code may access another database system in the future, and you do not
+use any PostgreSQL™-specific extensions, then the second method is advisable.
+
+The second method passes the driver as a parameter to the JVM as it starts, using
+the `-D` argument. Example:
+
+`java -Djdbc.drivers=org.postgresql.Driver example.ImageViewer`
+
+In this example, the JVM will attempt to load the driver as part of its initialization.
+Once done, the ImageViewer is started.
+
+Now, this method is the better one to use because it allows your code to be used
+with other database packages without recompiling the code. The only thing that
+would also change is the connection URL, which is covered next.
+
+One last thing: When your code then tries to open a `Connection`, and you get a
+No driver available `SQLException` being thrown, this is probably caused by the
+driver not being in the class path, or the value in the parameter not being
+correct.
\ No newline at end of file
diff --git a/docs/documentation/93/media/css/docs.css b/docs/documentation/93/media/css/docs.css
new file mode 100644
index 0000000..b168780
--- /dev/null
+++ b/docs/documentation/93/media/css/docs.css
@@ -0,0 +1,450 @@
+/* PostgreSQL.org Documentation Style */
+
+ at import url("global.css");
+ at import url("table.css");
+ at import url("text.css");
+
+body {
+ font-size: 76%;
+}
+
+div.NAVHEADER table {
+ margin-left: 0;
+}
+
+/* Container Definitions */
+
+#docContainerWrap {
+ text-align: center; /* Win IE5 */
+}
+
+#docContainer {
+ margin: 0 auto;
+ width: 90%;
+ padding-bottom: 2em;
+ display: block;
+ text-align: left; /* Win IE5 */
+}
+
+#docHeader {
+ background-image: url("../img/docs/bg_hdr.png");
+ height: 83px;
+ margin: 0px;
+ padding: 0px;
+ display: block;
+}
+
+#docHeaderLogo {
+ position: relative;
+ width: 206px;
+ height: 83px;
+ border: 0px;
+ padding: 0px;
+ margin: 0 0 0 20px;
+}
+
+#docHeaderLogo img {
+ border: 0px;
+}
+
+#docNavSearchContainer {
+ padding-bottom: 2px;
+}
+
+#docNav, #docVersions {
+ position: relative;
+ text-align: left;
+ margin-left: 10px;
+ margin-top: 5px;
+ color: #666;
+ font-size: 0.95em;
+}
+
+#docSearch {
+ position: relative;
+ text-align: right;
+ padding: 0;
+ margin: 0;
+ color: #666;
+}
+
+#docTextSize {
+ text-align: right;
+ white-space: nowrap;
+ margin-top: 7px;
+ font-size: 0.95em;
+}
+
+#docSearch form {
+ position: relative;
+ top: 5px;
+ right: 0;
+ margin: 0; /* need for IE 5.5 OSX */
+ text-align: right; /* need for IE 5.5 OSX */
+ white-space: nowrap; /* for Opera */
+}
+
+#docSearch form label {
+ color: #666;
+ font-size: 0.95em;
+}
+
+#docSearch form input {
+ font-size: 0.95em;
+}
+
+#docSearch form #submit {
+ font-size: 0.95em;
+ background: #7A7A7A;
+ color: #fff;
+ border: 1px solid #7A7A7A;
+ padding: 1px 4px;
+}
+
+#docSearch form #q {
+ width: 170px;
+ font-size: 0.95em;
+ border: 1px solid #7A7A7A;
+ background: #E1E1E1;
+ color: #000000;
+ padding: 2px;
+}
+
+.frmDocSearch {
+ padding: 0;
+ margin: 0;
+ display: inline;
+}
+
+.inpDocSearch {
+ padding: 0;
+ margin: 0;
+ color: #000;
+}
+
+#docContent {
+ position: relative;
+ margin-left: 10px;
+ margin-right: 10px;
+ margin-top: 40px;
+}
+
+#docFooter {
+ position: relative;
+ font-size: 0.9em;
+ color: #666;
+ line-height: 1.3em;
+ margin-left: 10px;
+ margin-right: 10px;
+}
+
+#docComments {
+ margin-top: 10px;
+}
+
+#docClear {
+ clear: both;
+ margin: 0;
+ padding: 0;
+}
+
+/* Heading Definitions */
+
+h1, h2, h3 {
+ font-weight: bold;
+ margin-top: 2ex;
+}
+
+h1 {
+ font-size: 1.4em;
+}
+
+h2 {
+ font-size: 1.2em !important;
+}
+
+h3 {
+ font-size: 1.1em;
+}
+
+h1 a:hover {
+ color: #EC5800;
+ text-decoration: none;
+}
+
+h2 a:hover,
+h3 a:hover,
+h4 a:hover {
+ color: #666666;
+ text-decoration: none;
+}
+
+/* Text Styles */
+
+div.SECT2 {
+ margin-top: 4ex;
+}
+
+div.SECT3 {
+ margin-top: 3ex;
+ margin-left: 3ex;
+}
+
+.txtCurrentLocation {
+ font-weight: bold;
+}
+
+p, ol, ul, li {
+ line-height: 1.5em;
+}
+
+.txtCommentsWrap {
+ border: 2px solid #F5F5F5;
+ width: 100%;
+}
+
+.txtCommentsContent {
+ background: #F5F5F5;
+ padding: 3px;
+}
+
+.txtCommentsPoster {
+ float: left;
+}
+
+.txtCommentsDate {
+ float: right;
+}
+
+.txtCommentsComment {
+ padding: 3px;
+}
+
+#docContainer p code,
+#docContainer ul code,
+#docContainer pre code,
+#docContainer pre tt,
+#docContainer pre pre,
+#docContainer tt tt,
+#docContainer tt code,
+#docContainer tt pre {
+ font-size: 1.5em;
+}
+
+pre.LITERALLAYOUT,
+.SCREEN,
+.SYNOPSIS,
+.PROGRAMLISTING,
+.REFSYNOPSISDIV p,
+table.CAUTION,
+table.WARNING,
+blockquote.NOTE,
+blockquote.TIP,
+table.CALSTABLE {
+ -moz-box-shadow: 3px 3px 5px #DFDFDF;
+ -webkit-box-shadow: 3px 3px 5px #DFDFDF;
+ -khtml-box-shadow: 3px 3px 5px #DFDFDF;
+ -o-box-shadow: 3px 3px 5px #DFDFDF;
+ box-shadow: 3px 3px 5px #DFDFDF;
+}
+
+pre.LITERALLAYOUT,
+.SCREEN,
+.SYNOPSIS,
+.PROGRAMLISTING,
+.REFSYNOPSISDIV p,
+table.CAUTION,
+table.WARNING,
+blockquote.NOTE,
+blockquote.TIP {
+ color: black;
+ border-width: 1px;
+ border-style: solid;
+ padding: 2ex;
+ margin: 2ex 0 2ex 2ex;
+ overflow: auto;
+ -moz-border-radius: 8px;
+ -webkit-border-radius: 8px;
+ -khtml-border-radius: 8px;
+ border-radius: 8px;
+}
+
+pre.LITERALLAYOUT,
+pre.SYNOPSIS,
+pre.PROGRAMLISTING,
+.REFSYNOPSISDIV p,
+.SCREEN {
+ border-color: #CFCFCF;
+ background-color: #F7F7F7;
+}
+
+blockquote.NOTE,
+blockquote.TIP {
+ border-color: #DBDBCC;
+ background-color: #EEEEDD;
+ padding: 14px;
+ width: 572px;
+}
+
+blockquote.NOTE,
+blockquote.TIP,
+table.CAUTION,
+table.WARNING {
+ margin: 4ex auto;
+}
+
+blockquote.NOTE p,
+blockquote.TIP p {
+ margin: 0;
+}
+
+blockquote.NOTE pre,
+blockquote.NOTE code,
+blockquote.TIP pre,
+blockquote.TIP code {
+ margin-left: 0;
+ margin-right: 0;
+ -moz-box-shadow: none;
+ -webkit-box-shadow: none;
+ -khtml-box-shadow: none;
+ -o-box-shadow: none;
+ box-shadow: none;
+}
+
+.emphasis,
+.c2 {
+ font-weight: bold;
+}
+
+.REPLACEABLE {
+ font-style: italic;
+}
+
+/* Table Styles */
+
+table {
+ margin-left: 2ex;
+}
+
+table.CALSTABLE td,
+table.CALSTABLE th,
+table.CAUTION td,
+table.CAUTION th,
+table.WARNING td,
+table.WARNING th {
+ border-style: solid;
+}
+
+table.CALSTABLE,
+table.CAUTION,
+table.WARNING {
+ border-spacing: 0;
+ border-collapse: collapse;
+}
+
+table.CALSTABLE
+{
+ margin: 2ex 0 2ex 2ex;
+ background-color: #E0ECEF;
+ border: 2px solid #A7C6DF;
+}
+
+table.CALSTABLE tr:hover td
+{
+ background-color: #EFEFEF;
+}
+
+table.CALSTABLE td {
+ background-color: #FFF;
+}
+
+table.CALSTABLE td,
+table.CALSTABLE th {
+ border: 1px solid #A7C6DF;
+ padding: 0.5ex 0.5ex;
+}
+
+table.CAUTION,
+table.WARNING {
+ border-collapse: separate;
+ display: block;
+ padding: 0;
+ max-width: 600px;
+}
+
+table.CAUTION {
+ background-color: #F5F5DC;
+ border-color: #DEDFA7;
+}
+
+table.WARNING {
+ background-color: #FFD7D7;
+ border-color: #DF421E;
+}
+
+table.CAUTION td,
+table.CAUTION th,
+table.WARNING td,
+table.WARNING th {
+ border-width: 0;
+ padding-left: 2ex;
+ padding-right: 2ex;
+}
+
+table.CAUTION td,
+table.CAUTION th {
+ border-color: #F3E4D5
+}
+
+table.WARNING td,
+table.WARNING th {
+ border-color: #FFD7D7;
+}
+
+td.c1,
+td.c2,
+td.c3,
+td.c4,
+td.c5,
+td.c6 {
+ font-size: 1.1em;
+ font-weight: bold;
+ border-bottom: 0px solid #FFEFEF;
+ padding: 1ex 2ex 0;
+}
+
+/* Link Styles */
+
+#docNav a {
+ font-weight: bold;
+}
+
+a:link,
+a:visited,
+a:active,
+a:hover {
+ text-decoration: underline;
+}
+
+a:link,
+a:active {
+ color:#0066A2;
+}
+
+a:visited {
+ color:#004E66;
+}
+
+a:hover {
+ color:#000000;
+}
+
+#docFooter a:link,
+#docFooter a:visited,
+#docFooter a:active {
+ color:#666;
+}
+
+#docContainer code.FUNCTION tt {
+ font-size: 1em;
+}
diff --git a/docs/documentation/93/media/css/docs.css~ b/docs/documentation/93/media/css/docs.css~
new file mode 100644
index 0000000..0cbe23e
--- /dev/null
+++ b/docs/documentation/93/media/css/docs.css~
@@ -0,0 +1,450 @@
+/* PostgreSQL.org Documentation Style */
+
+ at import url("global.css");
+ at import url("table.css");
+ at import url("text.css");
+
+body {
+ font-size: 76%;
+}
+
+div.NAVHEADER table {
+ margin-left: 0;
+}
+
+/* Container Definitions */
+
+#docContainerWrap {
+ text-align: center; /* Win IE5 */
+}
+
+#docContainer {
+ margin: 0 auto;
+ width: 90%;
+ padding-bottom: 2em;
+ display: block;
+ text-align: left; /* Win IE5 */
+}
+
+#docHeader {
+ background-image: url("../img/docs/bg_hdr.png");
+ height: 83px;
+ margin: 0px;
+ padding: 0px;
+ display: block;
+}
+
+#docHeaderLogo {
+ position: relative;
+ width: 206px;
+ height: 83px;
+ border: 0px;
+ padding: 0px;
+ margin: 0 0 0 20px;
+}
+
+#docHeaderLogo img {
+ border: 0px;
+}
+
+#docNavSearchContainer {
+ padding-bottom: 2px;
+}
+
+#docNav, #docVersions {
+ position: relative;
+ text-align: left;
+ margin-left: 10px;
+ margin-top: 5px;
+ color: #666;
+ font-size: 0.95em;
+}
+
+#docSearch {
+ position: relative;
+ text-align: right;
+ padding: 0;
+ margin: 0;
+ color: #666;
+}
+
+#docTextSize {
+ text-align: right;
+ white-space: nowrap;
+ margin-top: 7px;
+ font-size: 0.95em;
+}
+
+#docSearch form {
+ position: relative;
+ top: 5px;
+ right: 0;
+ margin: 0; /* need for IE 5.5 OSX */
+ text-align: right; /* need for IE 5.5 OSX */
+ white-space: nowrap; /* for Opera */
+}
+
+#docSearch form label {
+ color: #666;
+ font-size: 0.95em;
+}
+
+#docSearch form input {
+ font-size: 0.95em;
+}
+
+#docSearch form #submit {
+ font-size: 0.95em;
+ background: #7A7A7A;
+ color: #fff;
+ border: 1px solid #7A7A7A;
+ padding: 1px 4px;
+}
+
+#docSearch form #q {
+ width: 170px;
+ font-size: 0.95em;
+ border: 1px solid #7A7A7A;
+ background: #E1E1E1;
+ color: #000000;
+ padding: 2px;
+}
+
+.frmDocSearch {
+ padding: 0;
+ margin: 0;
+ display: inline;
+}
+
+.inpDocSearch {
+ padding: 0;
+ margin: 0;
+ color: #000;
+}
+
+#docContent {
+ position: relative;
+ margin-left: 10px;
+ margin-right: 10px;
+ margin-top: 40px;
+}
+
+#docFooter {
+ position: relative;
+ font-size: 0.9em;
+ color: #666;
+ line-height: 1.3em;
+ margin-left: 10px;
+ margin-right: 10px;
+}
+
+#docComments {
+ margin-top: 10px;
+}
+
+#docClear {
+ clear: both;
+ margin: 0;
+ padding: 0;
+}
+
+/* Heading Definitions */
+
+h1, h2, h3 {
+ font-weight: bold;
+ margin-top: 2ex;
+}
+
+h1 {
+ font-size: 1.4em;
+}
+
+h2 {
+ font-size: 1.2em !important;
+}
+
+h3 {
+ font-size: 1.1em;
+}
+
+h1 a:hover {
+ color: #EC5800;
+ text-decoration: none;
+}
+
+h2 a:hover,
+h3 a:hover,
+h4 a:hover {
+ color: #666666;
+ text-decoration: none;
+}
+
+/* Text Styles */
+
+div.SECT2 {
+ margin-top: 4ex;
+}
+
+div.SECT3 {
+ margin-top: 3ex;
+ margin-left: 3ex;
+}
+
+.txtCurrentLocation {
+ font-weight: bold;
+}
+
+p, ol, ul, li {
+ line-height: 1.5em;
+}
+
+.txtCommentsWrap {
+ border: 2px solid #F5F5F5;
+ width: 100%;
+}
+
+.txtCommentsContent {
+ background: #F5F5F5;
+ padding: 3px;
+}
+
+.txtCommentsPoster {
+ float: left;
+}
+
+.txtCommentsDate {
+ float: right;
+}
+
+.txtCommentsComment {
+ padding: 3px;
+}
+
+#docContainer p code,
+#docContainer dt code,
+#docContainer pre code,
+#docContainer pre tt,
+#docContainer pre pre,
+#docContainer tt tt,
+#docContainer tt code,
+#docContainer tt pre {
+ font-size: 1.5em;
+}
+
+pre.LITERALLAYOUT,
+.SCREEN,
+.SYNOPSIS,
+.PROGRAMLISTING,
+.REFSYNOPSISDIV p,
+table.CAUTION,
+table.WARNING,
+blockquote.NOTE,
+blockquote.TIP,
+table.CALSTABLE {
+ -moz-box-shadow: 3px 3px 5px #DFDFDF;
+ -webkit-box-shadow: 3px 3px 5px #DFDFDF;
+ -khtml-box-shadow: 3px 3px 5px #DFDFDF;
+ -o-box-shadow: 3px 3px 5px #DFDFDF;
+ box-shadow: 3px 3px 5px #DFDFDF;
+}
+
+pre.LITERALLAYOUT,
+.SCREEN,
+.SYNOPSIS,
+.PROGRAMLISTING,
+.REFSYNOPSISDIV p,
+table.CAUTION,
+table.WARNING,
+blockquote.NOTE,
+blockquote.TIP {
+ color: black;
+ border-width: 1px;
+ border-style: solid;
+ padding: 2ex;
+ margin: 2ex 0 2ex 2ex;
+ overflow: auto;
+ -moz-border-radius: 8px;
+ -webkit-border-radius: 8px;
+ -khtml-border-radius: 8px;
+ border-radius: 8px;
+}
+
+pre.LITERALLAYOUT,
+pre.SYNOPSIS,
+pre.PROGRAMLISTING,
+.REFSYNOPSISDIV p,
+.SCREEN {
+ border-color: #CFCFCF;
+ background-color: #F7F7F7;
+}
+
+blockquote.NOTE,
+blockquote.TIP {
+ border-color: #DBDBCC;
+ background-color: #EEEEDD;
+ padding: 14px;
+ width: 572px;
+}
+
+blockquote.NOTE,
+blockquote.TIP,
+table.CAUTION,
+table.WARNING {
+ margin: 4ex auto;
+}
+
+blockquote.NOTE p,
+blockquote.TIP p {
+ margin: 0;
+}
+
+blockquote.NOTE pre,
+blockquote.NOTE code,
+blockquote.TIP pre,
+blockquote.TIP code {
+ margin-left: 0;
+ margin-right: 0;
+ -moz-box-shadow: none;
+ -webkit-box-shadow: none;
+ -khtml-box-shadow: none;
+ -o-box-shadow: none;
+ box-shadow: none;
+}
+
+.emphasis,
+.c2 {
+ font-weight: bold;
+}
+
+.REPLACEABLE {
+ font-style: italic;
+}
+
+/* Table Styles */
+
+table {
+ margin-left: 2ex;
+}
+
+table.CALSTABLE td,
+table.CALSTABLE th,
+table.CAUTION td,
+table.CAUTION th,
+table.WARNING td,
+table.WARNING th {
+ border-style: solid;
+}
+
+table.CALSTABLE,
+table.CAUTION,
+table.WARNING {
+ border-spacing: 0;
+ border-collapse: collapse;
+}
+
+table.CALSTABLE
+{
+ margin: 2ex 0 2ex 2ex;
+ background-color: #E0ECEF;
+ border: 2px solid #A7C6DF;
+}
+
+table.CALSTABLE tr:hover td
+{
+ background-color: #EFEFEF;
+}
+
+table.CALSTABLE td {
+ background-color: #FFF;
+}
+
+table.CALSTABLE td,
+table.CALSTABLE th {
+ border: 1px solid #A7C6DF;
+ padding: 0.5ex 0.5ex;
+}
+
+table.CAUTION,
+table.WARNING {
+ border-collapse: separate;
+ display: block;
+ padding: 0;
+ max-width: 600px;
+}
+
+table.CAUTION {
+ background-color: #F5F5DC;
+ border-color: #DEDFA7;
+}
+
+table.WARNING {
+ background-color: #FFD7D7;
+ border-color: #DF421E;
+}
+
+table.CAUTION td,
+table.CAUTION th,
+table.WARNING td,
+table.WARNING th {
+ border-width: 0;
+ padding-left: 2ex;
+ padding-right: 2ex;
+}
+
+table.CAUTION td,
+table.CAUTION th {
+ border-color: #F3E4D5
+}
+
+table.WARNING td,
+table.WARNING th {
+ border-color: #FFD7D7;
+}
+
+td.c1,
+td.c2,
+td.c3,
+td.c4,
+td.c5,
+td.c6 {
+ font-size: 1.1em;
+ font-weight: bold;
+ border-bottom: 0px solid #FFEFEF;
+ padding: 1ex 2ex 0;
+}
+
+/* Link Styles */
+
+#docNav a {
+ font-weight: bold;
+}
+
+a:link,
+a:visited,
+a:active,
+a:hover {
+ text-decoration: underline;
+}
+
+a:link,
+a:active {
+ color:#0066A2;
+}
+
+a:visited {
+ color:#004E66;
+}
+
+a:hover {
+ color:#000000;
+}
+
+#docFooter a:link,
+#docFooter a:visited,
+#docFooter a:active {
+ color:#666;
+}
+
+#docContainer code.FUNCTION tt {
+ font-size: 1em;
+}
diff --git a/docs/documentation/93/media/css/global.css b/docs/documentation/93/media/css/global.css
new file mode 100644
index 0000000..1706e11
--- /dev/null
+++ b/docs/documentation/93/media/css/global.css
@@ -0,0 +1,98 @@
+/*
+ PostgreSQL.org - Global Styles
+*/
+
+body {
+ margin: 0;
+ padding: 0;
+ font-family: verdana, sans-serif;
+ font-size: 69%;
+ color: #000;
+ background-color: #fff;
+}
+
+h1 {
+ font-size: 1.4em;
+ font-weight: bold;
+ margin-top: 0em;
+ margin-bottom: 0em;
+}
+
+h2 {
+ font-size: 1.2em;
+ margin: 1.2em 0em 1.2em 0em;
+ font-weight: bold;
+}
+
+h3 {
+ font-size: 1.0em;
+ margin: 1.2em 0em 1.2em 0em;
+ font-weight: bold;
+}
+
+h4 {
+ font-size: 0.95em;
+ margin: 1.2em 0em 1.2em 0em;
+ font-weight: normal;
+}
+
+h5 {
+ font-size: 0.9em;
+ margin: 1.2em 0em 1.2em 0em;
+ font-weight: normal;
+}
+
+h6 {
+ font-size: 0.85em;
+ margin: 1.2em 0em 1.2em 0em;
+ font-weight: normal;
+}
+
+img {
+ border: 0;
+}
+
+ol, ul, li {/*
+ list-style: none;*/
+ font-size: 1.0em;
+ line-height: 1.2em;
+ margin-top: 0.2em;
+ margin-bottom: 0.1em;
+}
+
+p {
+ font-size: 1.0em;
+ line-height: 1.2em;
+ margin: 1.2em 0em;
+}
+
+td p {
+ margin: 0em 0em 1.2em;
+}
+
+li > p {
+ margin-top: 0.2em;
+}
+
+pre {
+ font-family: monospace;
+ font-size: 1.0em;
+}
+
+div#pgContentWrap code {
+ font-size: 1.2em;
+ padding: 1em;
+ margin: 2ex 0 2ex 2ex;
+ background: #F7F7F7;
+ border: 1px solid #CFCFCF;
+ -moz-border-radius: 8px;
+ -webkit-border-radius: 8px;
+ -khtml-border-radius: 8px;
+ border-radius: 8px;
+ display: block;
+ overflow: auto;
+}
+
+strong, b {
+ font-weight: bold;
+}
diff --git a/docs/documentation/93/media/css/table.css b/docs/documentation/93/media/css/table.css
new file mode 100644
index 0000000..cf2fd7d
--- /dev/null
+++ b/docs/documentation/93/media/css/table.css
@@ -0,0 +1,101 @@
+/*
+ PostgreSQL.org - Table Styles
+*/
+
+div.tblBasic h2 {
+ margin: 25px 0 .5em 0;
+}
+
+div.tblBasic table {
+ background: #F5F5F5 url(../img/layout/nav_tbl_top_lft.png) top left no-repeat;
+ margin-left: 2ex;
+ margin-bottom: 15px;
+}
+
+div.tblBasic table th {
+ padding-top: 20px;
+ border-bottom: 1px solid #EFEFEF;
+ vertical-align: bottom;
+}
+
+div.tblBasic table td {
+ border-bottom: 1px solid #EFEFEF;
+}
+
+div.tblBasic table th,
+div.tblBasic table td {
+ padding: 8px 11px;
+ color: #555555;
+}
+
+div.tblBasic table td.indented {
+ text-indent: 30px;
+}
+
+div.tblBasic table.tblCompact td {
+ padding: 3px 3px;
+}
+
+div.tblBasic table tr.lastrow td {
+ border-bottom: none;
+ padding-bottom: 13px;
+}
+
+div.tblBasic table.tblCompact tr.lastrow td {
+ padding-bottom: 3px;
+}
+
+div.tblBasic table tr.lastrow td.colFirstT,
+div.tblBasic table tr.lastrow td.colFirst {
+ background: url(../img/layout/nav_tbl_btm_lft.png) bottom left no-repeat;
+}
+
+div.tblBasic table.tblBasicGrey th.colLast,
+div.tblBasic table.tblCompact th.colLast {
+ background: #F5F5F5 url(../img/layout/nav_tbl_top_rgt.png) top right no-repeat;
+}
+
+div.tblBasic table.tblBasicGrey tr.lastrow td.colLastT,
+div.tblBasic table.tblBasicGrey tr.lastrow td.colLast,
+div.tblBasic table.tblCompact tr.lastrow td.colLast,
+div.tblBasic table.tblCompact tr.lastrow td.colLastT{
+ background: #F5F5F5 url(../img/layout/nav_tbl_btm_rgt.png) bottom right no-repeat;
+}
+
+div.tblBasic table.tblBasicGrey tr.firstrow td.colLastT,
+div.tblBasic table.tblBasicGrey tr.firstrow td.colLast,
+div tblBasic table.tblCompact tr.firstrow td.colLast {
+ background: #F5F5F5 url(../img/layout/nav_tbl_top_rgt.png) top right no-repeat;
+}
+
+div.tblBasic table th.colMid,
+div.tblBasic table td.colMid,
+div.tblBasic table th.colLast,
+div.tblBasic table td.colLast {
+ background-color: #F5F5F5 ;
+}
+
+div.tblBasic table th.colLastC,
+div.tblBasic table td.colFirstC,
+div.tblBasic table td.colLastC {
+ text-align: center;
+}
+
+div.tblBasic table th.colLastR,
+div.tblBasic table td.colFirstR,
+div.tblBasic table td.colLastR {
+ text-align: right;
+}
+
+div.tblBasic table td.colFirstT,
+div.tblBasic table td.colMidT,
+div.tblBasic table td.colLastT {
+ vertical-align: top;
+}
+
+div.tblBasic table th.colLastRT,
+div.tblBasic table td.colFirstRT,
+div.tblBasic table td.colLastRT {
+ text-align: right;
+ vertical-align: top;
+}
diff --git a/docs/documentation/93/media/css/table.css~ b/docs/documentation/93/media/css/table.css~
new file mode 100644
index 0000000..3aba3ca
--- /dev/null
+++ b/docs/documentation/93/media/css/table.css~
@@ -0,0 +1,101 @@
+/*
+ PostgreSQL.org - Table Styles
+*/
+
+div.tblBasic h2 {
+ margin: 25px 0 .5em 0;
+}
+
+div.tblBasic table {
+ background: #F5F5F5 url(media/img/layout/nav_tbl_top_lft.png) top left no-repeat;
+ margin-left: 2ex;
+ margin-bottom: 15px;
+}
+
+div.tblBasic table th {
+ padding-top: 20px;
+ border-bottom: 1px solid #EFEFEF;
+ vertical-align: bottom;
+}
+
+div.tblBasic table td {
+ border-bottom: 1px solid #EFEFEF;
+}
+
+div.tblBasic table th,
+div.tblBasic table td {
+ padding: 8px 11px;
+ color: #555555;
+}
+
+div.tblBasic table td.indented {
+ text-indent: 30px;
+}
+
+div.tblBasic table.tblCompact td {
+ padding: 3px 3px;
+}
+
+div.tblBasic table tr.lastrow td {
+ border-bottom: none;
+ padding-bottom: 13px;
+}
+
+div.tblBasic table.tblCompact tr.lastrow td {
+ padding-bottom: 3px;
+}
+
+div.tblBasic table tr.lastrow td.colFirstT,
+div.tblBasic table tr.lastrow td.colFirst {
+ background: url(media/img/layout/nav_tbl_btm_lft.png) bottom left no-repeat;
+}
+
+div.tblBasic table.tblBasicGrey th.colLast,
+div.tblBasic table.tblCompact th.colLast {
+ background: #F5F5F5 url(media/img/layout/nav_tbl_top_rgt.png) top right no-repeat;
+}
+
+div.tblBasic table.tblBasicGrey tr.lastrow td.colLastT,
+div.tblBasic table.tblBasicGrey tr.lastrow td.colLast,
+div.tblBasic table.tblCompact tr.lastrow td.colLast,
+div.tblBasic table.tblCompact tr.lastrow td.colLastT{
+ background: #F5F5F5 url(media/img/layout/nav_tbl_btm_rgt.png) bottom right no-repeat;
+}
+
+div.tblBasic table.tblBasicGrey tr.firstrow td.colLastT,
+div.tblBasic table.tblBasicGrey tr.firstrow td.colLast,
+div tblBasic table.tblCompact tr.firstrow td.colLast {
+ background: #F5F5F5 url(media/img/layout/nav_tbl_top_rgt.png) top right no-repeat;
+}
+
+div.tblBasic table th.colMid,
+div.tblBasic table td.colMid,
+div.tblBasic table th.colLast,
+div.tblBasic table td.colLast {
+ background-color: #F5F5F5 ;
+}
+
+div.tblBasic table th.colLastC,
+div.tblBasic table td.colFirstC,
+div.tblBasic table td.colLastC {
+ text-align: center;
+}
+
+div.tblBasic table th.colLastR,
+div.tblBasic table td.colFirstR,
+div.tblBasic table td.colLastR {
+ text-align: right;
+}
+
+div.tblBasic table td.colFirstT,
+div.tblBasic table td.colMidT,
+div.tblBasic table td.colLastT {
+ vertical-align: top;
+}
+
+div.tblBasic table th.colLastRT,
+div.tblBasic table td.colFirstRT,
+div.tblBasic table td.colLastRT {
+ text-align: right;
+ vertical-align: top;
+}
diff --git a/docs/documentation/93/media/css/text.css b/docs/documentation/93/media/css/text.css
new file mode 100644
index 0000000..902a118
--- /dev/null
+++ b/docs/documentation/93/media/css/text.css
@@ -0,0 +1,162 @@
+/*
+ PostgreSQL.org - Text Styles
+*/
+
+/* Heading Definitions */
+
+h1 {
+ color: #EC5800;
+}
+
+h2 {
+ color: #666;
+}
+
+h3 {
+ color: #666;
+}
+
+h4 {
+ color: #666;
+}
+
+/* Text Styles */
+
+.txtColumn1 {
+ width: 50%;
+ line-height: 1.3em;
+}
+
+.txtColumn2 {
+ width: 50%;
+ line-height: 1.5em;
+}
+
+.txtCurrentLocation {
+ font-weight: bold;
+}
+
+.txtDivider {
+ font-size: 0.8em;
+ color: #E1E1E1;
+ padding-left: 4px;
+ padding-right: 4px;
+}
+
+.txtNewsEvent {
+ font-size: 0.9em;
+ color: #0094C7;
+}
+
+.txtDate {
+ font-size: 0.9em;
+ color: #666;
+}
+
+.txtMediumGrey {
+ color: #666;
+}
+
+.txtFormLabel {
+ color: #666;
+ font-weight: bold;
+ text-align: right;
+ vertical-align: top;
+}
+
+.txtRequiredField {
+ color: #EC5800;
+}
+
+.txtImportant {
+ color: #EC5800;
+}
+
+.txtOffScreen {
+ position: absolute;
+ left: -1999px;
+ width: 1990px;
+}
+
+#txtFrontFeatureHeading {
+ padding-bottom: 1.1em;
+}
+
+#txtFrontFeatureLink a {
+ font-size: 1.2em;
+ font-weight: bold;
+ padding-left: 5px;
+}
+
+#txtFrontUserText {
+ font-size: 1.0em;
+ color: #666;
+ margin-top: 12px;
+}
+
+#txtFrontUserName {
+ font-size: 0.9em;
+ color: #666;
+ margin-top: 9px;
+ font-weight: bold;
+}
+
+#txtFrontUserLink {
+ font-size: 0.9em;
+ color: #666;
+ margin-top: 11px;
+ margin-left: 1px;
+}
+
+#txtFrontUserLink img {
+ padding-right: 5px;
+}
+
+#txtFrontSupportUsText {
+ font-size: 1.0em;
+ margin-top: 9px;
+}
+
+#txtFrontSupportUsLink {
+ font-size: 0.9em;
+ margin-top: 6px;
+}
+
+#txtFrontSupportUsLink img {
+ padding-right: 7px;
+}
+
+/* Link Styles */
+
+a:link { color:#0085B0; text-decoration: underline; }
+a:visited { color:#004E66; text-decoration: underline; }
+a:active { color:#0085B0; text-decoration: underline; }
+a:hover { color:#000000; text-decoration: underline; }
+
+#pgFooter a:link { color:#666; text-decoration: underline; }
+#pgFooter a:visited { color:#666; text-decoration: underline; }
+#pgFooter a:active { color:#666; text-decoration: underline; }
+#pgFooter a:hover { color:#000000; text-decoration: underline; }
+
+#txtFrontUserName a:link { color:#666; text-decoration: underline; }
+#txtFrontUserName a:visited { color:#666; text-decoration: underline; }
+#txtFrontUserName a:active { color:#666; text-decoration: underline; }
+#txtFrontUserName a:hover { color:#000; text-decoration: underline; }
+
+#txtArchives a:visited { color:#00536E; text-decoration: underline; }
+#txtArchives pre { word-wrap: break-word; font-size: 150%; }
+#txtArchives tt { word-wrap: break-word; font-size: 150%; }
+
+#pgFrontUSSContainer h2, #pgFrontUSSContainer h3 {
+ margin: 0;
+ padding: 0;
+}
+
+#pgFrontNewsEventsContainer h2, #pgFrontNewsEventsContainer h3 {
+ margin: 0;
+ padding: 0;
+}
+
+#pgFrontNewsEventsContainer h3 img {
+ margin-bottom: 10px;
+}
diff --git a/docs/documentation/93/media/favicon.ico b/docs/documentation/93/media/favicon.ico
new file mode 100644
index 0000000..a1cc036
Binary files /dev/null and b/docs/documentation/93/media/favicon.ico differ
diff --git a/docs/documentation/93/media/img/docs/bg_hdr.png b/docs/documentation/93/media/img/docs/bg_hdr.png
new file mode 100644
index 0000000..07c3b65
Binary files /dev/null and b/docs/documentation/93/media/img/docs/bg_hdr.png differ
diff --git a/docs/documentation/93/media/img/layout/hdr_left3a.png b/docs/documentation/93/media/img/layout/hdr_left3a.png
new file mode 100644
index 0000000..fb1f70d
Binary files /dev/null and b/docs/documentation/93/media/img/layout/hdr_left3a.png differ
diff --git a/docs/documentation/93/media/img/layout/nav_tbl_btm.png b/docs/documentation/93/media/img/layout/nav_tbl_btm.png
new file mode 100644
index 0000000..ec897af
Binary files /dev/null and b/docs/documentation/93/media/img/layout/nav_tbl_btm.png differ
diff --git a/docs/documentation/93/media/img/layout/nav_tbl_top.png b/docs/documentation/93/media/img/layout/nav_tbl_top.png
new file mode 100644
index 0000000..3a22368
Binary files /dev/null and b/docs/documentation/93/media/img/layout/nav_tbl_top.png differ
diff --git a/docs/documentation/93/outer-joins-escape.md b/docs/documentation/93/outer-joins-escape.md
new file mode 100644
index 0000000..6ab79e5
--- /dev/null
+++ b/docs/documentation/93/outer-joins-escape.md
@@ -0,0 +1,17 @@
+---
+layout: default_docs
+title: Escape for outer joins
+header: Chapter 8. JDBC escapes
+resource: media
+previoustitle: Chapter 8. JDBC escapes
+previous: escapes.html
+nexttitle: Date-time escapes
+next: escapes-datetime.html
+---
+
+You can specify outer joins using the following syntax: `{oj table (LEFT|RIGHT|FULL) OUTER JOIN (table | outer-join)
+ON search-condition }`
+
+For example :
+
+`rs = stmt.executeQuery( "select * from {oj a left outer join b on (a.i=b.i)} ");`
\ No newline at end of file
diff --git a/docs/documentation/93/prepare.md b/docs/documentation/93/prepare.md
new file mode 100644
index 0000000..d57b525
--- /dev/null
+++ b/docs/documentation/93/prepare.md
@@ -0,0 +1,25 @@
+---
+layout: default_docs
+title: Preparing the Database Server for JDBC
+header: Chapter 2. Setting up the JDBC Driver
+resource: media
+previoustitle: Setting up the Class Path
+previous: classpath.html
+nexttitle: Creating a Database
+next: your-database.html
+---
+
+Because Java does not support using unix sockets the PostgreSQL™ server must be
+configured to allow TCP/IP connections. Starting with server version 8.0 TCP/IP
+connections are allowed from `localhost`. To allow connections to other interfaces
+than the loopback interface, you must modify the `postgresql.conf` file's `listen_addresses`
+setting.
+
+For server versions prior to 8.0 the server does not listen on any interface by
+default, and you must set `tcpip_socket = true` in the `postgresql.conf` file.
+
+Once you have made sure the server is correctly listening for TCP/IP connections
+the next step is to verify that users are allowed to connect to the server. Client
+authentication is setup in `pg_hba.conf`. Refer to the main PostgreSQL™ documentation
+for details. The JDBC driver supports the `trust`, `ident`, `password`, `md5`, and
+`crypt` authentication methods.
\ No newline at end of file
diff --git a/docs/documentation/93/query.md b/docs/documentation/93/query.md
new file mode 100644
index 0000000..88fa831
--- /dev/null
+++ b/docs/documentation/93/query.md
@@ -0,0 +1,113 @@
+---
+layout: default_docs
+title: Chapter 5. Issuing a Query and Processing the Result
+header: Chapter 5. Issuing a Query and Processing the Result
+resource: media
+previoustitle: Custom SSLSocketFactory
+previous: ssl-factory.html
+nexttitle: Using the Statement or PreparedStatement Interface
+next: statement.html
+---
+
+**Table of Contents**
+
+* [Getting results based on a cursor](query.html#query-with-cursor)
+* [Using the `Statement` or `PreparedStatement` Interface](statement.html)
+* [Using the `ResultSet` Interface](resultset.html)
+* [Performing Updates](update.html)
+* [Creating and Modifying Database Objects](ddl.html)
+
+Any time you want to issue SQL statements to the database, you require a `Statement`
+or `PreparedStatement` instance. Once you have a `Statement` or `PreparedStatement`,
+you can use issue a query. This will return a `ResultSet` instance, which contains
+the entire result (see the section called [“Getting results based on a cursor”](query.html#query-with-cursor)
+here for how to alter this behaviour). [Example 5.1, “Processing a Simple Query in JDBC”](query.html#query-example)
+illustrates this process.
+
+<a name="query-example"></a>
+**Example 5.1. Processing a Simple Query in JDBC**
+
+This example will issue a simple query and print out the first column of each
+row using a `Statement`.
+
+`Statement st = conn.createStatement();`
+`ResultSet rs = st.executeQuery("SELECT * FROM mytable WHERE columnfoo = 500");`
+`while (rs.next())`
+`{`
+ `System.out.print("Column 1 returned ");`
+ `System.out.println(rs.getString(1));`
+`}`
+`rs.close();`
+`st.close();`
+
+This example issues the same query as before but uses a `PreparedStatement` and
+a bind value in the query.
+
+`int foovalue = 500;`
+`PreparedStatement st = conn.prepareStatement("SELECT * FROM mytable WHERE columnfoo = ?");`
+`st.setInt(1, foovalue);`
+`ResultSet rs = st.executeQuery();`
+`while (rs.next())`
+`{`
+ `System.out.print("Column 1 returned ");`
+ `System.out.println(rs.getString(1));`
+`}`
+`rs.close();`
+`st.close();`
+
+<a name="query-with-cursor"></a>
+# Getting results based on a cursor
+
+By default the driver collects all the results for the query at once. This can
+be inconvenient for large data sets so the JDBC driver provides a means of basing
+a `ResultSet` on a database cursor and only fetching a small number of rows.
+
+A small number of rows are cached on the client side of the connection and when
+exhausted the next block of rows is retrieved by repositioning the cursor.
+
+### Note
+
+> Cursor based `ResultSets` cannot be used in all situations. There a number of
+ restrictions which will make the driver silently fall back to fetching the
+ whole `ResultSet` at once.
+
+* The connection to the server must be using the V3 protocol. This is the default
+ for (and is only supported by) server versions 7.4 and later.
+* The `Connection` must not be in autocommit mode. The backend closes cursors at
+ the end of transactions, so in autocommit mode the backend will have
+ closed the cursor before anything can be fetched from it.
+*The `Statement` must be created with a `ResultSet` type of `ResultSet.TYPE_FORWARD_ONLY`.
+ This is the default, so no code will need to be rewritten to take advantage
+ of this, but it also means that you cannot scroll backwards or otherwise
+ jump around in the `ResultSet`.
+* The query given must be a single statement, not multiple statements strung
+ together with semicolons.
+
+<a name="fetchsize-example"></a>
+**Example 5.2. Setting fetch size to turn cursors on and off.**
+
+Changing code to cursor mode is as simple as setting the fetch size of the
+`Statement` to the appropriate size. Setting the fetch size back to 0 will cause
+all rows to be cached (the default behaviour).
+
+`// make sure autocommit is off`
+`conn.setAutoCommit(false);`
+`Statement st = conn.createStatement();`<br /><br />
+`// Turn use of the cursor on.`
+`st.setFetchSize(50);`
+`ResultSet rs = st.executeQuery("SELECT * FROM mytable");`
+`while (rs.next())`
+`{`
+ `System.out.print("a row was returned.");`
+`}`
+`rs.close();`<br /><br />
+`// Turn the cursor off.`
+`st.setFetchSize(0);`
+`rs = st.executeQuery("SELECT * FROM mytable");`
+`while (rs.next())`
+`{`
+ `System.out.print("many rows were returned.");`
+`}`
+`rs.close();`<br /><br />
+`// Close the statement.`
+`st.close();`
\ No newline at end of file
diff --git a/docs/documentation/93/reading.md b/docs/documentation/93/reading.md
new file mode 100644
index 0000000..10428bf
--- /dev/null
+++ b/docs/documentation/93/reading.md
@@ -0,0 +1,18 @@
+---
+layout: default_docs
+title: Chapter 12. Further Reading
+header: Chapter 12. Further Reading
+resource: media
+previoustitle: Data Sources and JNDI
+previous: jndi.html
+nexttitle: The PostgreSQL™ JDBC Interface
+next: index.html
+---
+
+If you have not yet read it, you are advised you read the JDBC API Documentation
+(supplied with Oracle's JDK) and the JDBC Specification. Both are available from
+[http://www.oracle.com/technetwork/java/javase/jdbc/index.html](http://www.oracle.com/technetwork/java/javase/jdbc/index.html).
+
+[http://jdbc.postgresql.org/index.html](http://jdbc.postgresql.org/index.html)
+contains updated information not included in this manual including Javadoc class
+documentation and a FAQ. Additionally it offers precompiled drivers.
diff --git a/docs/documentation/93/resultset.md b/docs/documentation/93/resultset.md
new file mode 100644
index 0000000..58c5f5a
--- /dev/null
+++ b/docs/documentation/93/resultset.md
@@ -0,0 +1,19 @@
+---
+layout: default_docs
+title: Using the ResultSet Interface
+header: Chapter 5. Issuing a Query and Processing the Result
+resource: media
+previoustitle: Using the Statement or PreparedStatement Interface
+previous: statement.html
+nexttitle: Performing Updates
+next: update.html
+---
+
+The following must be considered when using the `ResultSet` interface:
+
+* Before reading any values, you must call `next()`. This returns true if there
+ is a result, but more importantly, it prepares the row for processing.
+* You must close a `ResultSet` by calling `close()` once you have finished using
+ it.
+* Once you make another query with the `Statement` used to create a `ResultSet`,
+ the currently open `ResultSet` instance is closed automatically.
\ No newline at end of file
diff --git a/docs/documentation/93/server-prepare.md b/docs/documentation/93/server-prepare.md
new file mode 100644
index 0000000..446e7ff
--- /dev/null
+++ b/docs/documentation/93/server-prepare.md
@@ -0,0 +1,121 @@
+---
+layout: default_docs
+title: Server Prepared Statements
+header: Chapter 9. PostgreSQL™ Extensions to the JDBC API
+resource: media
+previoustitle: Listen / Notify
+previous: listennotify.html
+nexttitle: Chapter 10. Using the Driver in a Multithreaded or a Servlet Environment
+next: thread.html
+---
+
+The PostgreSQL™ server allows clients to compile sql statements that are expected
+to be reused to avoid the overhead of parsing and planning the statement for every
+execution. This functionality is available at the SQL level via PREPARE and EXECUTE
+beginning with server version 7.3, and at the protocol level beginning with server
+version 7.4, but as Java developers we really just want to use the standard
+`PreparedStatement` interface.
+
+### Note
+
+> Previous versions of the driver used PREPARE and EXECUTE to implement
+server-prepared statements. This is supported on all server versions beginning
+with 7.3, but produced application-visible changes in query results, such as
+missing ResultSet metadata and row update counts. The current driver uses the V3
+protocol-level equivalents which avoid these changes in query results, but the
+V3 protocol is only available beginning with server version 7.4. Enabling server-prepared
+statements will have no affect when connected to a 7.3 server or when explicitly
+using the V2 protocol to connect to a 7.4 server.
+
+There are a number of ways to enable server side prepared statements depending on
+your application's needs. The general method is to set a threshold for a
+`PreparedStatement`. An internal counter keeps track of how many times the
+statement has been executed and when it reaches the threshold it will start to
+use server side prepared statements.
+
+### Note
+
+> Server side prepared statements are planned only once by the server. This avoids
+the cost of replanning the query every time, but also means that the planner
+cannot take advantage of the particular parameter values used in a particular
+execution of the query. You should be cautious about enabling the use of server
+side prepared statements globally.
+
+<a name="server-prepared-statement-example"></a>
+**Example 9.3. Using server side prepared statements**
+
+import java.sql.*;
+
+public class ServerSidePreparedStatement
+{
+
+ public static void main(String args[]) throws Exception
+ {
+ Class.forName("org.postgresql.Driver");
+ String url = "jdbc:postgresql://localhost:5432/test";
+ Connection conn = DriverManager.getConnection(url,"test","");
+
+ PreparedStatement pstmt = conn.prepareStatement("SELECT ?");
+
+ // cast to the pg extension interface
+ org.postgresql.PGStatement pgstmt = pstmt.unwrap(org.postgresql.PGStatement.class);
+
+ // on the third execution start using server side statements
+ pgstmt.setPrepareThreshold(3);
+
+ for (int i=1; i<=5; i++)
+ {
+ pstmt.setInt(1,i);
+ boolean usingServerPrepare = pgstmt.isUseServerPrepare();
+ ResultSet rs = pstmt.executeQuery();
+ rs.next();
+ System.out.println("Execution: "+i+", Used server side: " + usingServerPrepare + ", Result: "+rs.getInt(1));
+ rs.close();
+ }
+
+ pstmt.close();
+ conn.close();
+ }
+}
+
+Which produces the expected result of using server side prepared statements upon
+the third execution.
+
+`Execution: 1, Used server side: false, Result: 1`
+`Execution: 2, Used server side: false, Result: 2`
+`Execution: 3, Used server side: true, Result: 3`
+`Execution: 4, Used server side: true, Result: 4`
+`Execution: 5, Used server side: true, Result: 5`
+
+The example shown above requires the programmer to use PostgreSQL™ specific code
+in a supposedly portable API which is not ideal. Also it sets the threshold only
+for that particular statement which is some extra typing if we wanted to use that
+threshold for every statement. Let's take a look at the other ways to set the
+threshold to enable server side prepared statements. There is already a hierarchy
+in place above a `PreparedStatement`, the `Connection` it was created from, and
+above that the source of the connection be it a `Datasource` or a URL. The server
+side prepared statement threshold can be set at any of these levels such that
+the value will be the default for all of it's children.
+
+`// pg extension interfaces`
+`org.postgresql.PGConnection pgconn;`
+`org.postgresql.PGStatement pgstmt;`
+
+`// set a prepared statement threshold for connections created from this url`
+`String url = "jdbc:postgresql://localhost:5432/test?prepareThreshold=3";`
+
+`// see that the connection has picked up the correct threshold from the url`
+`Connection conn = DriverManager.getConnection(url,"test","");`
+`pgconn = conn.unwrap(org.postgresql.PGConnection.class);`
+`System.out.println(pgconn.getPrepareThreshold()); // Should be 3`
+
+`// see that the statement has picked up the correct threshold from the connection`
+`PreparedStatement pstmt = conn.prepareStatement("SELECT ?");`
+`pgstmt = pstmt.unwrap(org.postgresql.PGStatement.class);`
+`System.out.println(pgstmt.getPrepareThreshold()); // Should be 3`
+
+`// change the connection's threshold and ensure that new statements pick it up`
+`pgconn.setPrepareThreshold(5);`
+`PreparedStatement pstmt = conn.prepareStatement("SELECT ?");`
+`pgstmt = pstmt.unwrap(org.postgresql.PGStatement.class);`
+`System.out.println(pgstmt.getPrepareThreshold()); // Should be 5`
diff --git a/docs/documentation/93/setup.md b/docs/documentation/93/setup.md
new file mode 100644
index 0000000..4668660
--- /dev/null
+++ b/docs/documentation/93/setup.md
@@ -0,0 +1,44 @@
+---
+layout: default_docs
+title: Chapter 2. Setting up the JDBC Driver
+header: Chapter 2. Setting up the JDBC Driver
+resource: media
+previoustitle: Chapter 1. Introduction
+previous: intro.html
+nexttitle: Setting up the Class Path
+next: classpath.html
+---
+
+**Table of Contents**
+
+* [Getting the Driver](setup.html#build)
+* [Setting up the Class Path](classpath.html)
+* [Preparing the Database Server for JDBC](prepare.html)
+* [Creating a Database](your-database.html)
+
+This section describes the steps you need to take before you can write or run
+programs that use the JDBC interface.
+
+<a name="build"></a>
+# Getting the Driver
+
+Precompiled versions of the driver can be downloaded from the [PostgreSQL™ JDBC web site](http://jdbc.postgresql.org).
+
+Alternatively you can build the driver from source, but you should only need to
+do this if you are making changes to the source code. To build the JDBC driver,
+you need Ant 1.5 or higher and a JDK. Ant is a special tool for building Java-based
+packages. It can be downloaded from the [Ant web site](http://ant.apache.org/index.html).
+
+If you have several Java compilers installed, it depends on the Ant configuration
+which one gets used. Precompiled Ant distributions are typically set up to read
+a file `.antrc` in the current user's home directory for configuration. For example,
+to use a different JDK than the default, this may work:
+
+`JAVA_HOME=/usr/local/jdk1.6.0_07`
+`JAVACMD=$JAVA_HOME/bin/java`
+
+To compile the driver simply run **ant** in the top level directory. The compiled
+driver will be placed in `jars/postgresql.jar`. The resulting driver will be built
+for the version of Java you are running. If you build with a 1.4 or 1.5 JDK you
+will build a version that supports the JDBC 3 specification and if you build with
+a 1.6 or higher JDK you will build a version that supports the JDBC 4 specification.
\ No newline at end of file
diff --git a/docs/documentation/93/ssl-client.md b/docs/documentation/93/ssl-client.md
new file mode 100644
index 0000000..18dd55a
--- /dev/null
+++ b/docs/documentation/93/ssl-client.md
@@ -0,0 +1,70 @@
+---
+layout: default_docs
+title: Configuring the Client
+header: Chapter 4. Using SSL
+resource: media
+previoustitle: Chapter 4. Using SSL
+previous: ssl.html
+nexttitle: Custom SSLSocketFactory
+next: ssl-factory.html
+---
+
+Unlike psql and other libpq based programs the JDBC driver does server certificate
+validation by default. This means that when establishing a SSL connection the
+JDBC driver will validate the server's identity preventing "man in the middle"
+attacks. It does this by checking that the server certificate is signed by a
+trusted authority. If you have a certificate signed by a global certificate
+authority (CA), there is nothing further to do because Java comes with copies of
+the most common CA's certificates. If you are dealing with a self-signed certificate
+though, you need to make this available to the Java client to enable it to validate
+the server's certificate.
+
+> ### Note
+
+> Only the JDBC 3 driver supports SSL. The 1.4 JDK was the first version to come
+bundled with SSL support. Previous JDK versions that wanted to use SSL could
+make use of the additional JSSE library, but it does not support the full range
+of features utilized by the PostgreSQL™ JDBC driver.
+
+To make the server certificate available to Java, the first step is to convert
+it to a form Java understands.
+
+`openssl x509 -in server.crt -out server.crt.der -outform der`
+
+From here the easiest thing to do is import this certificate into Java's system
+truststore.
+
+`keytool -keystore $JAVA_HOME/lib/security/cacerts -alias postgresql -import -file server.crt.der`
+
+The default password for the cacerts keystore is `changeit`. The alias to postgesql
+is not important and you may select any name you desire.
+
+If you do not have access to the system cacerts truststore you can create your
+own truststore.
+
+`keytool -keystore mystore -alias postgresql -import -file server.crt.der.`
+
+When starting your Java application you must specify this keystore and password
+to use.
+
+`java -Djavax.net.ssl.trustStore=mystore -Djavax.net.ssl.trustStorePassword=mypassword com.mycompany.MyApp`
+
+In the event of problems extra debugging information is available by adding
+`-Djavax.net.debug=ssl` to your command line.
+
+To instruct the JDBC driver to try and establish a SSL connection you must add
+the connection URL parameter `ssl=true`.
+
+<a name="nonvalidating"></a>
+## Using SSL without Certificate Validation
+
+In some situations it may not be possible to configure your Java environment to
+make the server certificate available, for example in an applet. For a large
+scale deployment it would be best to get a certificate signed by recognized
+certificate authority, but that is not always an option. The JDBC driver provides
+an option to establish a SSL connection without doing any validation, but please
+understand the risk involved before enabling this option.
+
+A non-validating connection is established via a custom `SSLSocketFactory` class
+that is provided with the driver. Setting the connection URL parameter `sslfactory=org.postgresql.ssl.NonValidatingFactory`
+will turn off all SSL validation.
\ No newline at end of file
diff --git a/docs/documentation/93/ssl-factory.md b/docs/documentation/93/ssl-factory.md
new file mode 100644
index 0000000..a7e31ee
--- /dev/null
+++ b/docs/documentation/93/ssl-factory.md
@@ -0,0 +1,29 @@
+---
+layout: default_docs
+title: Custom SSLSocketFactory
+header: Chapter 4. Using SSL
+resource: media
+previoustitle: Configuring the Client
+previous: ssl-client.html
+nexttitle: Chapter 5. Issuing a Query and Processing the Result
+next: query.html
+---
+
+PostgreSQL™ provides a way for developers to customize how a SSL connection is
+established. This may be used to provide a custom certificate source or other
+extensions by allowing the developer to create their own `SSLContext` instance.
+The connection URL parameters `sslfactory` and `sslfactoryarg` allow the user
+to specify which custom class to use for creating the `SSLSocketFactory`. The
+class name specified by `sslfactory` must extend `javax.net.ssl.SSLSocketFactory`
+and be available to the driver's classloader. This class must have a zero argument
+constructor or a single argument constructor taking a String argument. This
+argument may optionally be supplied by `sslfactoryarg`.
+
+Information on how to actually implement such a class is beyond the scope of this
+documentation. Places to look for help are the [JSSE Reference Guide](https://docs.oracle.com/javase/8/docs/technotes/guides/security/jsse/JSSERefGuide.html)
+and the source to the `NonValidatingFactory` provided by the JDBC driver.
+
+The Java SSL API is not very well known to the JDBC driver developers and we
+would be interested in any interesting and generally useful extensions that you
+have implemented using this mechanism. Specifically it would be nice to be able
+to provide client certificates to be validated by the server.
diff --git a/docs/documentation/93/ssl.md b/docs/documentation/93/ssl.md
new file mode 100644
index 0000000..af93238
--- /dev/null
+++ b/docs/documentation/93/ssl.md
@@ -0,0 +1,37 @@
+---
+layout: default_docs
+title: Chapter 4. Using SSL
+header: Chapter 4. Using SSL
+resource: media
+previoustitle: Connecting to the Database
+previous: connect.html
+nexttitle: Configuring the Client
+next: ssl-client.html
+---
+
+**Table of Contents**
+
+* [Configuring the Server](ssl.html#ssl-server)
+* [Configuring the Client](ssl-client.html)
+ * [Using SSL without Certificate Validation](ssl-client.html#nonvalidating)
+* [Custom SSLSocketFactory](ssl-factory.html)
+
+<a name="ssl-server"></a>
+# Configuring the Server
+
+Configuring the PostgreSQL™ server for SSL is covered in the [main
+documentation](http://www.postgresql.org/docs/current/static/ssl-tcp.html),
+so it will not be repeated here. Before trying to access your SSL enabled
+server from Java, make sure you can get to it via **psql**. You should
+see output like the following if you have established a SSL connnection.
+
+`$ ./bin/psql -h localhost`
+`Welcome to psql 8.0.0rc5, the PostgreSQL interactive terminal.`
+
+`Type: \copyright for distribution terms`
+ `\h for help with SQL commands`
+ `\? for help with psql commands`
+ `\g or terminate with semicolon to execute query`
+ `\q to quit`
+
+`SSL connection (cipher: DHE-RSA-AES256-SHA, bits: 256)`
\ No newline at end of file
diff --git a/docs/documentation/93/statement.md b/docs/documentation/93/statement.md
new file mode 100644
index 0000000..20f3e5f
--- /dev/null
+++ b/docs/documentation/93/statement.md
@@ -0,0 +1,25 @@
+---
+layout: default_docs
+title: Using the Statement or PreparedStatement Interface
+header: Chapter 5. Issuing a Query and Processing the Result
+resource: media
+previoustitle: Chapter 5. Issuing a Query and Processing the Result
+previous: query.html
+nexttitle: Using the ResultSet Interface
+next: resultset.html
+---
+
+The following must be considered when using the `Statement` or `PreparedStatement`
+interface:
+
+* You can use a single `Statement` instance as many times as you want. You could
+ create one as soon as you open the connection and use it for the connection's
+ lifetime. But you have to remember that only one `ResultSet` can exist
+ per `Statement` or `PreparedStatement` at a given time.
+* If you need to perform a query while processing a `ResultSet`, you can simply
+ create and use another `Statement`.
+* If you are using threads, and several are using the database, you must use a
+ separate `Statement` for each thread. Refer to [Chapter 10, *Using the Driver in a Multithreaded or a Servlet Environment*](thread.html)
+ if you are thinking of using threads, as it covers some important points.
+* When you are done using the `Statement` or `PreparedStatement` you should close
+ it.
\ No newline at end of file
diff --git a/docs/documentation/93/thread.md b/docs/documentation/93/thread.md
new file mode 100644
index 0000000..d79f25b
--- /dev/null
+++ b/docs/documentation/93/thread.md
@@ -0,0 +1,38 @@
+---
+layout: default_docs
+title: Chapter 10. Using the Driver in a Multithreaded or a Servlet Environment
+header: Chapter 10. Using the Driver in a Multithreaded or a Servlet Environment
+resource: media
+previoustitle: Server Prepared Statements
+previous: server-prepare.html
+nexttitle: Chapter 11. Connection Pools and Data Sources
+next: datasource.html
+---
+
+A problem with many JDBC drivers is that only one thread can use a `Connection`
+at any one time --- otherwise a thread could send a query while another one is
+receiving results, and this could cause severe confusion.
+
+The PostgreSQL™ JDBC driver is thread safe. Consequently, if your application
+uses multiple threads then you do not have to worry about complex algorithms to
+ensure that only one thread uses the database at a time.
+
+If a thread attempts to use the connection while another one is using it, it
+will wait until the other thread has finished its current operation. If the
+operation is a regular SQL statement, then the operation consists of sending the
+statement and retrieving any `ResultSet` (in full). If it is a fast-path call
+(e.g., reading a block from a large object) then it consists of sending and
+retrieving the respective data.
+
+This is fine for applications and applets but can cause a performance problem
+with servlets. If you have several threads performing queries then each but one
+will pause. To solve this, you are advised to create a pool of connections. When
+ever a thread needs to use the database, it asks a manager class for a `Connection`
+object. The manager hands a free connection to the thread and marks it as busy.
+If a free connection is not available, it opens one. Once the thread has
+finished using the connection, it returns it to the manager which can then either
+close it or add it to the pool. The manager would also check that the connection
+is still alive and remove it from the pool if it is dead. The down side of a
+connection pool is that it increases the load on the server because a new session
+is created for each `Connection` object. It is up to you and your applications's
+requirements.
\ No newline at end of file
diff --git a/docs/documentation/93/tomcat.md b/docs/documentation/93/tomcat.md
new file mode 100644
index 0000000..ece8816
--- /dev/null
+++ b/docs/documentation/93/tomcat.md
@@ -0,0 +1,121 @@
+---
+layout: default_docs
+title: Tomcat setup
+header: Chapter 11. Connection Pools and Data Sources
+resource: media
+previoustitle: Applications DataSource
+previous: ds-ds.html
+nexttitle: Data Sources and JNDI
+next: jndi.html
+---
+
+### Note
+
+The postgresql.jar file must be placed in $CATALINA_HOME/common/lib in both
+Tomcat 4 and 5.
+
+The absolute easiest way to set this up in either tomcat instance is to use the
+admin web application that comes with Tomcat, simply add the datasource to the
+context you want to use it in.
+
+Setup for Tomcat 4 place the following inside the <Context> tag inside
+conf/server.xml
+
+<pre><code>
+<Resource name="jdbc/postgres" scope="Shareable" type="javax.sql.DataSource"/>
+<ResourceParams name="jdbc/postgres">
+ <parameter>
+ <name>validationQuery</name>
+ <value>select version();</value>
+ </parameter>
+ <parameter>
+ <name>url</name>
+ <value>jdbc:postgresql://localhost/davec</value>
+ </parameter>
+ <parameter>
+ <name>password</name>
+ <value>davec</value>
+ </parameter>
+ <parameter>
+ <name>maxActive</name>
+ <value>4</value>
+ </parameter>
+ <parameter>
+ <name>maxWait</name>
+ <value>5000</value>
+ </parameter>
+ <parameter>
+ <name>driverClassName</name>
+ <value>org.postgresql.Driver</value>
+ </parameter>
+ <parameter>
+ <name>username</name>
+ <value>davec</value>
+ </parameter>
+ <parameter>
+ <name>maxIdle</name>
+ <value>2</value>
+ </parameter>
+</ResourceParams>
+</code></pre>
+
+Setup for Tomcat 5, you can use the above method, except that it goes inside the
+<DefaultContext> tag inside the <Host> tag. eg. <Host> ... <DefaultContext> ...
+
+Alternatively there is a conf/Catalina/hostname/context.xml file. For example
+http://localhost:8080/servlet-example has a directory $CATALINA_HOME/conf/Catalina/localhost/servlet-example.xml file.
+Inside this file place the above xml inside the <Context> tag
+
+Then you can use the following code to access the connection.
+
+<pre><code>
+import javax.naming.*;
+import javax.sql.*;
+import java.sql.*;
+public class DBTest
+{
+
+ String foo = "Not Connected";
+ int bar = -1;
+
+ public void init()
+ {
+ try
+ {
+ Context ctx = new InitialContext();
+ if(ctx == null )
+ throw new Exception("Boom - No Context");
+
+ // /jdbc/postgres is the name of the resource above
+ DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/postgres");
+
+ if (ds != null)
+ {
+ Connection conn = ds.getConnection();
+
+ if(conn != null)
+ {
+ foo = "Got Connection "+conn.toString();
+ Statement stmt = conn.createStatement();
+ ResultSet rst = stmt.executeQuery("select id, foo, bar from testdata");
+
+ if(rst.next())
+ {
+ foo=rst.getString(2);
+ bar=rst.getInt(3);
+ }
+ conn.close();
+ }
+ }
+ }
+ catch(Exception e)
+ {
+ e.printStackTrace();
+ }
+ }
+
+ public String getFoo() { return foo; }
+
+ public int getBar() { return bar;}
+}
+</code></pre>
\ No newline at end of file
diff --git a/docs/documentation/93/update.md b/docs/documentation/93/update.md
new file mode 100644
index 0000000..a681c41
--- /dev/null
+++ b/docs/documentation/93/update.md
@@ -0,0 +1,30 @@
+---
+layout: default_docs
+title: Performing Updates
+header: Chapter 5. Issuing a Query and Processing the Result
+resource: media
+previoustitle: Using the ResultSet Interface
+previous: resultset.html
+nexttitle: Creating and Modifying Database Objects
+next: ddl.html
+---
+
+To change data (perform an `INSERT`, `UPDATE`, or `DELETE`) you use the
+`executeUpdate()` method. This method is similar to the method `executeQuery()`
+used to issue a `SELECT` statement, but it doesn't return a `ResultSet`; instead
+it returns the number of rows affected by the `INSERT`, `UPDATE`, or `DELETE`
+statement. [Example 5.3, “Deleting Rows in JDBC”](update.html#delete-example)
+illustrates the usage.
+
+<a name="delete-example"></a>
+**Example 5.3. Deleting Rows in JDBC**
+
+This example will issue a simple `DELETE` statement and print out the number of
+rows deleted.
+
+`int foovalue = 500;`
+`PreparedStatement st = conn.prepareStatement("DELETE FROM mytable WHERE columnfoo = ?");`
+`st.setInt(1, foovalue);`
+`int rowsDeleted = st.executeUpdate();`
+`System.out.println(rowsDeleted + " rows deleted");`
+`st.close();`
\ No newline at end of file
diff --git a/docs/documentation/93/use.md b/docs/documentation/93/use.md
new file mode 100644
index 0000000..97f27f9
--- /dev/null
+++ b/docs/documentation/93/use.md
@@ -0,0 +1,32 @@
+---
+layout: default_docs
+title: Chapter 3. Initializing the Driver
+header: Chapter 3. Initializing the Driver
+resource: media
+previoustitle: Creating a Database
+previous: your-database.html
+nexttitle: Chapter 3. Loading the Driver
+next: load.html
+---
+
+**Table of Contents**
+
+
+* [Importing JDBC](use.html#import)
+* [Loading the Driver](load.html)
+* [Connecting to the Databas](connect.html)
+ * [Connection Parameters](connect.html#connection-parameters)
+
+This section describes how to load and initialize the JDBC driver in your programs.
+
+<a name="import"></a>
+# Importing JDBC
+
+Any source that uses JDBC needs to import the `java.sql` package, using:
+
+import java.sql.*;
+
+### Note
+
+You should not import the `org.postgresql` package unless you are not using standard
+PostgreSQL™ extensions to the JDBC API.
\ No newline at end of file
diff --git a/docs/documentation/93/your-database.md b/docs/documentation/93/your-database.md
new file mode 100644
index 0000000..e809e74
--- /dev/null
+++ b/docs/documentation/93/your-database.md
@@ -0,0 +1,20 @@
+---
+layout: default_docs
+title: Creating a Database
+header: Chapter 2. Setting up the JDBC Driver
+resource: media
+previoustitle: Preparing the Database Server for JDBC
+previous: prepare.html
+nexttitle: Chapter 3. Initializing the Driver
+next: use.html
+---
+
+When creating a database to be accessed via JDBC it is important to select an
+appropriate encoding for your data. Many other client interfaces do not care
+what data you send back and forth, and will allow you to do inappropriate things,
+but Java makes sure that your data is correctly encoded. Do not use a database
+that uses the `SQL_ASCII` encoding. This is not a real encoding and you will
+have problems the moment you store data in it that does not fit in the seven
+bit ASCII character set. If you do not know what your encoding will be or are
+otherwise unsure about what you will be storing the `UNICODE` encoding is a
+reasonable default to use.
\ No newline at end of file
diff --git a/docs/documentation/94/binary-data.md b/docs/documentation/94/binary-data.md
new file mode 100644
index 0000000..16470e1
--- /dev/null
+++ b/docs/documentation/94/binary-data.md
@@ -0,0 +1,179 @@
+---
+layout: default_docs
+title: Chapter 7. Storing Binary Data
+header: Chapter 7. Storing Binary Data
+resource: media
+previoustitle: Chapter 6. Calling Stored Functions
+previous: callproc.html
+nexttitle: Chapter 8. JDBC escapes
+next: escapes.html
+---
+
+PostgreSQL™ provides two distinct ways to store binary data. Binary data can be
+stored in a table using the data type BYTEA or by using the Large Object feature
+which stores the binary data in a separate table in a special format and refers
+to that table by storing a value of type OID in your table.
+
+In order to determine which method is appropriate you need to understand the
+limitations of each method. The BYTEA data type is not well suited for storing
+very large amounts of binary data. While a column of type BYTEA can hold up to
+1 GB of binary data, it would require a huge amount of memory to process such a
+large value. The Large Object method for storing binary data is better suited to
+storing very large values, but it has its own limitations. Specifically deleting
+a row that contains a Large Object reference does not delete the Large Object.
+Deleting the Large Object is a separate operation that needs to be performed.
+Large Objects also have some security issues since anyone connected to the
+database can view and/or modify any Large Object, even if they don't have
+permissions to view/update the row containing the Large Object reference.
+
+Version 7.2 was the first release of the JDBC driver that supports the BYTEA
+data type. The introduction of this functionality in 7.2 has introduced a change
+in behavior as compared to previous releases. Since 7.2, the methods `getBytes()`,
+`setBytes()`, `getBinaryStream()`, and `setBinaryStream()` operate on the BYTEA
+data type. In 7.1 and earlier, these methods operated on the OID data type
+associated with Large Objects. It is possible to revert the driver back to the
+old 7.1 behavior by setting the property `compatible` on the `Connection` object
+to the value `7.1`. More details on connection properties are available in the
+section called [“Connection Parameters”](connect.html#connection-parameters).
+
+To use the BYTEA data type you should simply use the `getBytes()`, `setBytes()`,
+`getBinaryStream()`, or `setBinaryStream()` methods.
+
+To use the Large Object functionality you can use either the `LargeObject` class
+provided by the PostgreSQL™ JDBC driver, or by using the `getBLOB()` and `setBLOB()`
+methods.
+
+### Important
+
+> You must access Large Objects within an SQL transaction block. You can start a
+transaction block by calling `setAutoCommit(false)`.
+
+[Example 7.1, “Processing Binary Data in JDBC”](binary-data.html#binary-data-example)
+contains some examples on how to process binary data using the PostgreSQL™ JDBC
+driver.
+
+<a name="binary-data-example"></a>
+***Example 7.1. Processing Binary Data in JDBC***
+
+For example, suppose you have a table containing the file names of images and you
+also want to store the image in a BYTEA column:
+
+`CREATE TABLE images (imgname text, img bytea);`
+
+To insert an image, you would use:
+
+`File file = new File("myimage.gif");`
+`FileInputStream fis = new FileInputStream(file);`
+`PreparedStatement ps = conn.prepareStatement("INSERT INTO images VALUES (?, ?)");`
+`ps.setString(1, file.getName());`
+`ps.setBinaryStream(2, fis, (int)file.length());`
+`ps.executeUpdate();`
+`ps.close();`
+`fis.close();`
+
+Here, `setBinaryStream()` transfers a set number of bytes from a stream into the
+column of type BYTEA. This also could have been done using the `setBytes()` method
+if the contents of the image was already in a `byte[]`.
+
+### Note
+
+> The length parameter to `setBinaryStream` must be correct. There is no way to
+indicate that the stream is of unknown length. If you are in this situation, you
+must read the stream yourself into temporary storage and determine the length.
+Now with the correct length you may send the data from temporary storage on to
+the driver.
+
+Retrieving an image is even easier. (We use `PreparedStatement` here, but the
+`Statement` class can equally be used.)
+
+`PreparedStatement ps = conn.prepareStatement("SELECT img FROM images WHERE imgname = ?");`
+`ps.setString(1, "myimage.gif");`
+`ResultSet rs = ps.executeQuery();`
+`while (rs.next())`
+`{`
+ `byte[] imgBytes = rs.getBytes(1);`
+ `// use the data in some way here`
+`}`
+`rs.close();`
+`ps.close();`
+
+Here the binary data was retrieved as an `byte[]`. You could have used a
+`InputStream` object instead.
+
+Alternatively you could be storing a very large file and want to use the
+`LargeObject` API to store the file:
+
+`CREATE TABLE imageslo (imgname text, imgoid oid);`
+
+To insert an image, you would use:
+
+
+`// All LargeObject API calls must be within a transaction block`
+`conn.setAutoCommit(false);``<br />
+
+`// Get the Large Object Manager to perform operations with`
+`LargeObjectManager lobj = conn.unwrap(org.postgresql.PGConnection.class).getLargeObjectAPI();`<br />
+
+`// Create a new large object`
+`long oid = lobj.createLO(LargeObjectManager.READ | LargeObjectManager.WRITE);`<br />
+
+`// Open the large object for writing`
+`LargeObject obj = lobj.open(oid, LargeObjectManager.WRITE);`<br />
+
+`// Now open the file`
+`File file = new File("myimage.gif");`
+`FileInputStream fis = new FileInputStream(file);`<br />
+
+`// Copy the data from the file to the large object`
+`byte buf[] = new byte[2048];`
+`int s, tl = 0;`
+`while ((s = fis.read(buf, 0, 2048)) > 0)`
+`{`
+ `obj.write(buf, 0, s);`
+ `tl += s;`
+`}`<br />
+
+`// Close the large object`
+`obj.close();`<br />
+
+`// Now insert the row into imageslo`
+`PreparedStatement ps = conn.prepareStatement("INSERT INTO imageslo VALUES (?, ?)");`
+`ps.setString(1, file.getName());`
+`ps.setLong(2, oid);`
+`ps.executeUpdate();`
+`ps.close();`
+`fis.close();`<br />
+
+`// Finally, commit the transaction.`
+`conn.commit();`
+
+Retrieving the image from the Large Object:
+
+`// All LargeObject API calls must be within a transaction block`
+`conn.setAutoCommit(false);`<br />
+
+`// Get the Large Object Manager to perform operations with`
+`LargeObjectManager lobj = conn.unwrap(org.postgresql.PGConnection.class).getLargeObjectAPI();`<br />
+
+`PreparedStatement ps = conn.prepareStatement("SELECT imgoid FROM imageslo WHERE imgname = ?");`
+`ps.setString(1, "myimage.gif");`
+`ResultSet rs = ps.executeQuery();`
+`while (rs.next())`
+`{`
+ `// Open the large object for reading`
+ `long oid = rs.getLong(1);`
+ `LargeObject obj = lobj.open(oid, LargeObjectManager.READ);`<br />
+
+ `// Read the data`
+ `byte buf[] = new byte[obj.size()];`
+ `obj.read(buf, 0, obj.size());`
+ `// Do something with the data read here`<br />
+
+ `// Close the object`
+ `obj.close();`
+`}`
+`rs.close();`
+`ps.close();`<br />
+
+`// Finally, commit the transaction.`
+`conn.commit();`
diff --git a/docs/documentation/94/callproc.md b/docs/documentation/94/callproc.md
new file mode 100644
index 0000000..bc16a35
--- /dev/null
+++ b/docs/documentation/94/callproc.md
@@ -0,0 +1,116 @@
+---
+layout: default_docs
+title: Chapter 6. Calling Stored Functions
+header: Chapter 6. Calling Stored Functions
+resource: media
+previoustitle: Creating and Modifying Database Objects
+previous: ddl.html
+nexttitle: Chapter 7. Storing Binary Data
+next: binary-data.html
+---
+
+**Table of Contents**
+
+* [Obtaining a `ResultSet` from a stored function](callproc.html#callproc-resultset)
+ * [From a Function Returning `SETOF` type](callproc.html#callproc-resultset-setof)
+ * [From a Function Returning a refcursor](callproc.html#callproc-resultset-refcursor)
+
+<a name="call-function-example"></a>
+**Example 6.1. Calling a built in stored function**
+
+This example shows how to call a PostgreSQL™ built in function, `upper`, which
+simply converts the supplied string argument to uppercase.
+
+`CallableStatement upperProc = conn.prepareCall("{ ? = call upper( ? ) }");`
+`upperProc.registerOutParameter(1, Types.VARCHAR);`
+`upperProc.setString(2, "lowercase to uppercase");`
+`upperProc.execute();`
+`String upperCased = upperProc.getString(1);`
+`upperProc.close();`
+
+<a name="callproc-resultset"></a>
+# Obtaining a `ResultSet` from a stored function
+
+PostgreSQL's™ stored functions can return results in two different ways. The
+function may return either a refcursor value or a `SETOF` some datatype. Depending
+on which of these return methods are used determines how the function should be
+called.
+
+<a name="callproc-resultset-setof"></a>
+## From a Function Returning `SETOF` type
+
+Functions that return data as a set should not be called via the `CallableStatement`
+interface, but instead should use the normal `Statement` or `PreparedStatement`
+interfaces.
+
+<a name="setof-resultset"></a>
+**Example 6.2. Getting `SETOF` type values from a function**
+
+`Statement stmt = conn.createStatement();`
+`stmt.execute("CREATE OR REPLACE FUNCTION setoffunc() RETURNS SETOF int AS "`
+ `+ "' SELECT 1 UNION SELECT 2;' LANGUAGE sql");`
+`ResultSet rs = stmt.executeQuery("SELECT * FROM setoffunc()");`
+`while (rs.next())`
+`{`
+ `// do something`
+`}`
+`rs.close();`
+`stmt.close();`
+
+<a name="callproc-resultset-refcursor"></a>
+## From a Function Returning a refcursor
+
+When calling a function that returns a refcursor you must cast the return type of
+`getObject` to a `ResultSet`
+
+### Note
+
+> One notable limitation of the current support for a `ResultSet` created from
+a refcursor is that even though it is a cursor backed `ResultSet`, all data will
+be retrieved and cached on the client. The `Statement` fetch size parameter
+described in the section called [“Getting results based on a cursor”](query.html#query-with-cursor)
+is ignored. This limitation is a deficiency of the JDBC driver, not the server,
+and it is technically possible to remove it, we just haven't found the time.
+
+<a name="get-refcursor-from-function-call"></a>
+**Example 6.3. Getting refcursor Value From a Function**
+
+`// Setup function to call.`
+`Statement stmt = conn.createStatement();`
+`stmt.execute("CREATE OR REPLACE FUNCTION refcursorfunc() RETURNS refcursor AS '"`
+ `+ " DECLARE "`
+ `+ " mycurs refcursor; "`
+ `+ " BEGIN "`
+ `+ " OPEN mycurs FOR SELECT 1 UNION SELECT 2; "`
+ `+ " RETURN mycurs; "`
+ `+ " END;' language plpgsql");`
+`stmt.close();`<br />
+
+`// We must be inside a transaction for cursors to work.`
+`conn.setAutoCommit(false);`<br />
+
+`// Procedure call.`
+`CallableStatement proc = conn.prepareCall("{ ? = call refcursorfunc() }");`
+`proc.registerOutParameter(1, Types.OTHER);`
+`proc.execute();`
+`ResultSet results = (ResultSet) proc.getObject(1);`
+`while (results.next())`
+`{`
+ `// do something with the results.`
+`}`
+`results.close();`
+`proc.close();`
+
+It is also possible to treat the refcursor return value as a cursor name directly.
+To do this, use the `getString` of `ResultSet`. With the underlying cursor name,
+you are free to directly use cursor commands on it, such as `FETCH` and `MOVE`.
+
+<a name="refcursor-string-example"></a>
+**Example 6.4. Treating refcursor as a cursor name**
+
+`conn.setAutoCommit(false);`
+`CallableStatement proc = conn.prepareCall("{ ? = call refcursorfunc() }");`
+`proc.registerOutParameter(1, Types.OTHER);`
+`proc.execute();`
+`String cursorName = proc.getString(1);`
+`proc.close();`
\ No newline at end of file
diff --git a/docs/documentation/94/classpath.md b/docs/documentation/94/classpath.md
new file mode 100644
index 0000000..e4d0c50
--- /dev/null
+++ b/docs/documentation/94/classpath.md
@@ -0,0 +1,26 @@
+---
+layout: default_docs
+title: Setting up the Class Path
+header: Chapter 2. Setting up the JDBC Driver
+resource: media
+previoustitle: Chapter 2. Setting up the JDBC Driver
+previous: setup.html
+nexttitle: Preparing the Database Server for JDBC
+next: prepare.html
+---
+
+To use the driver, the JAR archive named `postgresql.jar` if you built from source,
+otherwise it will likely be (named with the following convention: `postgresql-*[server version]*.*[build number]*.jdbc*[JDBC version]*.jar`,
+for example `postgresql-8.0-310.jdbc3.jar`) needs to be included in the class path,
+either by putting it in the `CLASSPATH` environment variable, or by using flags on
+the **java** command line.
+
+For instance, assume we have an application that uses the JDBC driver to access
+a database, and that application is installed as `/usr/local/lib/myapp.jar`. The
+PostgreSQL™ JDBC driver installed as `/usr/local/pgsql/share/java/postgresql.jar`.
+To run the application, we would use:
+
+*export CLASSPATH=/usr/local/lib/myapp.jar:/usr/local/pgsql/share/java/postgresql.jar:*.
+*java MyApp*
+
+Loading the driver from within the application is covered in [Chapter 3, Initializing the Driver](use.html).
\ No newline at end of file
diff --git a/docs/documentation/94/connect.md b/docs/documentation/94/connect.md
new file mode 100644
index 0000000..15adad8
--- /dev/null
+++ b/docs/documentation/94/connect.md
@@ -0,0 +1,395 @@
+---
+layout: default_docs
+title: Connecting to the Database
+header: Chapter 3. Initializing the Driver
+resource: media
+previoustitle: Loading the Driver
+previous: load.html
+nexttitle: Chapter 4. Using SSL
+next: ssl.html
+---
+
+With JDBC, a database is represented by a URL (Uniform Resource Locator). With
+PostgreSQL™, this takes one of the following forms:
+
+* jdbc:postgresql:*`database`*
+* jdbc:postgresql:/
+* jdbc:postgresql://*`host/database`*
+* jdbc:postgresql://*`host/`*
+* jdbc:postgresql://*`host:port/database`*
+* jdbc:postgresql://*`host:port/`*
+
+The parameters have the following meanings:
+
+* *`host`*
+
+ The host name of the server. Defaults to `localhost`. To specify an IPv6
+ address your must enclose the `host` parameter with square brackets, for
+ example:
+
+ jdbc:postgresql://[::1]:5740/accounting
+
+* *`port`*
+
+ The port number the server is listening on. Defaults to the PostgreSQL™
+ standard port number (5432).
+
+* *`database`*
+
+ The database name. The default is to connect to a database with the same name
+ as the user name.
+
+To connect, you need to get a `Connection` instance from JDBC. To do this, you use
+the `DriverManager.getConnection()` method:
+
+`Connection db = DriverManager.getConnection(url, username, password)`;
+
+<a name="connection-parameters"></a>
+## Connection Parameters
+
+In addition to the standard connection parameters the driver supports a number
+of additional properties which can be used to specify additional driver behaviour
+specific to PostgreSQL™. These properties may be specified in either the connection
+URL or an additional `Properties` object parameter to `DriverManager.getConnection`.
+The following examples illustrate the use of both methods to establish a SSL
+connection.
+
+`String url = "jdbc:postgresql://localhost/test";`
+`Properties props = new Properties();`
+`props.setProperty("user","fred");`
+`props.setProperty("password","secret");`
+`props.setProperty("ssl","true");`
+`Connection conn = DriverManager.getConnection(url, props);`
+
+`String url = "jdbc:postgresql://localhost/test?user=fred&password=secret&ssl=true";`
+`Connection conn = DriverManager.getConnection(url);`
+
+* `user = String`
+
+ The database user on whose behalf the connection is being made.
+
+* `password = String`
+
+ The database user's password.
+
+* `ssl`
+
+ Connect using SSL. The driver must have been compiled with SSL support.
+ This property does not need a value associated with it. The mere presence
+ of it specifies a SSL connection. However, for compatibility with future
+ versions, the value "true" is preferred. For more information see [Chapter
+ 4, *Using SSL*](ssl.html).
+
+* `sslfactory = String`
+
+ The provided value is a class name to use as the `SSLSocketFactory` when
+ establishing a SSL connection. For more information see the section
+ called [“Custom SSLSocketFactory”](ssl-factory.html).
+
+* `sslfactoryarg = String`
+
+ This value is an optional argument to the constructor of the sslfactory
+ class provided above. For more information see the section called [“Custom SSLSocketFactory”](ssl-factory.html).
+
+* `socketFactory = String`
+ Specify a socket factory for socket creation.
+
+* `socketFactoryArg = String`
+ Argument forwarded to constructor of SocketFactory class
+
+* `compatible = String`
+
+ Act like an older version of the driver to retain compatibility with older
+ applications. At the moment this controls two driver behaviours: the
+ handling of binary data fields, and the handling of parameters set via
+ `setString()`.
+
+ Older versions of the driver used this property to also control the
+ protocol used to connect to the backend. This is now controlled by the
+ `protocolVersion` property.
+
+ Information on binary data handling is detailed in [Chapter 7, Storing Binary Data](binary-data.html).
+ To force the use of Large Objects set the compatible property to 7.1.
+
+ When `compatible` is set to 7.4 or below, the default for the `stringtype`
+ parameter is changed to `unspecified`.
+
+* `sendBufferSize = int`
+
+ Sets SO_SNDBUF on the connection stream
+
+* `recvBufferSize = int`
+
+ Sets SO_RCVBUF on the connection stream
+
+* `receiveBufferSize = int`
+
+ Sets SO_RCVBUF on the connection stream
+
+* `protocolVersion = String`
+
+ The driver supports both the V2 and V3 frontend/backend protocols. The
+ V3 protocol was introduced in 7.4 and the driver will by default try to
+ connect using the V3 protocol, if that fails it will fall back to the V2
+ protocol. If the protocolVersion property is specified, the driver will
+ try only the specified protocol (which should be either "2" or "3").
+ Setting protocolVersion to "2" may be used to avoid the failed attempt
+ to use the V3 protocol when connecting to a version 7.3 or earlier server,
+ or to force the driver to use the V2 protocol despite connecting to a 7.4
+ or greater server.
+
+* `loglevel = int`
+
+ Set the amount of logging information printed to the DriverManager's
+ current value for LogStream or LogWriter. It currently supports values
+ of `org.postgresql.Driver.DEBUG` (2) and `org.postgresql.Driver.INFO` (1).
+ `INFO` will log very little information while `DEBUG` will produce significant
+ detail. This property is only really useful if you are a developer or
+ are having problems with the driver.
+
+* `charSet = String`
+
+ The character set to use for data sent to the database or received from
+ the database. This property is only relevant for server versions less
+ than or equal to 7.2. The 7.3 release was the first with multibyte support
+ compiled by default and the driver uses its character set translation
+ facilities instead of trying to do it itself.
+
+* `allowEncodingChanges = boolean`
+
+ When using the V3 protocol the driver monitors changes in certain server
+ configuration parameters that should not be touched by end users. The
+ `client_encoding` setting is set by the driver and should not be altered.
+ If the driver detects a change it will abort the connection. There is
+ one legitimate exception to this behaviour though, using the `COPY` command
+ on a file residing on the server's filesystem. The only means of specifying
+ the encoding of this file is by altering the `client_encoding` setting.
+ The JDBC team considers this a failing of the `COPY` command and hopes to
+ provide an alternate means of specifying the encoding in the future, but
+ for now there is this URL parameter. Enable this only if you need to
+ override the client encoding when doing a copy.
+
+* `logUnclosedConnections = boolean`
+
+ Clients may leak `Connection` objects by failing to call its `close()`
+ method. Eventually these objects will be garbage collected and the
+ `finalize()` method will be called which will close the `Connection` if
+ caller has neglected to do this himself. The usage of a finalizer is just
+ a stopgap solution. To help developers detect and correct the source of
+ these leaks the `logUnclosedConnections` URL parameter has been added.
+ It captures a stacktrace at each `Connection` opening and if the `finalize()`
+ method is reached without having been closed the stacktrace is printed
+ to the log.
+
+* `binaryTransferEnable = String`
+
+ A comma separated list of types to enable binary transfer. Either OID numbers or names.
+
+* `binaryTransferDisable = String`
+
+ A comma separated list of types to disable binary transfer. Either OID numbers or names.
+ Overrides values in the driver default set and values set with binaryTransferEnable.
+
+* `prepareThreshold = int`
+
+ Determine the number of `PreparedStatement` executions required before
+ switching over to use server side prepared statements. The default is
+ five, meaning start using server side prepared statements on the fifth
+ execution of the same `PreparedStatement` object. More information on
+ server side prepared statements is available in the section called
+ [“Server Prepared Statements”](server-prepare.html).
+
+* `preparedStatementCacheQueries = int`
+
+ Determine the number of queries that are cached in each connection.
+ The default is 256, meaning if you use more than 256 different queries
+ in prepareStatement() calls, the least recently used ones
+ will be discarded. The cache allows application to benefit from
+ [“Server Prepared Statements”](server-prepare.html)
+ prepareThreshold even if the prepared statement is
+ closed after each execution. The value of 0 disables the cache.
+
+ Each connection has its own statement cache.
+
+* `preparedStatementCacheSizeMiB = int`
+
+ Determine the maximum size (in mebibytes) of the prepared queries cache
+ (see preparedStatementCacheQueries).
+ The default is 5, meaning if you happen to cache more than 5 MiB of queries
+ the least recently used ones will be discarded.
+ The main aim of this setting is to prevent `OutOfMemoryError`.
+ The value of 0 disables the cache.
+ If a query would consume more than a half of `preparedStatementCacheSizeMiB`,
+ then it is discarded immediately.
+
+* `defaultRowFetchSize = int`
+
+ Determine the number of rows fetched in `ResultSet`
+ by one fetch with trip to the database. Limiting the number of rows are fetch with
+ each trip to the database allow avoids unnecessary memory consumption
+ and as a consequence `OutOfMemoryException`
+ The default is zero, meaning that in `ResultSet`
+ will be fetch all rows at once. Negative number is not available.
+
+* `reWriteBatchedInserts = bool`
+ Enable optimization to rewrite and collapse compatible INSERT statements that are batched.
+ If enabled, pgjdbc rewrites batch of `insert into ... values(?, ?)` into `insert into ... values(?, ?), (?, ?), ...`
+ That reduces per-statement overhead. The drawback is if one of the statements fail, the whole batch fails.
+ The default value is `false`. The option is avaliable since 9.4.1208
+
+* `loginTimeout = int`
+
+ Specify how long to wait for establishment of a database connection. The
+ timeout is specified in seconds.
+
+* `connectTimeout = int`
+
+ The timeout value used for socket connect operations. If connecting to the server
+ takes longer than this value, the connection is broken.
+ The timeout is specified in seconds and a value of zero means that it is disabled.
+ The default value is 0 (unlimited) up to 9.4.1208, and 10 seconds since 9.4.1209
+
+* `cancelSignalTimeout = int` (since 9.4.1209)
+ Cancel command is sent out of band over its own connection, so cancel message can itself get stuck.
+ This property controls "connect timeout" and "socket timeout" used for cancel commands.
+ The timeout is specified in seconds. Default value is 10 seconds.
+
+* `socketTimeout = int`
+
+ The timeout value used for socket read operations. If reading from the
+ server takes longer than this value, the connection is closed. This can
+ be used as both a brute force global query timeout and a method of
+ detecting network problems. The timeout is specified in seconds and a
+ value of zero means that it is disabled.
+
+* `tcpKeepAlive = boolean`
+
+ Enable or disable TCP keep-alive probe. The default is `false`.
+
+* `unknownLength = int`
+
+ Certain postgresql types such as `TEXT` do not have a well defined length.
+ When returning meta-data about these types through functions like
+ `ResultSetMetaData.getColumnDisplaySize` and `ResultSetMetaData.getPrecision`
+ we must provide a value and various client tools have different ideas
+ about what they would like to see. This parameter specifies the length
+ to return for types of unknown length.
+
+* `stringtype = String`
+
+ Specify the type to use when binding `PreparedStatement` parameters set
+ via `setString()`. If `stringtype` is set to `VARCHAR` (the default), such
+ parameters will be sent to the server as varchar parameters. If `stringtype`
+ is set to `unspecified`, parameters will be sent to the server as untyped
+ values, and the server will attempt to infer an appropriate type. This
+ is useful if you have an existing application that uses `setString()` to
+ set parameters that are actually some other type, such as integers, and
+ you are unable to change the application to use an appropriate method
+ such as `setInt()`.
+
+* `kerberosServerName = String`
+
+ The Kerberos service name to use when authenticating with GSSAPI. This
+ is equivalent to libpq's PGKRBSRVNAME environment variable and defaults
+ to "postgres".
+
+* `jaasApplicationName = String`
+
+ Specifies the name of the JAAS system or application login configuration.
+
+* `ApplicationName = String`
+
+ Specifies the name of the application that is using the connection.
+ This allows a database administrator to see what applications are
+ connected to the server and what resources they are using through views like pg_stat_activity.
+
+* `gsslib = String`
+
+ Force either SSPI (Windows transparent single-sign-on) or GSSAPI (Kerberos, via JSSE)
+ to be used when the server requests Kerberos or SSPI authentication.
+ Permissible values are auto (default, see below), sspi (force SSPI) or gssapi (force GSSAPI-JSSE).
+
+ If this parameter is auto, SSPI is attempted if the server requests SSPI authentication,
+ the JDBC client is running on Windows, and the Waffle libraries required
+ for SSPI are on the CLASSPATH. Otherwise Kerberos/GSSAPI via JSSE is used.
+ Note that this behaviour does not exactly match that of libpq, which uses
+ Windows' SSPI libraries for Kerberos (GSSAPI) requests by default when on Windows.
+
+ gssapi mode forces JSSE's GSSAPI to be used even if SSPI is available, matching the pre-9.4 behaviour.
+
+ On non-Windows platforms or where SSPI is unavailable, forcing sspi mode will fail with a PSQLException.
+
+ Since: 9.4
+
+* `sspiServiceClass = String`
+
+ Specifies the name of the Windows SSPI service class that forms the service
+ class part of the SPN. The default, POSTGRES, is almost always correct.
+
+ See: SSPI authentication (Pg docs) Service Principal Names (MSDN), DsMakeSpn (MSDN) Configuring SSPI (Pg wiki).
+
+ This parameter is ignored on non-Windows platforms.
+
+* `useSpnego = boolean`
+
+ Use SPNEGO in SSPI authentication requests
+
+* `readOnly = boolean`
+
+ Put the connection in read-only mode
+
+* `disableColumnSanitiser = boolean`
+
+ Enable optimization that disables column name sanitiser.
+
+* `assumeMinServerVersion = String`
+
+ Assume that the server is at least the given version,
+ thus enabling to some optimization at connection time instead of trying to be version blind.
+
+* `currentSchema = String`
+
+ Specify the schema to be set in the search-path.
+ This schema will be used to resolve unqualified object names used in statements over this connection.
+
+* `targetServerType`
+
+ Allows opening connections to only servers with required state,
+ the allowed values are any, master, slave and preferSlave.
+ The master/slave distinction is currently done by observing if the server allows writes.
+ The value preferSlave tries to connect to slaves if any are available,
+ otherwise allows falls back to connecting also to master.
+
+* `hostRecheckSeconds = int`
+
+ Controls how long in seconds the knowledge about a host state
+ is cached in JVM wide global cache. The default value is 10 seconds.
+
+* `loadBalanceHosts = boolean`
+
+ In default mode (disabled) hosts are connected in the given order.
+ If enabled hosts are chosen randomly from the set of suitable candidates.
+
+ <a name="connection-failover"></a>
+ ## Connection Fail-over
+
+ To support simple connection fail-over it is possible to define multiple endpoints
+ (host and port pairs) in the connection url separated by commas.
+ The driver will try to once connect to each of them in order until the connection succeeds.
+ If none succeed, a normal connection exception is thrown.
+
+ The syntax for the connection url is:
+
+ jdbc:postgresql://host1:port1,host2:port2/database
+
+ The simple connection fail-over is useful when running against a high availability
+ postgres installation that has identical data on each node.
+ For example streaming replication postgres or postgres-xc cluster.
+
+ For example an application can create two connection pools.
+ One data source is for writes, another for reads. The write pool limits connections only to master node:
+
+ jdbc:postgresql://node1,node2,node3/accounting?targetServerType=master
+ . And read pool balances connections between slaves nodes, but allows connections also to master if no slaves are available:
+
+ jdbc:postgresql://node1,node2,node3/accounting?targetServerType=preferSlave&loadBalanceHosts=true
diff --git a/docs/documentation/94/datasource.md b/docs/documentation/94/datasource.md
new file mode 100644
index 0000000..c67b1c4
--- /dev/null
+++ b/docs/documentation/94/datasource.md
@@ -0,0 +1,44 @@
+---
+layout: default_docs
+title: Chapter 11. Connection Pools and Data Sources
+header: Chapter 11. Connection Pools and Data Sources
+resource: media
+previoustitle: Chapter 10. Using the Driver in a Multithreaded or a Servlet Environment
+previous: thread.html
+nexttitle: Application Servers ConnectionPoolDataSource
+next: ds-cpds.html
+---
+
+**Table of Contents**
+
+* [Overview](datasource.html#ds-intro)
+* [Application Servers: `ConnectionPoolDataSource`](ds-cpds.html)
+* [Applications: `DataSource`](ds-ds.html)
+* [Tomcat setup](tomcat.html)
+* [Data Sources and JNDI](jndi.html)
+
+JDBC 2 introduced standard connection pooling features in an add-on API known as
+the JDBC 2.0 Optional Package (also known as the JDBC 2.0 Standard Extension).
+These features have since been included in the core JDBC 3 API.
+
+<a name="ds-intro"></a>
+# Overview
+
+The JDBC API provides a client and a server interface for connection pooling.
+The client interface is `javax.sql.DataSource`, which is what application code
+will typically use to acquire a pooled database connection. The server interface
+is `javax.sql.ConnectionPoolDataSource`, which is how most application servers
+will interface with the PostgreSQL™ JDBC driver.
+
+In an application server environment, the application server configuration will
+typically refer to the PostgreSQL™ `ConnectionPoolDataSource` implementation,
+while the application component code will typically acquire a `DataSource`
+implementation provided by the application server (not by PostgreSQL™).
+
+For an environment without an application server, PostgreSQL™ provides two
+implementations of `DataSource` which an application can use directly. One
+implementation performs connection pooling, while the other simply provides
+access to database connections through the `DataSource` interface without any
+pooling. Again, these implementations should not be used in an application server
+environment unless the application server does not support the `ConnectionPoolDataSource`
+interface.
\ No newline at end of file
diff --git a/docs/documentation/94/ddl.md b/docs/documentation/94/ddl.md
new file mode 100644
index 0000000..a6cadad
--- /dev/null
+++ b/docs/documentation/94/ddl.md
@@ -0,0 +1,24 @@
+---
+layout: default_docs
+title: Creating and Modifying Database Objects
+header: Chapter 5. Issuing a Query and Processing the Result
+resource: media
+previoustitle: Performing Updates
+previous: update.html
+nexttitle: Chapter 6. Calling Stored Functions
+next: callproc.html
+---
+
+To create, modify or drop a database object like a table or view you use the
+`execute()` method. This method is similar to the method `executeQuery()`, but
+it doesn't return a result. [Example 5.4, “Dropping a Table in JDBC](ddl.html#drop-table-example)
+illustrates the usage.
+
+<a name="drop-table-example"></a>
+**Example 5.4. Dropping a Table in JDBC**
+
+This example will drop a table.
+
+`Statement st = conn.createStatement();`
+`st.execute("DROP TABLE mytable");`
+`st.close();`
\ No newline at end of file
diff --git a/docs/documentation/94/ds-cpds.md b/docs/documentation/94/ds-cpds.md
new file mode 100644
index 0000000..c066e4a
--- /dev/null
+++ b/docs/documentation/94/ds-cpds.md
@@ -0,0 +1,93 @@
+---
+layout: default_docs
+title: Application Servers ConnectionPoolDataSource
+header: Chapter 11. Connection Pools and Data Sources
+resource: media
+previoustitle: Chapter 11. Connection Pools and Data Sources
+previous: datasource.html
+nexttitle: Applications DataSource
+next: ds-ds.html
+---
+
+PostgreSQL™ includes one implementation of `ConnectionPoolDataSource` named
+`org.postgresql.ds.PGConnectionPoolDataSource`.
+
+JDBC requires that a `ConnectionPoolDataSource` be configured via JavaBean
+properties, shown in [Table 11.1, “`ConnectionPoolDataSource` Configuration Properties”](ds-cpds.html#ds-cpds-props),
+so there are get and set methods for each of these properties.
+
+<a name="ds-cpds-props"></a>
+**Table 11.1. `ConnectionPoolDataSource` Configuration Properties**
+
+<table summary="ConnectionPoolDataSource Configuration Properties"
+ border="1">
+ <tr>
+ <th>Property</th>
+ <th>Type</th>
+ <th>Description</th>
+ </tr>
+ <tbody>
+ <tr>
+ <td>serverName</td>
+ <td>STRING</td>
+ <td>PostgreSQL™ database server
+host name</td>
+ </tr>
+ <tr>
+ <td>databaseName</td>
+ <td>STRING</td>
+ <td>PostgreSQL™ database name</td>
+ </tr>
+ <tr>
+ <td>portNumber</td>
+ <td>INT</td>
+ <td> TCP port which the PostgreSQL™
+
+database server is listening on (or 0 to use the default port) </td>
+ </tr>
+ <tr>
+ <td>user</td>
+ <td>STRING</td>
+ <td>User used to make database connections</td>
+ </tr>
+ <tr>
+ <td>password</td>
+ <td>STRING</td>
+ <td>Password used to make database connections</td>
+ </tr>
+ <tr>
+ <td>ssl</td>
+ <td>BOOLEAN</td>
+ <td> If `true`, use SSL encrypted
+connections (default `false`) </td>
+ </tr>
+ <tr>
+ <td>sslfactory</td>
+ <td>STRING</td>
+ <td> Custom `javax.net.ssl.SSLSocketFactory`
+class name (see the section called [“Custom
+SSLSocketFactory”](ssl-factory.html)) </td>
+ </tr>
+ <tr>
+ <td>defaultAutoCommit</td>
+ <td>BOOLEAN</td>
+ <td> Whether connections should have autocommit enabled or
+disabled when they are supplied to the caller. The default is `false`, to disable autocommit. </td>
+ </tr>
+ </tbody>
+</table>
+
+Many application servers use a properties-style syntax to configure these
+properties, so it would not be unusual to enter properties as a block of text.
+If the application server provides a single area to enter all the properties,
+they might be listed like this:
+
+`serverName=localhost`
+`databaseName=test`
+`user=testuser`
+`password=testpassword`
+
+Or, if semicolons are used as separators instead of newlines, it could look like
+this:
+
+`serverName=localhost;databaseName=test;user=testuser;password=testpassword`
\ No newline at end of file
diff --git a/docs/documentation/94/ds-ds.md b/docs/documentation/94/ds-ds.md
new file mode 100644
index 0000000..2f6d59b
--- /dev/null
+++ b/docs/documentation/94/ds-ds.md
@@ -0,0 +1,178 @@
+---
+layout: default_docs
+title: Applications DataSource
+header: Chapter 11. Connection Pools and Data Sources
+resource: media
+previoustitle: Application Servers ConnectionPoolDataSource
+previous: ds-cpds.html
+nexttitle: Tomcat setup
+next: tomcat.html
+---
+
+PostgreSQL™ includes two implementations of `DataSource`, as shown in [Table 11.2, “`DataSource` Implementations”](ds-ds.html#ds-ds-imp).
+One that does pooling and the other that does not. The pooling implementation
+does not actually close connections when the client calls the `close` method,
+but instead returns the connections to a pool of available connections for other
+clients to use. This avoids any overhead of repeatedly opening and closing
+connections, and allows a large number of clients to share a small number of
+database connections.
+
+The pooling data-source implementation provided here is not the most feature-rich
+in the world. Among other things, connections are never closed until the pool
+itself is closed; there is no way to shrink the pool. As well, connections
+requested for users other than the default configured user are not pooled. Its
+error handling sometimes cannot remove a broken connection from the pool. In
+general it is not recommended to use the PostgreSQL™ provided connection pool.
+Check your application server or check out the excellent [jakarta commons DBCP](http://jakarta.apache.org/commons/dbcp/)
+project.
+
+<a name="ds-ds-imp"></a>
+**Table 11.2. `DataSource` Implementations**
+
+<table summary="DataSource Implementations" border="1">
+ <tr>
+ <th>Pooling</th>
+ <th>Implementation Class</th>
+ </tr>
+ <tbody>
+ <tr>
+ <td>No</td>
+ <td>`org.postgresql.ds.PGSimpleDataSource</td>
+ </tr>
+ <tr>
+ <td>Yes</td>
+ <td>`org.postgresql.ds.PGPoolingDataSource</td>
+ </tr>
+ </tbody>
+</table>
+
+Both implementations use the same configuration scheme. JDBC requires that a
+`DataSource` be configured via JavaBean properties, shown in [Table 11.3, “`DataSource` Configuration Properties”](ds-ds.html#ds-ds-props),
+so there are get and set methods for each of these properties.
+
+<a name="ds-ds-props"></a>
+**Table 11.3. `DataSource` Configuration Properties**
+
+<table summary="DataSource Configuration Properties" border="1">
+ <tr>
+ <th>Property</th>
+ <th>Type</th>
+ <th>Description</th>
+ </tr>
+ <tbody>
+ <tr>
+ <td>serverName</td>
+ <td>STRING</td>
+ <td>PostgreSQL™ database server host name</td>
+ </tr>
+ <tr>
+ <td>databaseName</td>
+ <td>STRING</td>
+ <td>PostgreSQL™ database name</td>
+ </tr>
+ <tr>
+ <td>portNumber</td>
+ <td>INT</td>
+ <td>TCP port which the PostgreSQL™
+database server is listening on (or 0 to use the default port)</td>
+ </tr>
+ <tr>
+ <td>user</td>
+ <td>STRING</td>
+ <td>User used to make database connections</td>
+ </tr>
+ <tr>
+ <td>password</td>
+ <td>STRING</td>
+ <td>Password used to make database connections</td>
+ </tr>
+ <tr>
+ <td>ssl</td>
+ <td>BOOLEAN</td>
+ <td> If true, use SSL encrypted
+connections (default false) </td>
+ </tr>
+ <tr>
+ <td>sslfactory</td>
+ <td>STRING</td>
+ <td> Custom javax.net.ssl.SSLSocketFactory
+class name (see the section called [“Custom
+SSLSocketFactory”](ssl-factory.html))</td>
+ </tr>
+ </tbody>
+</table>
+
+The pooling implementation requires some additional configuration properties,
+which are shown in [Table 11.4, “Additional Pooling `DataSource` Configuration Properties](ds-ds.html#ds-ds-xprops).
+
+<a name="ds-ds-xprops"></a>
+**Table 11.4. Additional Pooling `DataSource` Configuration Properties**
+
+<table summary="Additional Pooling DataSource Configuration Properties" border="1">
+ <tr>
+ <th>Property</th>
+ <th>Type</th>
+ <th>Description</th>
+ </tr>
+ <tbody>
+ <tr>
+ <td>dataSourceName</td>
+ <td>STRING</td>
+ <td>Every pooling DataSource must
+have a unique name.</td>
+ </tr>
+ <tr>
+ <td>initialConnections</td>
+ <td>INT</td>
+ <td>The number of database connections to be created when the
+pool is initialized.</td>
+ </tr>
+ <tr>
+ <td>maxConnections</td>
+ <td>INT</td>
+ <td>The maximum number of open database connections to allow.
+When more connections are requested, the caller will hang until a
+connection is returned to the pool.</td>
+ </tr>
+ </tbody>
+</table>
+
+[Example 11.1, “`DataSource` Code Example”](ds-ds.html#ds-example) shows an example
+of typical application code using a pooling `DataSource`.
+
+<a name="ds-example"></a>
+**Example 11.1. `DataSource` Code Example**
+
+Code to initialize a pooling `DataSource` might look like this:
+
+`PGPoolingDataSource source = new PGPoolingDataSource();`
+`source.setDataSourceName("A Data Source");`
+`source.setServerName("localhost");`
+`source.setDatabaseName("test");`
+`source.setUser("testuser");`
+`source.setPassword("testpassword");`
+`source.setMaxConnections(10);`
+
+Then code to use a connection from the pool might look like this. Note that it
+is critical that the connections are eventually closed. Else the pool will
+“leak” connections and will eventually lock all the clients out.
+
+<pre><code>
+Connection conn = null;
+try
+{
+ conn = source.getConnection();
+ // use connection
+}
+catch (SQLException e)
+{
+ // log error
+}
+finally
+{
+ if (con != null)
+ {
+ try { conn.close(); } catch (SQLException e) {}
+ }
+}
+</code></pre>
\ No newline at end of file
diff --git a/docs/documentation/94/escaped-functions.md b/docs/documentation/94/escaped-functions.md
new file mode 100644
index 0000000..f734b28
--- /dev/null
+++ b/docs/documentation/94/escaped-functions.md
@@ -0,0 +1,480 @@
+---
+layout: default_docs
+title: Escaped scalar functions
+header: Chapter 8. JDBC escapes
+resource: media
+previoustitle: Date-time escapes
+previous: escapes-datetime.html
+nexttitle: Chapter 9. PostgreSQL™ Extensions to the JDBC API
+next: ext.html
+---
+
+The JDBC specification defines functions with an escape call syntax : `{fn function_name(arguments)}`.
+The following tables show which functions are supported by the PostgresSQL™ driver.
+The driver supports the nesting and the mixing of escaped functions and escaped
+values. The appendix C of the JDBC specification describes the functions.
+
+Some functions in the following tables are translated but not reported as supported
+because they are duplicating or changing ther order of the arguments. While this
+is harmless for literal values or columns, it will cause problems when using
+prepared statements. For example "`{fn right(?,?)}`" will be translated to "`substring(? from (length(?)+1-?))`".
+As you can see the translated SQL requires more parameters than before the
+translation but the driver will not automatically handle this.
+
+<a name="escape-numeric-functions-table"></a>
+**Table 8.1. Supported escaped numeric functions**
+
+<table summary="Supported escaped numeric functions" border="1">
+ <tr>
+ <th>function</th>
+ <th>reported as supported</th>
+ <th>translation</th>
+ <th>comments</th>
+ </tr>
+ <tbody>
+ <tr>
+ <td>abs(arg1)</td>
+ <td>yes</td>
+ <td>abs(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>acos(arg1)</td>
+ <td>yes</td>
+ <td>acos(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>asin(arg1)</td>
+ <td>yes</td>
+ <td>asin(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>atan(arg1)</td>
+ <td>yes</td>
+ <td>atan(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>atan2(arg1,arg2)</td>
+ <td>yes</td>
+ <td>atan2(arg1,arg2)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>ceiling(arg1)</td>
+ <td>yes</td>
+ <td>ceil(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>cos(arg1)</td>
+ <td>yes</td>
+ <td>cos(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>cot(arg1)</td>
+ <td>yes</td>
+ <td>cot(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>degrees(arg1)</td>
+ <td>yes</td>
+ <td>degrees(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>exp(arg1)</td>
+ <td>yes</td>
+ <td>exp(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>floor(arg1)</td>
+ <td>yes</td>
+ <td>floor(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>log(arg1)</td>
+ <td>yes</td>
+ <td>ln(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>log10(arg1)</td>
+ <td>yes</td>
+ <td>log(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>mod(arg1,arg2)</td>
+ <td>yes</td>
+ <td>mod(arg1,arg2)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>pi(arg1)</td>
+ <td>yes</td>
+ <td>pi(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>power(arg1,arg2)</td>
+ <td>yes</td>
+ <td>pow(arg1,arg2)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>radians(arg1)</td>
+ <td>yes</td>
+ <td>radians(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>rand()</td>
+ <td>yes</td>
+ <td>random()</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>rand(arg1)</td>
+ <td>yes</td>
+ <td>setseed(arg1)*0+random()</td>
+ <td>The seed is initialized with the given argument and a new randow value is returned.</td>
+ </tr>
+ <tr>
+ <td>round(arg1,arg2)</td>
+ <td>yes</td>
+ <td>round(arg1,arg2)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>sign(arg1)</td>
+ <td>yes</td>
+ <td>sign(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>sin(arg1)</td>
+ <td>yes</td>
+ <td>sin(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>sqrt(arg1)</td>
+ <td>yes</td>
+ <td>sqrt(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>tan(arg1)</td>
+ <td>yes</td>
+ <td>tan(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>truncate(arg1,arg2)</td>
+ <td>yes</td>
+ <td>trunc(arg1,arg2)</td>
+ <td> </td>
+ </tr>
+ </tbody>
+</table>
+
+<a name="escape-string-functions-table"></a>
+**Table 8.2. Supported escaped string functions**
+
+<table summary="Supported escaped string functions" border="1">
+ <tr>
+ <th>function</th>
+ <th>reported as supported</th>
+ <th>translation</th>
+ <th>comments</th>
+ </tr>
+ <tbody>
+ <tr>
+ <td>ascii(arg1)</td>
+ <td>yes</td>
+ <td>ascii(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>char(arg1)</td>
+ <td>yes</td>
+ <td>chr(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>concat(arg1,arg2...)</td>
+ <td>yes</td>
+ <td>(arg1||arg2...)</td>
+ <td>The JDBC specification
+only require the two arguments version, but supporting more arguments
+was so easy...</td>
+ </tr>
+ <tr>
+ <td>insert(arg1,arg2,arg3,arg4)</td>
+ <td>no</td>
+ <td>overlay(arg1 placing arg4 from arg2 for arg3)</td>
+ <td>This function is not reported as supported since it changes
+the order of the arguments which can be a problem (for prepared
+statements by example).</td>
+ </tr>
+ <tr>
+ <td>lcase(arg1)</td>
+ <td>yes</td>
+ <td>lower(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>left(arg1,arg2)</td>
+ <td>yes</td>
+ <td>substring(arg1 for arg2)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>length(arg1)</td>
+ <td>yes</td>
+ <td>length(trim(trailing from arg1))</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>locate(arg1,arg2)</td>
+ <td>no</td>
+ <td>position(arg1 in arg2)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>locate(arg1,arg2,arg3)</td>
+ <td>no</td>
+ <td>(arg2*sign(position(arg1 in substring(arg2 from
+arg3)+position(arg1 in substring(arg2 from arg3))</td>
+ <td>Not reported as supported since the three arguments version
+duplicate and change the order of the arguments.</td>
+ </tr>
+ <tr>
+ <td>ltrim(arg1)</td>
+ <td>yes</td>
+ <td>trim(leading from arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>repeat(arg1,arg2)</td>
+ <td>yes</td>
+ <td>repeat(arg1,arg2)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>replace(arg1,arg2,arg3)</td>
+ <td>yes</td>
+ <td>replace(arg1,arg2,arg3)</td>
+ <td>Only reported as supported by 7.3 and above servers.</td>
+ </tr>
+ <tr>
+ <td>right(arg1,arg2)</td>
+ <td>no</td>
+ <td>substring(arg1 from (length(arg1)+1-arg2))</td>
+ <td>Not reported as supported since arg2 is duplicated.</td>
+ </tr>
+ <tr>
+ <td>rtrim(arg1)</td>
+ <td>yes</td>
+ <td>trim(trailing from arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>space(arg1)</td>
+ <td>yes</td>
+ <td>repeat(' ',arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>substring(arg1,arg2)</td>
+ <td>yes</td>
+ <td>substr(arg1,arg2)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>substring(arg1,arg2,arg3)</td>
+ <td>yes</td>
+ <td>substr(arg1,arg2,arg3)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>ucase(arg1)</td>
+ <td>yes</td>
+ <td>upper(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>soundex(arg1)</td>
+ <td>no</td>
+ <td>soundex(arg1)</td>
+ <td>Not reported as supported since it requires the fuzzystrmatch
+contrib module.</td>
+ </tr>
+ <tr>
+ <td>difference(arg1,arg2)</td>
+ <td>no</td>
+ <td>difference(arg1,arg2)</td>
+ <td>Not reported as supported since it requires the fuzzystrmatch
+contrib module.</td>
+ </tr>
+ </tbody>
+</table>
+
+<a name="escape-datetime-functions-table"></a>
+**Table 8.3. Supported escaped date/time functions**
+
+<table summary="Supported escaped date/time functions" border="1">
+ <tr>
+ <th>function</th>
+ <th>reported as supported</th>
+ <th>translation</th>
+ <th>comments</th>
+ </tr>
+ <tbody>
+ <tr>
+ <td>curdate()</td>
+ <td>yes</td>
+ <td>current_date</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>curtime()</td>
+ <td>yes</td>
+ <td>current_time</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>dayname(arg1)</td>
+ <td>yes</td>
+ <td>to_char(arg1,'Day')</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>dayofmonth(arg1)</td>
+ <td>yes</td>
+ <td>extract(day from arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>dayofweek(arg1)</td>
+ <td>yes</td>
+ <td>extract(dow from arg1)+1</td>
+ <td>We must add 1 to be in the expected 1-7 range.</td>
+ </tr>
+ <tr>
+ <td>dayofyear(arg1)</td>
+ <td>yes</td>
+ <td>extract(doy from arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>hour(arg1)</td>
+ <td>yes</td>
+ <td>extract(hour from arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>minute(arg1)</td>
+ <td>yes</td>
+ <td>extract(minute from arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>month(arg1)</td>
+ <td>yes</td>
+ <td>extract(month from arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>monthname(arg1)</td>
+ <td>yes</td>
+ <td>to_char(arg1,'Month')</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>now()</td>
+ <td>yes</td>
+ <td>now()</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>quarter(arg1)</td>
+ <td>yes</td>
+ <td>extract(quarter from arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>second(arg1)</td>
+ <td>yes</td>
+ <td>extract(second from arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>week(arg1)</td>
+ <td>yes</td>
+ <td>extract(week from arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>year(arg1)</td>
+ <td>yes</td>
+ <td>extract(year from arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>timestampadd(argIntervalType,argCount,argTimeStamp)</td>
+ <td>yes</td>
+ <td>('(interval according to argIntervalType and
+argCount)'+argTimeStamp)</td>
+ <td>an argIntervalType value of SQL_TSI_FRAC_SECOND
+is not implemented since backend does not support it</td>
+ </tr>
+ <tr>
+ <td>timestampdiff(argIntervalType,argTimeStamp1,argTimeStamp2)</td>
+ <td>not</td>
+ <td>extract((interval according to argIntervalType) from
+argTimeStamp2-argTimeStamp1 )</td>
+ <td>only an argIntervalType value of SQL_TSI_FRAC_SECOND, SQL_TSI_FRAC_MINUTE, SQL_TSI_FRAC_HOUR
+or SQL_TSI_FRAC_DAY is supported </td>
+ </tr>
+ </tbody>
+</table>
+
+<a name="escape-misc-functions-table"></a>
+**Table 8.4. Supported escaped misc functions**
+
+<table summary="Supported escaped misc functions" border="1">
+ <tr>
+ <th>function</th>
+ <th>reported as supported</th>
+ <th>translation</th>
+ <th>comments</th>
+ </tr>
+ <tbody>
+ <tr>
+ <td>database()</td>
+ <td>yes</td>
+ <td>current_database()</td>
+ <td>Only reported as supported by 7.3 and above servers.</td>
+ </tr>
+ <tr>
+ <td>ifnull(arg1,arg2)</td>
+ <td>yes</td>
+ <td>coalesce(arg1,arg2)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>user()</td>
+ <td>yes</td>
+ <td>user</td>
+ <td> </td>
+ </tr>
+ </tbody>
+</table>
\ No newline at end of file
diff --git a/docs/documentation/94/escapes-datetime.md b/docs/documentation/94/escapes-datetime.md
new file mode 100644
index 0000000..6d1e11d
--- /dev/null
+++ b/docs/documentation/94/escapes-datetime.md
@@ -0,0 +1,23 @@
+---
+layout: default_docs
+title: Date-time escapes
+header: Chapter 8. JDBC escapes
+resource: media
+previoustitle: Escape for outer joins
+previous: outer-joins-escape.html
+nexttitle: Escaped scalar functions
+next: escaped-functions.html
+---
+
+The JDBC specification defines escapes for specifying date, time and timestamp
+values which are supported by the driver.
+
+> date
+>> `{d 'yyyy-mm-dd'}` which is translated to `DATE 'yyyy-mm-dd'`
+
+> time
+>> `{t 'hh:mm:ss'}` which is translated to `TIME 'hh:mm:ss'`
+
+> timestamp
+>> `{ts 'yyyy-mm-dd hh:mm:ss.f...'}` which is translated to `TIMESTAMP 'yyyy-mm-dd hh:mm:ss.f'`<br /><br />
+>> The fractional seconds (.f...) portion of the TIMESTAMP can be omitted.
\ No newline at end of file
diff --git a/docs/documentation/94/escapes.md b/docs/documentation/94/escapes.md
new file mode 100644
index 0000000..3bf4f72
--- /dev/null
+++ b/docs/documentation/94/escapes.md
@@ -0,0 +1,57 @@
+---
+layout: default_docs
+title: Chapter 8. JDBC escapes
+header: Chapter 8. JDBC escapes
+resource: media
+previoustitle: Chapter 7. Storing Binary Data
+previous: binary-data.html
+nexttitle: Escape for outer joins
+next: outer-joins-escape.html
+---
+
+**Table of Contents**
+
+* [Escape for like escape character](escapes.html#like-escape)
+* [Escape for outer joins](outer-joins-escape.html)
+* [Date-time escapes](escapes-datetime.html)
+* [Escaped scalar functions](escaped-functions.html)
+
+The JDBC specification (like the ODBC specification) acknowledges the fact that
+some vendor specific SQL may be required for certain RDBMS features. To aid
+developers in writing portable JDBC applications across multiple database products,
+a special escape syntax is used to specify the generic commands the developer
+wants to be run. The JDBC driver translates these escape sequences into native
+syntax for its specific database. For more information consult the section 4.1.5
+from the [JDBC Technology Guide](http://java.sun.com/j2se/1.4.2/docs/guide/jdbc/getstart/statement.html#999472)
+(bundled with the Oracle™ JRE documentation) and the section 13.4 from the
+[JDBC 3.0 specification](http://java.sun.com/products/jdbc/download.html#corespec30).
+
+The parsing of the sql statements for these escapes can be disabled using
+`Statement.setEscapeProcessing(false)`.
+
+`Connection.nativeSQL(String sql)` provides another way to have escapes processed.
+It translates the given SQL to a SQL suitable for the PostgreSQL™ backend.
+
+<a name="escape-use-example"></a>
+**Example 8.1. Using jdbc escapes**
+
+To use the JDBC escapes, you simply write your SQL replacing date/time literal
+values, outer join and functions by the JDBC escape syntax. For example :
+
+`ResultSet rs = st.executeQuery("SELECT {fn week({d '2005-01-24'})}");`
+
+is the portable version for
+
+`ResultSet rs = st.executeQuery("SELECT extract(week from DATE '2005-01-24')");`
+
+<a name="like-escape"></a>
+# Escape for like escape character
+
+You can specify which escape character to use in strings comparison (with `LIKE`)
+to protect wildcards characters ('%' and '_') by adding the following escape :
+`{escape 'escape-character'}`. The driver supports this only at the end of the
+comparison expression.
+
+For example, you can compare string values using '|' as escape character to protect '_' :
+
+`rs = stmt.executeQuery("select str2 from comparisontest where str1 like '|_abcd' {escape '|'} ");`
diff --git a/docs/documentation/94/ext.md b/docs/documentation/94/ext.md
new file mode 100644
index 0000000..553eb57
--- /dev/null
+++ b/docs/documentation/94/ext.md
@@ -0,0 +1,36 @@
+---
+layout: default_docs
+title: Chapter 9. PostgreSQL™ Extensions to the JDBC API
+header: Chapter 9. PostgreSQL™ Extensions to the JDBC API
+resource: media
+previoustitle: Escaped scalar functions
+previous: escaped-functions.html
+nexttitle: Geometric Data Types
+next: geometric.html
+---
+
+**Table of Contents**
+
+* [Accessing the Extensions](ext.html#extensions)
+* [Geometric Data Types](geometric.html)
+* [Large Objects](largeobjects.html)
+* [Listen / Notify](listennotify.html)
+* [Server Prepared Statements](server-prepare.html)
+
+PostgreSQL™ is an extensible database system. You can add your own functions to
+the server, which can then be called from queries, or even add your own data types.
+As these are facilities unique to PostgreSQL™, we support them from Java, with a
+set of extension APIs. Some features within the core of the standard driver
+actually use these extensions to implement Large Objects, etc.
+
+<a name="extensions"></a>
+# Accessing the Extensions
+
+To access some of the extensions, you need to use some extra methods in the
+`org.postgresql.PGConnection` class. In this case, you would need to case the
+return value of `Driver.getConnection()`. For example:
+
+`Connection db = Driver.getConnection(url, username, password);`
+`// ...`
+`// later on`
+`Fastpath fp = db.unwrap(org.postgresql.PGConnection.class).getFastpathAPI();`
diff --git a/docs/documentation/94/geometric.md b/docs/documentation/94/geometric.md
new file mode 100644
index 0000000..284985c
--- /dev/null
+++ b/docs/documentation/94/geometric.md
@@ -0,0 +1,68 @@
+---
+layout: default_docs
+title: Geometric Data Types
+header: Chapter 9. PostgreSQL™ Extensions to the JDBC API
+resource: media
+previoustitle: Chapter 9. PostgreSQL™ Extensions to the JDBC API
+previous: ext.html
+nexttitle: Large Objects
+next: largeobjects.html
+---
+
+PostgreSQL™ has a set of data types that can store geometric features into a
+table. These include single points, lines, and polygons. We support these types
+in Java with the org.postgresql.geometric package. Please consult the Javadoc
+for the details of available classes and features metioned in [Chapter 12, *Further Reading*](reading.html).
+
+<a name="geometric-circle-example"></a>
+**Example 9.1. Using the CIRCLE datatype JDBC**
+
+import java.sql.*;
+
+import org.postgresql.geometric.PGpoint;
+import org.postgresql.geometric.PGcircle;
+
+public class GeometricTest {
+
+ public static void main(String args[]) throws Exception {
+ Class.forName("org.postgresql.Driver");
+ String url = "jdbc:postgresql://localhost:5432/test";
+
+ Connection conn = DriverManager.getConnection(url,"test","");
+
+ Statement stmt = conn.createStatement();
+ stmt.execute("CREATE TEMP TABLE geomtest(mycirc circle)");
+ stmt.close();
+
+ insertCircle(conn);
+ retrieveCircle(conn);
+ conn.close();
+ }
+
+ private static void insertCircle(Connection conn) throws SQLException {
+
+ PGpoint center = new PGpoint(1, 2.5);
+ double radius = 4;
+ PGcircle circle = new PGcircle(center, radius);
+
+ PreparedStatement ps = conn.prepareStatement("INSERT INTO geomtest(mycirc) VALUES (?)");
+ ps.setObject(1, circle);
+ ps.executeUpdate();
+ ps.close();
+ }
+
+ private static void retrieveCircle(Connection conn) throws SQLException {
+ Statement stmt = conn.createStatement();
+ ResultSet rs = stmt.executeQuery("SELECT mycirc, area(mycirc) FROM geomtest");
+ rs.next();
+ PGcircle circle = (PGcircle)rs.getObject(1);
+ double area = rs.getDouble(2);
+
+ PGpoint center = circle.center;
+ double radius = circle.radius;
+
+ System.out.println("Center (X, Y) = (" + center.x + ", " + center.y + ")");
+ System.out.println("Radius = " + radius);
+ System.out.println("Area = " + area);
+ }
+}
\ No newline at end of file
diff --git a/docs/documentation/94/index.html b/docs/documentation/94/index.html
new file mode 100644
index 0000000..bf391bb
--- /dev/null
+++ b/docs/documentation/94/index.html
@@ -0,0 +1,253 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en" dir="ltr">
+<head>
+ <title>The PostgreSQL™ JDBC Interface</title>
+ <meta http-equiv="Content-Type" content="text/xhtml; charset=utf-8" />
+ <meta name="description" content="The official site for the PostgreSQL JDBC Driver" />
+ <meta name="copyright" content="The PostgreSQL Global Development Group" />
+
+ <style type="text/css" media="screen" title="Normal Text">@import url("media/css/docs.css");</style>
+
+ <link rel="shortcut icon" href="media/favicon.ico" />
+</head>
+
+
+<body>
+ <div id="docHeader">
+ <div id="docHeaderLogo">
+ <a href="http://www.postgresql.org/" title="PostgreSQL"><img src="media/img/layout/hdr_left3a.png" alt="PostgreSQL" height="80" width="390" /></a>
+ </div>
+ </div>
+
+ <div id="docContainerWrap">
+ <div id="docContainer">
+ <div id="docContent">
+ <div class="BOOK">
+ <a name="POSTGRES" id="POSTGRES"></a>
+ <div class="TITLEPAGE">
+ <h1 class="TITLE">The PostgreSQL JDBC Interface</h1>
+ <hr />
+ </div>
+
+ <div class="TOC">
+ <h3 class="c2">Table of Contents</h3>
+ <dl>
+ <!-- <dt class="c1">Table of Contents</dt> -->
+
+ <dt>1. <a href="intro.html">Introduction</a></dt>
+
+ <dt>2. <a href="setup.html">Setting up the JDBC Driver</a></dt>
+ <dd>
+ <dl>
+ <dt><a href="setup.html#build">Getting the Driver</a></dt>
+ <dt><a href="classpath.html">Setting up the Class Path</a></dt>
+ <dt><a href="prepare.html">Preparing the Database Server for <acronym class="ACRONYM">JDBC</acronym></a></dt>
+ <dt><a href="your-database.html">Creating a Database</a></dt>
+ </dl>
+ </dd>
+
+ <dt>3. <a href="use.html">Initializing the Driver</a></dt>
+ <dd>
+ <dl>
+ <dt><a href="use.html#import">Importing <acronym class="ACRONYM">JDBC</acronym></a></dt>
+ <dt><a href="load.html">Loading the Driver</a></dt>
+ <dt><a href="connect.html">Connecting to the Database</a></dt>
+ <dd>
+ <dl>
+ <dt><a href="connect.html#connection-parameters">Connection Parameters</a></dt>
+ </dl>
+ </dd>
+ </dl>
+ </dd>
+
+ <dt>4. <a href="ssl.html">Using <acronym class="ACRONYM">SSL</acronym></a></dt>
+ <dd>
+ <dl>
+ <dt><a href="ssl.html#ssl-server">Configuring the Server</a></dt>
+ <dt><a href="ssl-client.html">Configuring the Client</a></dt>
+ <dd>
+ <dl>
+ <dt><a href="ssl-client.html#nonvalidating">Using SSL without Certificate Validation</a></dt>
+ </dl>
+ </dd>
+ <dt><a href="ssl-factory.html">Custom SSLSocketFactory</a></dt>
+ </dl>
+ </dd>
+
+ <dt>5. <a href="query.html">Issuing a Query and Processing the Result</a></dt>
+ <dd>
+ <dl>
+ <dt><a href="query.html#query-with-cursor">Getting results based on a cursor</a></dt>
+ <dt><a href="statement.html">Using the Statement or PreparedStatement Interface</a></dt>
+ <dt><a href="resultset.html">Using the ResultSet Interface</a></dt>
+ <dt><a href="update.html">Performing Updates</a></dt>
+ <dt><a href="ddl.html">Creating and Modifying Database Objects</a></dt>
+ </dl>
+ </dd>
+
+ <dt>6. <a href="callproc.html">Calling Stored Functions</a></dt>
+ <dd>
+ <dl>
+ <dt><a href="callproc.html#callproc-resultset">Obtaining a ResultSet from a stored function</a></dt>
+ <dd>
+ <dl>
+ <dt><a href="callproc.html#callproc-resultset-setof">From a Function Returning SETOF type</a></dt>
+ <dt><a href="callproc.html#callproc-resultset-refcursor">From a Function Returning a <span class="type">refcursor</span></a></dt>
+ </dl>
+ </dd>
+ </dl>
+ </dd>
+
+ <dt>7. <a href="binary-data.html">Storing Binary Data</a></dt>
+
+ <dt>8. <a href="escapes.html"><acronym class="ACRONYM">JDBC</acronym> escapes</a></dt>
+ <dd>
+ <dl>
+ <dt><a href="escapes.html#like-escape">Escape for like escape character</a></dt>
+ <dt><a href="outer-joins-escape.html">Escape for outer joins</a></dt>
+ <dt><a href="escapes-datetime.html">Date-time escapes</a></dt>
+ <dt><a href="escaped-functions.html">Escaped scalar functions</a></dt>
+ </dl>
+ </dd>
+
+ <dt>9. <a href="ext.html">PostgreSQL™ Extensions to the <acronym class="ACRONYM">JDBC</acronym> <acronym class="ACRONYM">API</acronym></a></dt>
+ <dd>
+ <dl>
+ <dt><a href="ext.html#extensions">Accessing the Extensions</a></dt>
+ <dt><a href="geometric.html">Geometric Data Types</a></dt>
+ <dt><a href="largeobjects.html">Large Objects</a></dt>
+ <dt><a href="listennotify.html">Listen / Notify</a></dt>
+ <dt><a href="server-prepare.html">Server Prepared Statements</a></dt>
+ </dl>
+ </dd>
+
+ <dt>10. <a href="thread.html">Using the Driver in a Multithreaded or a Servlet Environment</a></dt>
+
+ <dt>11. <a href="datasource.html">Connection Pools and Data Sources</a></dt>
+ <dd>
+ <dl>
+ <dt><a href="datasource.html#ds-intro">Overview</a></dt>
+ <dt><a href="ds-cpds.html">Application Servers: ConnectionPoolDataSource</a></dt>
+ <dt><a href="ds-ds.html">Applications: DataSource</a></dt>
+ <dt><a href="tomcat.html">Tomcat setup</a></dt>
+ <dt><a href="jndi.html">Data Sources and <acronym class="ACRONYM">JNDI</acronym></a></dt>
+ </dl>
+ </dd>
+
+ <dt>12. <a href="reading.html">Further Reading</a></dt>
+ </dl>
+ </div>
+
+ <div class="LOT">
+ <h3 class="c2">List of Tables</h3>
+ <dl class="LOT">
+ <!-- <dt class="c1">List of Tables</dt> -->
+ <dt>
+ 8.1. <a href="escaped-functions.html#escape-numeric-functions-table">Supported escaped numeric functions</a>
+ </dt>
+ <dt>
+ 8.2. <a href="escaped-functions.html#escape-string-functions-table">Supported escaped string functions</a>
+ </dt>
+ <dt>
+ 8.3. <a href="escaped-functions.html#escape-datetime-functions-table">Supported escaped date/time functions</a>
+ </dt>
+ <dt>
+ 8.4. <a href="escaped-functions.html#escape-misc-functions-table">Supported escaped misc functions</a>
+ </dt>
+ <dt>
+ 11.1. <a href="ds-cpds.html#ds-cpds-props">ConnectionPoolDataSource Configuration Properties</a>
+ </dt>
+ <dt>
+ 11.2. <a href="ds-ds.html#ds-ds-imp">DataSource Implementations</a>
+ </dt>
+ <dt>
+ 11.3. <a href="ds-ds.html#ds-ds-props">DataSource Configuration Properties</a>
+ </dt>
+ <dt>
+ 11.4. <a href="ds-ds.html#ds-ds-xprops">Additional Pooling DataSource Configuration Properties</a>
+ </dt>
+ </dl>
+ </div>
+
+ <div class="LOT">
+ <h3 class="c2">List of Examples</h3>
+ <dl class="LOT">
+ <!-- <dt class="c1">List of Examples</dt> -->
+ <dt>
+ 5.1. <a href="query.html#query-example">Processing a Simple Query in <acronym class="ACRONYM">JDBC</acronym></a>
+ </dt>
+ <dt>
+ 5.2. <a href="query.html#fetchsize-example">Setting fetch size to turn cursors on and off.</a>
+ </dt>
+ <dt>
+ 5.3. <a href="update.html#delete-example">Deleting Rows in <acronym class="ACRONYM">JDBC</acronym></a>
+ </dt>
+ <dt>
+ 5.4. <a href="ddl.html#drop-table-example">Dropping a Table in <acronym class="ACRONYM">JDBC</acronym></a>
+ </dt>
+ <dt>
+ 6.1. <a href="callproc.html#call-function-example">Calling a built in stored function</a>
+ </dt>
+ <dt>
+ 6.2. <a href="callproc.html#setof-resultset"> Getting SETOF type values from a function</a>
+ </dt>
+ <dt>
+ 6.3. <a href="callproc.html#get-refcursor-from-function-call"> Getting <span class="type">refcursor</span> Value From a Function</a>
+ </dt>
+ <dt>
+ 6.4. <a href="callproc.html#refcursor-string-example">Treating <span class="type">refcursor</span> as a cursor name</a>
+ </dt>
+ <dt>
+ 7.1. <a href="binary-data.html#binary-data-example">Processing Binary Data in <acronym class="ACRONYM">JDBC</acronym></a>
+ </dt>
+ <dt>
+ 8.1. <a href="escapes.html#escape-use-example">Using jdbc escapes</a>
+ </dt>
+ <dt>
+ 9.1. <a href="geometric.html#geometric-circle-example">Using the CIRCLE datatype from <acronym class="ACRONYM">JDBC</acronym></a>
+ </dt>
+ <dt>
+ 9.2. <a href="listennotify.html#listen-notify-example">Receiving Notifications</a>
+ </dt>
+ <dt>
+ 9.3. <a href="server-prepare.html#server-prepared-statement-example">Using server side prepared statements</a>
+ </dt>
+ <dt>
+ 11.1. <a href="ds-ds.html#ds-example">DataSource Code Example</a>
+ </dt>
+ <dt>
+ 11.2. <a href="jndi.html#ds-jndi">DataSource <acronym class="ACRONYM">JNDI</acronym> Code Example</a>
+ </dt>
+ </dl>
+ </div>
+ </div> <!-- BOOK -->
+
+ <div class="NAVFOOTER">
+ <hr class="c2" width="100%" />
+ <table summary="Footer navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
+ <tbody>
+ <tr>
+ <td valign="top" width="33%" align="left"> </td>
+ <td valign="top" width="34%" align="center"> </td>
+ <td valign="top" width="33%" align="right"><a href="intro.html" accesskey="N">Next</a></td>
+ </tr>
+ <tr>
+ <td valign="top" width="33%" align="left"> </td>
+ <td valign="top" width="34%" align="center"> </td>
+ <td valign="top" width="33%" align="right">Chapter 1. Introduction</td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </div> <!--docContent -->
+
+ <div id="docComments"></div>
+
+ <div id="docFooter">
+ <a class="navFooter" href="http://www.postgresql.org/about/privacypolicy">Privacy Policy</a> |
+ <a class="navFooter" href="http://www.postgresql.org/about/">About PostgreSQL</a><br/>
+ Copyright © 1996-2013 The PostgreSQL Global Development Group
+ </div> <!-- pgFooter -->
+ </div> <!-- docContainer -->
+ </div> <!-- docContainerWrap -->
+</body>
diff --git a/docs/documentation/94/intro.md b/docs/documentation/94/intro.md
new file mode 100644
index 0000000..f815fae
--- /dev/null
+++ b/docs/documentation/94/intro.md
@@ -0,0 +1,22 @@
+---
+layout: default_docs
+title: Chapter 1. Introduction
+header: Chapter 1. Introduction
+resource: media
+previoustitle: The PostgreSQL™ JDBC Interface
+previous: index.html
+nexttitle: Chapter 2. Setting up the JDBC Driver
+next: setup.html
+---
+
+JDBC is a core API of Java 1.1 and later. It provides a standard set of interfaces
+to SQL-compliant databases.
+
+PostgreSQL™ provides a *type 4* JDBC driver. Type 4 indicates that the driver is
+written in Pure Java, and communicates in the database system's own network protocol.
+Because of this, the driver is platform independent; once compiled, the driver
+can be used on any system.
+
+This manual is not intended as a complete guide to JDBC programming, but should
+help to get you started. For more information refer to the standard JDBC API
+documentation. Also, take a look at the examples included with the source.
\ No newline at end of file
diff --git a/docs/documentation/94/jndi.md b/docs/documentation/94/jndi.md
new file mode 100644
index 0000000..969512d
--- /dev/null
+++ b/docs/documentation/94/jndi.md
@@ -0,0 +1,68 @@
+---
+layout: default_docs
+title: Data Sources and JNDI
+header: Chapter 11. Connection Pools and Data Sources
+resource: media
+previoustitle: Tomcat setup
+previous: tomcat.html
+nexttitle: Chapter 12. Further Reading
+next: reading.html
+---
+
+All the `ConnectionPoolDataSource` and `DataSource` implementations can be stored
+in JNDI. In the case of the nonpooling implementations, a new instance will be
+created every time the object is retrieved from JNDI, with the same settings as
+the instance that was stored. For the pooling implementations, the same instance
+will be retrieved as long as it is available (e.g., not a different JVM retrieving
+the pool from JNDI), or a new instance with the same settings created otherwise.
+
+In the application server environment, typically the application server's
+`DataSource` instance will be stored in JNDI, instead of the PostgreSQL™
+`ConnectionPoolDataSource` implementation.
+
+In an application environment, the application may store the `DataSource` in JNDI
+so that it doesn't have to make a reference to the `DataSource` available to all
+application components that may need to use it. An example of this is shown in
+[Example 11.2, “`DataSource` JNDI Code Example”](jndi.html#ds-jndi).
+
+<a name="ds-jndi"></a>
+**Example 11.2. `DataSource` JNDI Code Example**
+
+Application code to initialize a pooling `DataSource` and add it to JNDI might
+look like this:
+
+`PGPoolingDataSource source = new PGPoolingDataSource();`
+`source.setDataSourceName("A Data Source");`
+`source.setServerName("localhost");`
+`source.setDatabaseName("test");`
+`source.setUser("testuser");`
+`source.setPassword("testpassword");`
+`source.setMaxConnections(10);`
+`new InitialContext().rebind("DataSource", source);`
+
+Then code to use a connection from the pool might look like this:
+
+<pre><code>
+Connection conn = null;
+try
+{
+ DataSource source = (DataSource)new InitialContext().lookup("DataSource");
+ conn = source.getConnection();
+ // use connection
+}
+catch (SQLException e)
+{
+ // log error
+}
+catch (NamingException e)
+{
+ // DataSource wasn't found in JNDI
+}
+finally
+{
+ if (con != null)
+ {
+ try { conn.close(); } catch (SQLException e) {}
+ }
+}
+</code></pre>
\ No newline at end of file
diff --git a/docs/documentation/94/largeobjects.md b/docs/documentation/94/largeobjects.md
new file mode 100644
index 0000000..cbcdbad
--- /dev/null
+++ b/docs/documentation/94/largeobjects.md
@@ -0,0 +1,20 @@
+---
+layout: default_docs
+title: Large Objects
+header: Chapter 9. PostgreSQL™ Extensions to the JDBC API
+resource: media
+previoustitle: Geometric Data Types
+previous: geometric.html
+nexttitle: Listen / Notify
+next: listennotify.html
+---
+
+Large objects are supported in the standard JDBC specification. However, that
+interface is limited, and the API provided by PostgreSQL™ allows for random
+access to the objects contents, as if it was a local file.
+
+The org.postgresql.largeobject package provides to Java the libpq C interface's
+large object API. It consists of two classes, `LargeObjectManager`, which deals
+with creating, opening and deleting large objects, and `LargeObject` which deals
+with an individual object. For an example usage of this API, please see
+[Example 7.1, “Processing Binary Data in JDBC”](binary-data.html#binary-data-example).
\ No newline at end of file
diff --git a/docs/documentation/94/listennotify.md b/docs/documentation/94/listennotify.md
new file mode 100644
index 0000000..3ad4e2d
--- /dev/null
+++ b/docs/documentation/94/listennotify.md
@@ -0,0 +1,148 @@
+---
+layout: default_docs
+title: Listen / Notify
+header: Chapter 9. PostgreSQL™ Extensions to the JDBC API
+resource: media
+previoustitle: Large Objects
+previous: largeobjects.html
+nexttitle: Server Prepared Statements
+next: server-prepare.html
+---
+
+Listen and Notify provide a simple form of signal or interprocess communication
+mechanism for a collection of processes accessing the same PostgreSQL™ database.
+For more information on notifications consult the main server documentation. This
+section only deals with the JDBC specific aspects of notifications.
+
+Standard `LISTEN`, `NOTIFY`, and `UNLISTEN` commands are issued via the standard
+`Statement` interface. To retrieve and process retrieved notifications the
+`Connection` must be cast to the PostgreSQL™ specific extension interface
+`PGConnection`. From there the `getNotifications()` method can be used to retrieve
+any outstanding notifications.
+
+### Note
+
+> A key limitation of the JDBC driver is that it cannot receive asynchronous
+notifications and must poll the backend to check if any notifications were issued.
+
+<a name="listen-notify-example"></a>
+**Example 9.2. Receiving Notifications**
+
+<pre><code>
+import java.sql.*;
+
+public class NotificationTest
+{
+ public static void main(String args[]) throws Exception
+ {
+ Class.forName("org.postgresql.Driver");
+ String url = "jdbc:postgresql://localhost:5432/test";
+
+ // Create two distinct connections, one for the notifier
+ // and another for the listener to show the communication
+ // works across connections although this example would
+ // work fine with just one connection.
+
+ Connection lConn = DriverManager.getConnection(url,"test","");
+ Connection nConn = DriverManager.getConnection(url,"test","");
+
+ // Create two threads, one to issue notifications and
+ // the other to receive them.
+
+ Listener listener = new Listener(lConn);
+ Notifier notifier = new Notifier(nConn);
+ listener.start();
+ notifier.start();
+ }
+}
+</code></pre>
+
+<pre><code>
+class Listener extends Thread
+{
+ private Connection conn;
+ private org.postgresql.PGConnection pgconn;
+
+ Listener(Connection conn) throws SQLException
+ {
+ this.conn = conn;
+ this.pgconn = conn.unwrap(org.postgresql.PGConnection.class);
+ Statement stmt = conn.createStatement();
+ stmt.execute("LISTEN mymessage");
+ stmt.close();
+ }
+
+ public void run()
+ {
+ while (true)
+ {
+ try
+ {
+ // issue a dummy query to contact the backend
+ // and receive any pending notifications.
+
+ Statement stmt = conn.createStatement();
+ ResultSet rs = stmt.executeQuery("SELECT 1");
+ rs.close();
+ stmt.close();
+
+ org.postgresql.PGNotification notifications[] = pgconn.getNotifications();
+
+ if (notifications != null)
+ {
+ for (int i=0; i<notifications.length; i++)
+ System.out.println("Got notification: " + notifications[i].getName());
+ }
+
+ // wait a while before checking again for new
+ // notifications
+
+ Thread.sleep(500);
+ }
+ catch (SQLException sqle)
+ {
+ sqle.printStackTrace();
+ }
+ catch (InterruptedException ie)
+ {
+ ie.printStackTrace();
+ }
+ }
+ }
+}
+</code></pre>
+
+<pre><code>
+class Notifier extends Thread
+{
+ private Connection conn;
+
+ public Notifier(Connection conn)
+ {
+ this.conn = conn;
+ }
+
+ public void run()
+ {
+ while (true)
+ {
+ try
+ {
+ Statement stmt = conn.createStatement();
+ stmt.execute("NOTIFY mymessage");
+ stmt.close();
+ Thread.sleep(2000);
+ }
+ catch (SQLException sqle)
+ {
+ sqle.printStackTrace();
+ }
+ catch (InterruptedException ie)
+ {
+ ie.printStackTrace();
+ }
+ }
+ }
+
+}
+</code></pre>
diff --git a/docs/documentation/94/load.md b/docs/documentation/94/load.md
new file mode 100644
index 0000000..e4996a8
--- /dev/null
+++ b/docs/documentation/94/load.md
@@ -0,0 +1,47 @@
+---
+layout: default_docs
+title: Loading the Driver
+header: Chapter 3. Initializing the Driver
+resource: media
+previoustitle: Chapter 3. Initializing the Driver
+previous: use.html
+nexttitle: Connecting to the Database
+next: connect.html
+---
+
+Before you can connect to a database, you need to load the driver. There are two
+methods available, and it depends on your code which is the best one to use.
+
+In the first method, your code implicitly loads the driver using the `Class.forName()`
+method. For PostgreSQL™, you would use:
+
+Class.forName("org.postgresql.Driver");
+
+This will load the driver, and while loading, the driver will automatically
+register itself with JDBC.
+
+### Note
+
+The `forName()` method can throw a `ClassNotFoundException` if the driver is not
+available.
+
+This is the most common method to use, but restricts your code to use just PostgreSQL™.
+If your code may access another database system in the future, and you do not
+use any PostgreSQL™-specific extensions, then the second method is advisable.
+
+The second method passes the driver as a parameter to the JVM as it starts, using
+the `-D` argument. Example:
+
+`java -Djdbc.drivers=org.postgresql.Driver example.ImageViewer`
+
+In this example, the JVM will attempt to load the driver as part of its initialization.
+Once done, the ImageViewer is started.
+
+Now, this method is the better one to use because it allows your code to be used
+with other database packages without recompiling the code. The only thing that
+would also change is the connection URL, which is covered next.
+
+One last thing: When your code then tries to open a `Connection`, and you get a
+No driver available `SQLException` being thrown, this is probably caused by the
+driver not being in the class path, or the value in the parameter not being
+correct.
\ No newline at end of file
diff --git a/docs/documentation/94/media/css/docs.css b/docs/documentation/94/media/css/docs.css
new file mode 100644
index 0000000..b168780
--- /dev/null
+++ b/docs/documentation/94/media/css/docs.css
@@ -0,0 +1,450 @@
+/* PostgreSQL.org Documentation Style */
+
+ at import url("global.css");
+ at import url("table.css");
+ at import url("text.css");
+
+body {
+ font-size: 76%;
+}
+
+div.NAVHEADER table {
+ margin-left: 0;
+}
+
+/* Container Definitions */
+
+#docContainerWrap {
+ text-align: center; /* Win IE5 */
+}
+
+#docContainer {
+ margin: 0 auto;
+ width: 90%;
+ padding-bottom: 2em;
+ display: block;
+ text-align: left; /* Win IE5 */
+}
+
+#docHeader {
+ background-image: url("../img/docs/bg_hdr.png");
+ height: 83px;
+ margin: 0px;
+ padding: 0px;
+ display: block;
+}
+
+#docHeaderLogo {
+ position: relative;
+ width: 206px;
+ height: 83px;
+ border: 0px;
+ padding: 0px;
+ margin: 0 0 0 20px;
+}
+
+#docHeaderLogo img {
+ border: 0px;
+}
+
+#docNavSearchContainer {
+ padding-bottom: 2px;
+}
+
+#docNav, #docVersions {
+ position: relative;
+ text-align: left;
+ margin-left: 10px;
+ margin-top: 5px;
+ color: #666;
+ font-size: 0.95em;
+}
+
+#docSearch {
+ position: relative;
+ text-align: right;
+ padding: 0;
+ margin: 0;
+ color: #666;
+}
+
+#docTextSize {
+ text-align: right;
+ white-space: nowrap;
+ margin-top: 7px;
+ font-size: 0.95em;
+}
+
+#docSearch form {
+ position: relative;
+ top: 5px;
+ right: 0;
+ margin: 0; /* need for IE 5.5 OSX */
+ text-align: right; /* need for IE 5.5 OSX */
+ white-space: nowrap; /* for Opera */
+}
+
+#docSearch form label {
+ color: #666;
+ font-size: 0.95em;
+}
+
+#docSearch form input {
+ font-size: 0.95em;
+}
+
+#docSearch form #submit {
+ font-size: 0.95em;
+ background: #7A7A7A;
+ color: #fff;
+ border: 1px solid #7A7A7A;
+ padding: 1px 4px;
+}
+
+#docSearch form #q {
+ width: 170px;
+ font-size: 0.95em;
+ border: 1px solid #7A7A7A;
+ background: #E1E1E1;
+ color: #000000;
+ padding: 2px;
+}
+
+.frmDocSearch {
+ padding: 0;
+ margin: 0;
+ display: inline;
+}
+
+.inpDocSearch {
+ padding: 0;
+ margin: 0;
+ color: #000;
+}
+
+#docContent {
+ position: relative;
+ margin-left: 10px;
+ margin-right: 10px;
+ margin-top: 40px;
+}
+
+#docFooter {
+ position: relative;
+ font-size: 0.9em;
+ color: #666;
+ line-height: 1.3em;
+ margin-left: 10px;
+ margin-right: 10px;
+}
+
+#docComments {
+ margin-top: 10px;
+}
+
+#docClear {
+ clear: both;
+ margin: 0;
+ padding: 0;
+}
+
+/* Heading Definitions */
+
+h1, h2, h3 {
+ font-weight: bold;
+ margin-top: 2ex;
+}
+
+h1 {
+ font-size: 1.4em;
+}
+
+h2 {
+ font-size: 1.2em !important;
+}
+
+h3 {
+ font-size: 1.1em;
+}
+
+h1 a:hover {
+ color: #EC5800;
+ text-decoration: none;
+}
+
+h2 a:hover,
+h3 a:hover,
+h4 a:hover {
+ color: #666666;
+ text-decoration: none;
+}
+
+/* Text Styles */
+
+div.SECT2 {
+ margin-top: 4ex;
+}
+
+div.SECT3 {
+ margin-top: 3ex;
+ margin-left: 3ex;
+}
+
+.txtCurrentLocation {
+ font-weight: bold;
+}
+
+p, ol, ul, li {
+ line-height: 1.5em;
+}
+
+.txtCommentsWrap {
+ border: 2px solid #F5F5F5;
+ width: 100%;
+}
+
+.txtCommentsContent {
+ background: #F5F5F5;
+ padding: 3px;
+}
+
+.txtCommentsPoster {
+ float: left;
+}
+
+.txtCommentsDate {
+ float: right;
+}
+
+.txtCommentsComment {
+ padding: 3px;
+}
+
+#docContainer p code,
+#docContainer ul code,
+#docContainer pre code,
+#docContainer pre tt,
+#docContainer pre pre,
+#docContainer tt tt,
+#docContainer tt code,
+#docContainer tt pre {
+ font-size: 1.5em;
+}
+
+pre.LITERALLAYOUT,
+.SCREEN,
+.SYNOPSIS,
+.PROGRAMLISTING,
+.REFSYNOPSISDIV p,
+table.CAUTION,
+table.WARNING,
+blockquote.NOTE,
+blockquote.TIP,
+table.CALSTABLE {
+ -moz-box-shadow: 3px 3px 5px #DFDFDF;
+ -webkit-box-shadow: 3px 3px 5px #DFDFDF;
+ -khtml-box-shadow: 3px 3px 5px #DFDFDF;
+ -o-box-shadow: 3px 3px 5px #DFDFDF;
+ box-shadow: 3px 3px 5px #DFDFDF;
+}
+
+pre.LITERALLAYOUT,
+.SCREEN,
+.SYNOPSIS,
+.PROGRAMLISTING,
+.REFSYNOPSISDIV p,
+table.CAUTION,
+table.WARNING,
+blockquote.NOTE,
+blockquote.TIP {
+ color: black;
+ border-width: 1px;
+ border-style: solid;
+ padding: 2ex;
+ margin: 2ex 0 2ex 2ex;
+ overflow: auto;
+ -moz-border-radius: 8px;
+ -webkit-border-radius: 8px;
+ -khtml-border-radius: 8px;
+ border-radius: 8px;
+}
+
+pre.LITERALLAYOUT,
+pre.SYNOPSIS,
+pre.PROGRAMLISTING,
+.REFSYNOPSISDIV p,
+.SCREEN {
+ border-color: #CFCFCF;
+ background-color: #F7F7F7;
+}
+
+blockquote.NOTE,
+blockquote.TIP {
+ border-color: #DBDBCC;
+ background-color: #EEEEDD;
+ padding: 14px;
+ width: 572px;
+}
+
+blockquote.NOTE,
+blockquote.TIP,
+table.CAUTION,
+table.WARNING {
+ margin: 4ex auto;
+}
+
+blockquote.NOTE p,
+blockquote.TIP p {
+ margin: 0;
+}
+
+blockquote.NOTE pre,
+blockquote.NOTE code,
+blockquote.TIP pre,
+blockquote.TIP code {
+ margin-left: 0;
+ margin-right: 0;
+ -moz-box-shadow: none;
+ -webkit-box-shadow: none;
+ -khtml-box-shadow: none;
+ -o-box-shadow: none;
+ box-shadow: none;
+}
+
+.emphasis,
+.c2 {
+ font-weight: bold;
+}
+
+.REPLACEABLE {
+ font-style: italic;
+}
+
+/* Table Styles */
+
+table {
+ margin-left: 2ex;
+}
+
+table.CALSTABLE td,
+table.CALSTABLE th,
+table.CAUTION td,
+table.CAUTION th,
+table.WARNING td,
+table.WARNING th {
+ border-style: solid;
+}
+
+table.CALSTABLE,
+table.CAUTION,
+table.WARNING {
+ border-spacing: 0;
+ border-collapse: collapse;
+}
+
+table.CALSTABLE
+{
+ margin: 2ex 0 2ex 2ex;
+ background-color: #E0ECEF;
+ border: 2px solid #A7C6DF;
+}
+
+table.CALSTABLE tr:hover td
+{
+ background-color: #EFEFEF;
+}
+
+table.CALSTABLE td {
+ background-color: #FFF;
+}
+
+table.CALSTABLE td,
+table.CALSTABLE th {
+ border: 1px solid #A7C6DF;
+ padding: 0.5ex 0.5ex;
+}
+
+table.CAUTION,
+table.WARNING {
+ border-collapse: separate;
+ display: block;
+ padding: 0;
+ max-width: 600px;
+}
+
+table.CAUTION {
+ background-color: #F5F5DC;
+ border-color: #DEDFA7;
+}
+
+table.WARNING {
+ background-color: #FFD7D7;
+ border-color: #DF421E;
+}
+
+table.CAUTION td,
+table.CAUTION th,
+table.WARNING td,
+table.WARNING th {
+ border-width: 0;
+ padding-left: 2ex;
+ padding-right: 2ex;
+}
+
+table.CAUTION td,
+table.CAUTION th {
+ border-color: #F3E4D5
+}
+
+table.WARNING td,
+table.WARNING th {
+ border-color: #FFD7D7;
+}
+
+td.c1,
+td.c2,
+td.c3,
+td.c4,
+td.c5,
+td.c6 {
+ font-size: 1.1em;
+ font-weight: bold;
+ border-bottom: 0px solid #FFEFEF;
+ padding: 1ex 2ex 0;
+}
+
+/* Link Styles */
+
+#docNav a {
+ font-weight: bold;
+}
+
+a:link,
+a:visited,
+a:active,
+a:hover {
+ text-decoration: underline;
+}
+
+a:link,
+a:active {
+ color:#0066A2;
+}
+
+a:visited {
+ color:#004E66;
+}
+
+a:hover {
+ color:#000000;
+}
+
+#docFooter a:link,
+#docFooter a:visited,
+#docFooter a:active {
+ color:#666;
+}
+
+#docContainer code.FUNCTION tt {
+ font-size: 1em;
+}
diff --git a/docs/documentation/94/media/css/docs.css~ b/docs/documentation/94/media/css/docs.css~
new file mode 100644
index 0000000..0cbe23e
--- /dev/null
+++ b/docs/documentation/94/media/css/docs.css~
@@ -0,0 +1,450 @@
+/* PostgreSQL.org Documentation Style */
+
+ at import url("global.css");
+ at import url("table.css");
+ at import url("text.css");
+
+body {
+ font-size: 76%;
+}
+
+div.NAVHEADER table {
+ margin-left: 0;
+}
+
+/* Container Definitions */
+
+#docContainerWrap {
+ text-align: center; /* Win IE5 */
+}
+
+#docContainer {
+ margin: 0 auto;
+ width: 90%;
+ padding-bottom: 2em;
+ display: block;
+ text-align: left; /* Win IE5 */
+}
+
+#docHeader {
+ background-image: url("../img/docs/bg_hdr.png");
+ height: 83px;
+ margin: 0px;
+ padding: 0px;
+ display: block;
+}
+
+#docHeaderLogo {
+ position: relative;
+ width: 206px;
+ height: 83px;
+ border: 0px;
+ padding: 0px;
+ margin: 0 0 0 20px;
+}
+
+#docHeaderLogo img {
+ border: 0px;
+}
+
+#docNavSearchContainer {
+ padding-bottom: 2px;
+}
+
+#docNav, #docVersions {
+ position: relative;
+ text-align: left;
+ margin-left: 10px;
+ margin-top: 5px;
+ color: #666;
+ font-size: 0.95em;
+}
+
+#docSearch {
+ position: relative;
+ text-align: right;
+ padding: 0;
+ margin: 0;
+ color: #666;
+}
+
+#docTextSize {
+ text-align: right;
+ white-space: nowrap;
+ margin-top: 7px;
+ font-size: 0.95em;
+}
+
+#docSearch form {
+ position: relative;
+ top: 5px;
+ right: 0;
+ margin: 0; /* need for IE 5.5 OSX */
+ text-align: right; /* need for IE 5.5 OSX */
+ white-space: nowrap; /* for Opera */
+}
+
+#docSearch form label {
+ color: #666;
+ font-size: 0.95em;
+}
+
+#docSearch form input {
+ font-size: 0.95em;
+}
+
+#docSearch form #submit {
+ font-size: 0.95em;
+ background: #7A7A7A;
+ color: #fff;
+ border: 1px solid #7A7A7A;
+ padding: 1px 4px;
+}
+
+#docSearch form #q {
+ width: 170px;
+ font-size: 0.95em;
+ border: 1px solid #7A7A7A;
+ background: #E1E1E1;
+ color: #000000;
+ padding: 2px;
+}
+
+.frmDocSearch {
+ padding: 0;
+ margin: 0;
+ display: inline;
+}
+
+.inpDocSearch {
+ padding: 0;
+ margin: 0;
+ color: #000;
+}
+
+#docContent {
+ position: relative;
+ margin-left: 10px;
+ margin-right: 10px;
+ margin-top: 40px;
+}
+
+#docFooter {
+ position: relative;
+ font-size: 0.9em;
+ color: #666;
+ line-height: 1.3em;
+ margin-left: 10px;
+ margin-right: 10px;
+}
+
+#docComments {
+ margin-top: 10px;
+}
+
+#docClear {
+ clear: both;
+ margin: 0;
+ padding: 0;
+}
+
+/* Heading Definitions */
+
+h1, h2, h3 {
+ font-weight: bold;
+ margin-top: 2ex;
+}
+
+h1 {
+ font-size: 1.4em;
+}
+
+h2 {
+ font-size: 1.2em !important;
+}
+
+h3 {
+ font-size: 1.1em;
+}
+
+h1 a:hover {
+ color: #EC5800;
+ text-decoration: none;
+}
+
+h2 a:hover,
+h3 a:hover,
+h4 a:hover {
+ color: #666666;
+ text-decoration: none;
+}
+
+/* Text Styles */
+
+div.SECT2 {
+ margin-top: 4ex;
+}
+
+div.SECT3 {
+ margin-top: 3ex;
+ margin-left: 3ex;
+}
+
+.txtCurrentLocation {
+ font-weight: bold;
+}
+
+p, ol, ul, li {
+ line-height: 1.5em;
+}
+
+.txtCommentsWrap {
+ border: 2px solid #F5F5F5;
+ width: 100%;
+}
+
+.txtCommentsContent {
+ background: #F5F5F5;
+ padding: 3px;
+}
+
+.txtCommentsPoster {
+ float: left;
+}
+
+.txtCommentsDate {
+ float: right;
+}
+
+.txtCommentsComment {
+ padding: 3px;
+}
+
+#docContainer p code,
+#docContainer dt code,
+#docContainer pre code,
+#docContainer pre tt,
+#docContainer pre pre,
+#docContainer tt tt,
+#docContainer tt code,
+#docContainer tt pre {
+ font-size: 1.5em;
+}
+
+pre.LITERALLAYOUT,
+.SCREEN,
+.SYNOPSIS,
+.PROGRAMLISTING,
+.REFSYNOPSISDIV p,
+table.CAUTION,
+table.WARNING,
+blockquote.NOTE,
+blockquote.TIP,
+table.CALSTABLE {
+ -moz-box-shadow: 3px 3px 5px #DFDFDF;
+ -webkit-box-shadow: 3px 3px 5px #DFDFDF;
+ -khtml-box-shadow: 3px 3px 5px #DFDFDF;
+ -o-box-shadow: 3px 3px 5px #DFDFDF;
+ box-shadow: 3px 3px 5px #DFDFDF;
+}
+
+pre.LITERALLAYOUT,
+.SCREEN,
+.SYNOPSIS,
+.PROGRAMLISTING,
+.REFSYNOPSISDIV p,
+table.CAUTION,
+table.WARNING,
+blockquote.NOTE,
+blockquote.TIP {
+ color: black;
+ border-width: 1px;
+ border-style: solid;
+ padding: 2ex;
+ margin: 2ex 0 2ex 2ex;
+ overflow: auto;
+ -moz-border-radius: 8px;
+ -webkit-border-radius: 8px;
+ -khtml-border-radius: 8px;
+ border-radius: 8px;
+}
+
+pre.LITERALLAYOUT,
+pre.SYNOPSIS,
+pre.PROGRAMLISTING,
+.REFSYNOPSISDIV p,
+.SCREEN {
+ border-color: #CFCFCF;
+ background-color: #F7F7F7;
+}
+
+blockquote.NOTE,
+blockquote.TIP {
+ border-color: #DBDBCC;
+ background-color: #EEEEDD;
+ padding: 14px;
+ width: 572px;
+}
+
+blockquote.NOTE,
+blockquote.TIP,
+table.CAUTION,
+table.WARNING {
+ margin: 4ex auto;
+}
+
+blockquote.NOTE p,
+blockquote.TIP p {
+ margin: 0;
+}
+
+blockquote.NOTE pre,
+blockquote.NOTE code,
+blockquote.TIP pre,
+blockquote.TIP code {
+ margin-left: 0;
+ margin-right: 0;
+ -moz-box-shadow: none;
+ -webkit-box-shadow: none;
+ -khtml-box-shadow: none;
+ -o-box-shadow: none;
+ box-shadow: none;
+}
+
+.emphasis,
+.c2 {
+ font-weight: bold;
+}
+
+.REPLACEABLE {
+ font-style: italic;
+}
+
+/* Table Styles */
+
+table {
+ margin-left: 2ex;
+}
+
+table.CALSTABLE td,
+table.CALSTABLE th,
+table.CAUTION td,
+table.CAUTION th,
+table.WARNING td,
+table.WARNING th {
+ border-style: solid;
+}
+
+table.CALSTABLE,
+table.CAUTION,
+table.WARNING {
+ border-spacing: 0;
+ border-collapse: collapse;
+}
+
+table.CALSTABLE
+{
+ margin: 2ex 0 2ex 2ex;
+ background-color: #E0ECEF;
+ border: 2px solid #A7C6DF;
+}
+
+table.CALSTABLE tr:hover td
+{
+ background-color: #EFEFEF;
+}
+
+table.CALSTABLE td {
+ background-color: #FFF;
+}
+
+table.CALSTABLE td,
+table.CALSTABLE th {
+ border: 1px solid #A7C6DF;
+ padding: 0.5ex 0.5ex;
+}
+
+table.CAUTION,
+table.WARNING {
+ border-collapse: separate;
+ display: block;
+ padding: 0;
+ max-width: 600px;
+}
+
+table.CAUTION {
+ background-color: #F5F5DC;
+ border-color: #DEDFA7;
+}
+
+table.WARNING {
+ background-color: #FFD7D7;
+ border-color: #DF421E;
+}
+
+table.CAUTION td,
+table.CAUTION th,
+table.WARNING td,
+table.WARNING th {
+ border-width: 0;
+ padding-left: 2ex;
+ padding-right: 2ex;
+}
+
+table.CAUTION td,
+table.CAUTION th {
+ border-color: #F3E4D5
+}
+
+table.WARNING td,
+table.WARNING th {
+ border-color: #FFD7D7;
+}
+
+td.c1,
+td.c2,
+td.c3,
+td.c4,
+td.c5,
+td.c6 {
+ font-size: 1.1em;
+ font-weight: bold;
+ border-bottom: 0px solid #FFEFEF;
+ padding: 1ex 2ex 0;
+}
+
+/* Link Styles */
+
+#docNav a {
+ font-weight: bold;
+}
+
+a:link,
+a:visited,
+a:active,
+a:hover {
+ text-decoration: underline;
+}
+
+a:link,
+a:active {
+ color:#0066A2;
+}
+
+a:visited {
+ color:#004E66;
+}
+
+a:hover {
+ color:#000000;
+}
+
+#docFooter a:link,
+#docFooter a:visited,
+#docFooter a:active {
+ color:#666;
+}
+
+#docContainer code.FUNCTION tt {
+ font-size: 1em;
+}
diff --git a/docs/documentation/94/media/css/global.css b/docs/documentation/94/media/css/global.css
new file mode 100644
index 0000000..1706e11
--- /dev/null
+++ b/docs/documentation/94/media/css/global.css
@@ -0,0 +1,98 @@
+/*
+ PostgreSQL.org - Global Styles
+*/
+
+body {
+ margin: 0;
+ padding: 0;
+ font-family: verdana, sans-serif;
+ font-size: 69%;
+ color: #000;
+ background-color: #fff;
+}
+
+h1 {
+ font-size: 1.4em;
+ font-weight: bold;
+ margin-top: 0em;
+ margin-bottom: 0em;
+}
+
+h2 {
+ font-size: 1.2em;
+ margin: 1.2em 0em 1.2em 0em;
+ font-weight: bold;
+}
+
+h3 {
+ font-size: 1.0em;
+ margin: 1.2em 0em 1.2em 0em;
+ font-weight: bold;
+}
+
+h4 {
+ font-size: 0.95em;
+ margin: 1.2em 0em 1.2em 0em;
+ font-weight: normal;
+}
+
+h5 {
+ font-size: 0.9em;
+ margin: 1.2em 0em 1.2em 0em;
+ font-weight: normal;
+}
+
+h6 {
+ font-size: 0.85em;
+ margin: 1.2em 0em 1.2em 0em;
+ font-weight: normal;
+}
+
+img {
+ border: 0;
+}
+
+ol, ul, li {/*
+ list-style: none;*/
+ font-size: 1.0em;
+ line-height: 1.2em;
+ margin-top: 0.2em;
+ margin-bottom: 0.1em;
+}
+
+p {
+ font-size: 1.0em;
+ line-height: 1.2em;
+ margin: 1.2em 0em;
+}
+
+td p {
+ margin: 0em 0em 1.2em;
+}
+
+li > p {
+ margin-top: 0.2em;
+}
+
+pre {
+ font-family: monospace;
+ font-size: 1.0em;
+}
+
+div#pgContentWrap code {
+ font-size: 1.2em;
+ padding: 1em;
+ margin: 2ex 0 2ex 2ex;
+ background: #F7F7F7;
+ border: 1px solid #CFCFCF;
+ -moz-border-radius: 8px;
+ -webkit-border-radius: 8px;
+ -khtml-border-radius: 8px;
+ border-radius: 8px;
+ display: block;
+ overflow: auto;
+}
+
+strong, b {
+ font-weight: bold;
+}
diff --git a/docs/documentation/94/media/css/table.css b/docs/documentation/94/media/css/table.css
new file mode 100644
index 0000000..cf2fd7d
--- /dev/null
+++ b/docs/documentation/94/media/css/table.css
@@ -0,0 +1,101 @@
+/*
+ PostgreSQL.org - Table Styles
+*/
+
+div.tblBasic h2 {
+ margin: 25px 0 .5em 0;
+}
+
+div.tblBasic table {
+ background: #F5F5F5 url(../img/layout/nav_tbl_top_lft.png) top left no-repeat;
+ margin-left: 2ex;
+ margin-bottom: 15px;
+}
+
+div.tblBasic table th {
+ padding-top: 20px;
+ border-bottom: 1px solid #EFEFEF;
+ vertical-align: bottom;
+}
+
+div.tblBasic table td {
+ border-bottom: 1px solid #EFEFEF;
+}
+
+div.tblBasic table th,
+div.tblBasic table td {
+ padding: 8px 11px;
+ color: #555555;
+}
+
+div.tblBasic table td.indented {
+ text-indent: 30px;
+}
+
+div.tblBasic table.tblCompact td {
+ padding: 3px 3px;
+}
+
+div.tblBasic table tr.lastrow td {
+ border-bottom: none;
+ padding-bottom: 13px;
+}
+
+div.tblBasic table.tblCompact tr.lastrow td {
+ padding-bottom: 3px;
+}
+
+div.tblBasic table tr.lastrow td.colFirstT,
+div.tblBasic table tr.lastrow td.colFirst {
+ background: url(../img/layout/nav_tbl_btm_lft.png) bottom left no-repeat;
+}
+
+div.tblBasic table.tblBasicGrey th.colLast,
+div.tblBasic table.tblCompact th.colLast {
+ background: #F5F5F5 url(../img/layout/nav_tbl_top_rgt.png) top right no-repeat;
+}
+
+div.tblBasic table.tblBasicGrey tr.lastrow td.colLastT,
+div.tblBasic table.tblBasicGrey tr.lastrow td.colLast,
+div.tblBasic table.tblCompact tr.lastrow td.colLast,
+div.tblBasic table.tblCompact tr.lastrow td.colLastT{
+ background: #F5F5F5 url(../img/layout/nav_tbl_btm_rgt.png) bottom right no-repeat;
+}
+
+div.tblBasic table.tblBasicGrey tr.firstrow td.colLastT,
+div.tblBasic table.tblBasicGrey tr.firstrow td.colLast,
+div tblBasic table.tblCompact tr.firstrow td.colLast {
+ background: #F5F5F5 url(../img/layout/nav_tbl_top_rgt.png) top right no-repeat;
+}
+
+div.tblBasic table th.colMid,
+div.tblBasic table td.colMid,
+div.tblBasic table th.colLast,
+div.tblBasic table td.colLast {
+ background-color: #F5F5F5 ;
+}
+
+div.tblBasic table th.colLastC,
+div.tblBasic table td.colFirstC,
+div.tblBasic table td.colLastC {
+ text-align: center;
+}
+
+div.tblBasic table th.colLastR,
+div.tblBasic table td.colFirstR,
+div.tblBasic table td.colLastR {
+ text-align: right;
+}
+
+div.tblBasic table td.colFirstT,
+div.tblBasic table td.colMidT,
+div.tblBasic table td.colLastT {
+ vertical-align: top;
+}
+
+div.tblBasic table th.colLastRT,
+div.tblBasic table td.colFirstRT,
+div.tblBasic table td.colLastRT {
+ text-align: right;
+ vertical-align: top;
+}
diff --git a/docs/documentation/94/media/css/table.css~ b/docs/documentation/94/media/css/table.css~
new file mode 100644
index 0000000..3aba3ca
--- /dev/null
+++ b/docs/documentation/94/media/css/table.css~
@@ -0,0 +1,101 @@
+/*
+ PostgreSQL.org - Table Styles
+*/
+
+div.tblBasic h2 {
+ margin: 25px 0 .5em 0;
+}
+
+div.tblBasic table {
+ background: #F5F5F5 url(media/img/layout/nav_tbl_top_lft.png) top left no-repeat;
+ margin-left: 2ex;
+ margin-bottom: 15px;
+}
+
+div.tblBasic table th {
+ padding-top: 20px;
+ border-bottom: 1px solid #EFEFEF;
+ vertical-align: bottom;
+}
+
+div.tblBasic table td {
+ border-bottom: 1px solid #EFEFEF;
+}
+
+div.tblBasic table th,
+div.tblBasic table td {
+ padding: 8px 11px;
+ color: #555555;
+}
+
+div.tblBasic table td.indented {
+ text-indent: 30px;
+}
+
+div.tblBasic table.tblCompact td {
+ padding: 3px 3px;
+}
+
+div.tblBasic table tr.lastrow td {
+ border-bottom: none;
+ padding-bottom: 13px;
+}
+
+div.tblBasic table.tblCompact tr.lastrow td {
+ padding-bottom: 3px;
+}
+
+div.tblBasic table tr.lastrow td.colFirstT,
+div.tblBasic table tr.lastrow td.colFirst {
+ background: url(media/img/layout/nav_tbl_btm_lft.png) bottom left no-repeat;
+}
+
+div.tblBasic table.tblBasicGrey th.colLast,
+div.tblBasic table.tblCompact th.colLast {
+ background: #F5F5F5 url(media/img/layout/nav_tbl_top_rgt.png) top right no-repeat;
+}
+
+div.tblBasic table.tblBasicGrey tr.lastrow td.colLastT,
+div.tblBasic table.tblBasicGrey tr.lastrow td.colLast,
+div.tblBasic table.tblCompact tr.lastrow td.colLast,
+div.tblBasic table.tblCompact tr.lastrow td.colLastT{
+ background: #F5F5F5 url(media/img/layout/nav_tbl_btm_rgt.png) bottom right no-repeat;
+}
+
+div.tblBasic table.tblBasicGrey tr.firstrow td.colLastT,
+div.tblBasic table.tblBasicGrey tr.firstrow td.colLast,
+div tblBasic table.tblCompact tr.firstrow td.colLast {
+ background: #F5F5F5 url(media/img/layout/nav_tbl_top_rgt.png) top right no-repeat;
+}
+
+div.tblBasic table th.colMid,
+div.tblBasic table td.colMid,
+div.tblBasic table th.colLast,
+div.tblBasic table td.colLast {
+ background-color: #F5F5F5 ;
+}
+
+div.tblBasic table th.colLastC,
+div.tblBasic table td.colFirstC,
+div.tblBasic table td.colLastC {
+ text-align: center;
+}
+
+div.tblBasic table th.colLastR,
+div.tblBasic table td.colFirstR,
+div.tblBasic table td.colLastR {
+ text-align: right;
+}
+
+div.tblBasic table td.colFirstT,
+div.tblBasic table td.colMidT,
+div.tblBasic table td.colLastT {
+ vertical-align: top;
+}
+
+div.tblBasic table th.colLastRT,
+div.tblBasic table td.colFirstRT,
+div.tblBasic table td.colLastRT {
+ text-align: right;
+ vertical-align: top;
+}
diff --git a/docs/documentation/94/media/css/text.css b/docs/documentation/94/media/css/text.css
new file mode 100644
index 0000000..902a118
--- /dev/null
+++ b/docs/documentation/94/media/css/text.css
@@ -0,0 +1,162 @@
+/*
+ PostgreSQL.org - Text Styles
+*/
+
+/* Heading Definitions */
+
+h1 {
+ color: #EC5800;
+}
+
+h2 {
+ color: #666;
+}
+
+h3 {
+ color: #666;
+}
+
+h4 {
+ color: #666;
+}
+
+/* Text Styles */
+
+.txtColumn1 {
+ width: 50%;
+ line-height: 1.3em;
+}
+
+.txtColumn2 {
+ width: 50%;
+ line-height: 1.5em;
+}
+
+.txtCurrentLocation {
+ font-weight: bold;
+}
+
+.txtDivider {
+ font-size: 0.8em;
+ color: #E1E1E1;
+ padding-left: 4px;
+ padding-right: 4px;
+}
+
+.txtNewsEvent {
+ font-size: 0.9em;
+ color: #0094C7;
+}
+
+.txtDate {
+ font-size: 0.9em;
+ color: #666;
+}
+
+.txtMediumGrey {
+ color: #666;
+}
+
+.txtFormLabel {
+ color: #666;
+ font-weight: bold;
+ text-align: right;
+ vertical-align: top;
+}
+
+.txtRequiredField {
+ color: #EC5800;
+}
+
+.txtImportant {
+ color: #EC5800;
+}
+
+.txtOffScreen {
+ position: absolute;
+ left: -1999px;
+ width: 1990px;
+}
+
+#txtFrontFeatureHeading {
+ padding-bottom: 1.1em;
+}
+
+#txtFrontFeatureLink a {
+ font-size: 1.2em;
+ font-weight: bold;
+ padding-left: 5px;
+}
+
+#txtFrontUserText {
+ font-size: 1.0em;
+ color: #666;
+ margin-top: 12px;
+}
+
+#txtFrontUserName {
+ font-size: 0.9em;
+ color: #666;
+ margin-top: 9px;
+ font-weight: bold;
+}
+
+#txtFrontUserLink {
+ font-size: 0.9em;
+ color: #666;
+ margin-top: 11px;
+ margin-left: 1px;
+}
+
+#txtFrontUserLink img {
+ padding-right: 5px;
+}
+
+#txtFrontSupportUsText {
+ font-size: 1.0em;
+ margin-top: 9px;
+}
+
+#txtFrontSupportUsLink {
+ font-size: 0.9em;
+ margin-top: 6px;
+}
+
+#txtFrontSupportUsLink img {
+ padding-right: 7px;
+}
+
+/* Link Styles */
+
+a:link { color:#0085B0; text-decoration: underline; }
+a:visited { color:#004E66; text-decoration: underline; }
+a:active { color:#0085B0; text-decoration: underline; }
+a:hover { color:#000000; text-decoration: underline; }
+
+#pgFooter a:link { color:#666; text-decoration: underline; }
+#pgFooter a:visited { color:#666; text-decoration: underline; }
+#pgFooter a:active { color:#666; text-decoration: underline; }
+#pgFooter a:hover { color:#000000; text-decoration: underline; }
+
+#txtFrontUserName a:link { color:#666; text-decoration: underline; }
+#txtFrontUserName a:visited { color:#666; text-decoration: underline; }
+#txtFrontUserName a:active { color:#666; text-decoration: underline; }
+#txtFrontUserName a:hover { color:#000; text-decoration: underline; }
+
+#txtArchives a:visited { color:#00536E; text-decoration: underline; }
+#txtArchives pre { word-wrap: break-word; font-size: 150%; }
+#txtArchives tt { word-wrap: break-word; font-size: 150%; }
+
+#pgFrontUSSContainer h2, #pgFrontUSSContainer h3 {
+ margin: 0;
+ padding: 0;
+}
+
+#pgFrontNewsEventsContainer h2, #pgFrontNewsEventsContainer h3 {
+ margin: 0;
+ padding: 0;
+}
+
+#pgFrontNewsEventsContainer h3 img {
+ margin-bottom: 10px;
+}
diff --git a/docs/documentation/94/media/favicon.ico b/docs/documentation/94/media/favicon.ico
new file mode 100644
index 0000000..a1cc036
Binary files /dev/null and b/docs/documentation/94/media/favicon.ico differ
diff --git a/docs/documentation/94/media/img/docs/bg_hdr.png b/docs/documentation/94/media/img/docs/bg_hdr.png
new file mode 100644
index 0000000..07c3b65
Binary files /dev/null and b/docs/documentation/94/media/img/docs/bg_hdr.png differ
diff --git a/docs/documentation/94/media/img/layout/hdr_left3a.png b/docs/documentation/94/media/img/layout/hdr_left3a.png
new file mode 100644
index 0000000..fb1f70d
Binary files /dev/null and b/docs/documentation/94/media/img/layout/hdr_left3a.png differ
diff --git a/docs/documentation/94/media/img/layout/nav_tbl_btm.png b/docs/documentation/94/media/img/layout/nav_tbl_btm.png
new file mode 100644
index 0000000..ec897af
Binary files /dev/null and b/docs/documentation/94/media/img/layout/nav_tbl_btm.png differ
diff --git a/docs/documentation/94/media/img/layout/nav_tbl_top.png b/docs/documentation/94/media/img/layout/nav_tbl_top.png
new file mode 100644
index 0000000..3a22368
Binary files /dev/null and b/docs/documentation/94/media/img/layout/nav_tbl_top.png differ
diff --git a/docs/documentation/94/outer-joins-escape.md b/docs/documentation/94/outer-joins-escape.md
new file mode 100644
index 0000000..6ab79e5
--- /dev/null
+++ b/docs/documentation/94/outer-joins-escape.md
@@ -0,0 +1,17 @@
+---
+layout: default_docs
+title: Escape for outer joins
+header: Chapter 8. JDBC escapes
+resource: media
+previoustitle: Chapter 8. JDBC escapes
+previous: escapes.html
+nexttitle: Date-time escapes
+next: escapes-datetime.html
+---
+
+You can specify outer joins using the following syntax: `{oj table (LEFT|RIGHT|FULL) OUTER JOIN (table | outer-join)
+ON search-condition }`
+
+For example :
+
+`rs = stmt.executeQuery( "select * from {oj a left outer join b on (a.i=b.i)} ");`
\ No newline at end of file
diff --git a/docs/documentation/94/prepare.md b/docs/documentation/94/prepare.md
new file mode 100644
index 0000000..d57b525
--- /dev/null
+++ b/docs/documentation/94/prepare.md
@@ -0,0 +1,25 @@
+---
+layout: default_docs
+title: Preparing the Database Server for JDBC
+header: Chapter 2. Setting up the JDBC Driver
+resource: media
+previoustitle: Setting up the Class Path
+previous: classpath.html
+nexttitle: Creating a Database
+next: your-database.html
+---
+
+Because Java does not support using unix sockets the PostgreSQL™ server must be
+configured to allow TCP/IP connections. Starting with server version 8.0 TCP/IP
+connections are allowed from `localhost`. To allow connections to other interfaces
+than the loopback interface, you must modify the `postgresql.conf` file's `listen_addresses`
+setting.
+
+For server versions prior to 8.0 the server does not listen on any interface by
+default, and you must set `tcpip_socket = true` in the `postgresql.conf` file.
+
+Once you have made sure the server is correctly listening for TCP/IP connections
+the next step is to verify that users are allowed to connect to the server. Client
+authentication is setup in `pg_hba.conf`. Refer to the main PostgreSQL™ documentation
+for details. The JDBC driver supports the `trust`, `ident`, `password`, `md5`, and
+`crypt` authentication methods.
\ No newline at end of file
diff --git a/docs/documentation/94/query.md b/docs/documentation/94/query.md
new file mode 100644
index 0000000..88fa831
--- /dev/null
+++ b/docs/documentation/94/query.md
@@ -0,0 +1,113 @@
+---
+layout: default_docs
+title: Chapter 5. Issuing a Query and Processing the Result
+header: Chapter 5. Issuing a Query and Processing the Result
+resource: media
+previoustitle: Custom SSLSocketFactory
+previous: ssl-factory.html
+nexttitle: Using the Statement or PreparedStatement Interface
+next: statement.html
+---
+
+**Table of Contents**
+
+* [Getting results based on a cursor](query.html#query-with-cursor)
+* [Using the `Statement` or `PreparedStatement` Interface](statement.html)
+* [Using the `ResultSet` Interface](resultset.html)
+* [Performing Updates](update.html)
+* [Creating and Modifying Database Objects](ddl.html)
+
+Any time you want to issue SQL statements to the database, you require a `Statement`
+or `PreparedStatement` instance. Once you have a `Statement` or `PreparedStatement`,
+you can use issue a query. This will return a `ResultSet` instance, which contains
+the entire result (see the section called [“Getting results based on a cursor”](query.html#query-with-cursor)
+here for how to alter this behaviour). [Example 5.1, “Processing a Simple Query in JDBC”](query.html#query-example)
+illustrates this process.
+
+<a name="query-example"></a>
+**Example 5.1. Processing a Simple Query in JDBC**
+
+This example will issue a simple query and print out the first column of each
+row using a `Statement`.
+
+`Statement st = conn.createStatement();`
+`ResultSet rs = st.executeQuery("SELECT * FROM mytable WHERE columnfoo = 500");`
+`while (rs.next())`
+`{`
+ `System.out.print("Column 1 returned ");`
+ `System.out.println(rs.getString(1));`
+`}`
+`rs.close();`
+`st.close();`
+
+This example issues the same query as before but uses a `PreparedStatement` and
+a bind value in the query.
+
+`int foovalue = 500;`
+`PreparedStatement st = conn.prepareStatement("SELECT * FROM mytable WHERE columnfoo = ?");`
+`st.setInt(1, foovalue);`
+`ResultSet rs = st.executeQuery();`
+`while (rs.next())`
+`{`
+ `System.out.print("Column 1 returned ");`
+ `System.out.println(rs.getString(1));`
+`}`
+`rs.close();`
+`st.close();`
+
+<a name="query-with-cursor"></a>
+# Getting results based on a cursor
+
+By default the driver collects all the results for the query at once. This can
+be inconvenient for large data sets so the JDBC driver provides a means of basing
+a `ResultSet` on a database cursor and only fetching a small number of rows.
+
+A small number of rows are cached on the client side of the connection and when
+exhausted the next block of rows is retrieved by repositioning the cursor.
+
+### Note
+
+> Cursor based `ResultSets` cannot be used in all situations. There a number of
+ restrictions which will make the driver silently fall back to fetching the
+ whole `ResultSet` at once.
+
+* The connection to the server must be using the V3 protocol. This is the default
+ for (and is only supported by) server versions 7.4 and later.
+* The `Connection` must not be in autocommit mode. The backend closes cursors at
+ the end of transactions, so in autocommit mode the backend will have
+ closed the cursor before anything can be fetched from it.
+*The `Statement` must be created with a `ResultSet` type of `ResultSet.TYPE_FORWARD_ONLY`.
+ This is the default, so no code will need to be rewritten to take advantage
+ of this, but it also means that you cannot scroll backwards or otherwise
+ jump around in the `ResultSet`.
+* The query given must be a single statement, not multiple statements strung
+ together with semicolons.
+
+<a name="fetchsize-example"></a>
+**Example 5.2. Setting fetch size to turn cursors on and off.**
+
+Changing code to cursor mode is as simple as setting the fetch size of the
+`Statement` to the appropriate size. Setting the fetch size back to 0 will cause
+all rows to be cached (the default behaviour).
+
+`// make sure autocommit is off`
+`conn.setAutoCommit(false);`
+`Statement st = conn.createStatement();`<br /><br />
+`// Turn use of the cursor on.`
+`st.setFetchSize(50);`
+`ResultSet rs = st.executeQuery("SELECT * FROM mytable");`
+`while (rs.next())`
+`{`
+ `System.out.print("a row was returned.");`
+`}`
+`rs.close();`<br /><br />
+`// Turn the cursor off.`
+`st.setFetchSize(0);`
+`rs = st.executeQuery("SELECT * FROM mytable");`
+`while (rs.next())`
+`{`
+ `System.out.print("many rows were returned.");`
+`}`
+`rs.close();`<br /><br />
+`// Close the statement.`
+`st.close();`
\ No newline at end of file
diff --git a/docs/documentation/94/reading.md b/docs/documentation/94/reading.md
new file mode 100644
index 0000000..10428bf
--- /dev/null
+++ b/docs/documentation/94/reading.md
@@ -0,0 +1,18 @@
+---
+layout: default_docs
+title: Chapter 12. Further Reading
+header: Chapter 12. Further Reading
+resource: media
+previoustitle: Data Sources and JNDI
+previous: jndi.html
+nexttitle: The PostgreSQL™ JDBC Interface
+next: index.html
+---
+
+If you have not yet read it, you are advised you read the JDBC API Documentation
+(supplied with Oracle's JDK) and the JDBC Specification. Both are available from
+[http://www.oracle.com/technetwork/java/javase/jdbc/index.html](http://www.oracle.com/technetwork/java/javase/jdbc/index.html).
+
+[http://jdbc.postgresql.org/index.html](http://jdbc.postgresql.org/index.html)
+contains updated information not included in this manual including Javadoc class
+documentation and a FAQ. Additionally it offers precompiled drivers.
diff --git a/docs/documentation/94/resultset.md b/docs/documentation/94/resultset.md
new file mode 100644
index 0000000..58c5f5a
--- /dev/null
+++ b/docs/documentation/94/resultset.md
@@ -0,0 +1,19 @@
+---
+layout: default_docs
+title: Using the ResultSet Interface
+header: Chapter 5. Issuing a Query and Processing the Result
+resource: media
+previoustitle: Using the Statement or PreparedStatement Interface
+previous: statement.html
+nexttitle: Performing Updates
+next: update.html
+---
+
+The following must be considered when using the `ResultSet` interface:
+
+* Before reading any values, you must call `next()`. This returns true if there
+ is a result, but more importantly, it prepares the row for processing.
+* You must close a `ResultSet` by calling `close()` once you have finished using
+ it.
+* Once you make another query with the `Statement` used to create a `ResultSet`,
+ the currently open `ResultSet` instance is closed automatically.
\ No newline at end of file
diff --git a/docs/documentation/94/server-prepare.md b/docs/documentation/94/server-prepare.md
new file mode 100644
index 0000000..446e7ff
--- /dev/null
+++ b/docs/documentation/94/server-prepare.md
@@ -0,0 +1,121 @@
+---
+layout: default_docs
+title: Server Prepared Statements
+header: Chapter 9. PostgreSQL™ Extensions to the JDBC API
+resource: media
+previoustitle: Listen / Notify
+previous: listennotify.html
+nexttitle: Chapter 10. Using the Driver in a Multithreaded or a Servlet Environment
+next: thread.html
+---
+
+The PostgreSQL™ server allows clients to compile sql statements that are expected
+to be reused to avoid the overhead of parsing and planning the statement for every
+execution. This functionality is available at the SQL level via PREPARE and EXECUTE
+beginning with server version 7.3, and at the protocol level beginning with server
+version 7.4, but as Java developers we really just want to use the standard
+`PreparedStatement` interface.
+
+### Note
+
+> Previous versions of the driver used PREPARE and EXECUTE to implement
+server-prepared statements. This is supported on all server versions beginning
+with 7.3, but produced application-visible changes in query results, such as
+missing ResultSet metadata and row update counts. The current driver uses the V3
+protocol-level equivalents which avoid these changes in query results, but the
+V3 protocol is only available beginning with server version 7.4. Enabling server-prepared
+statements will have no affect when connected to a 7.3 server or when explicitly
+using the V2 protocol to connect to a 7.4 server.
+
+There are a number of ways to enable server side prepared statements depending on
+your application's needs. The general method is to set a threshold for a
+`PreparedStatement`. An internal counter keeps track of how many times the
+statement has been executed and when it reaches the threshold it will start to
+use server side prepared statements.
+
+### Note
+
+> Server side prepared statements are planned only once by the server. This avoids
+the cost of replanning the query every time, but also means that the planner
+cannot take advantage of the particular parameter values used in a particular
+execution of the query. You should be cautious about enabling the use of server
+side prepared statements globally.
+
+<a name="server-prepared-statement-example"></a>
+**Example 9.3. Using server side prepared statements**
+
+import java.sql.*;
+
+public class ServerSidePreparedStatement
+{
+
+ public static void main(String args[]) throws Exception
+ {
+ Class.forName("org.postgresql.Driver");
+ String url = "jdbc:postgresql://localhost:5432/test";
+ Connection conn = DriverManager.getConnection(url,"test","");
+
+ PreparedStatement pstmt = conn.prepareStatement("SELECT ?");
+
+ // cast to the pg extension interface
+ org.postgresql.PGStatement pgstmt = pstmt.unwrap(org.postgresql.PGStatement.class);
+
+ // on the third execution start using server side statements
+ pgstmt.setPrepareThreshold(3);
+
+ for (int i=1; i<=5; i++)
+ {
+ pstmt.setInt(1,i);
+ boolean usingServerPrepare = pgstmt.isUseServerPrepare();
+ ResultSet rs = pstmt.executeQuery();
+ rs.next();
+ System.out.println("Execution: "+i+", Used server side: " + usingServerPrepare + ", Result: "+rs.getInt(1));
+ rs.close();
+ }
+
+ pstmt.close();
+ conn.close();
+ }
+}
+
+Which produces the expected result of using server side prepared statements upon
+the third execution.
+
+`Execution: 1, Used server side: false, Result: 1`
+`Execution: 2, Used server side: false, Result: 2`
+`Execution: 3, Used server side: true, Result: 3`
+`Execution: 4, Used server side: true, Result: 4`
+`Execution: 5, Used server side: true, Result: 5`
+
+The example shown above requires the programmer to use PostgreSQL™ specific code
+in a supposedly portable API which is not ideal. Also it sets the threshold only
+for that particular statement which is some extra typing if we wanted to use that
+threshold for every statement. Let's take a look at the other ways to set the
+threshold to enable server side prepared statements. There is already a hierarchy
+in place above a `PreparedStatement`, the `Connection` it was created from, and
+above that the source of the connection be it a `Datasource` or a URL. The server
+side prepared statement threshold can be set at any of these levels such that
+the value will be the default for all of it's children.
+
+`// pg extension interfaces`
+`org.postgresql.PGConnection pgconn;`
+`org.postgresql.PGStatement pgstmt;`
+
+`// set a prepared statement threshold for connections created from this url`
+`String url = "jdbc:postgresql://localhost:5432/test?prepareThreshold=3";`
+
+`// see that the connection has picked up the correct threshold from the url`
+`Connection conn = DriverManager.getConnection(url,"test","");`
+`pgconn = conn.unwrap(org.postgresql.PGConnection.class);`
+`System.out.println(pgconn.getPrepareThreshold()); // Should be 3`
+
+`// see that the statement has picked up the correct threshold from the connection`
+`PreparedStatement pstmt = conn.prepareStatement("SELECT ?");`
+`pgstmt = pstmt.unwrap(org.postgresql.PGStatement.class);`
+`System.out.println(pgstmt.getPrepareThreshold()); // Should be 3`
+
+`// change the connection's threshold and ensure that new statements pick it up`
+`pgconn.setPrepareThreshold(5);`
+`PreparedStatement pstmt = conn.prepareStatement("SELECT ?");`
+`pgstmt = pstmt.unwrap(org.postgresql.PGStatement.class);`
+`System.out.println(pgstmt.getPrepareThreshold()); // Should be 5`
diff --git a/docs/documentation/94/setup.md b/docs/documentation/94/setup.md
new file mode 100644
index 0000000..4668660
--- /dev/null
+++ b/docs/documentation/94/setup.md
@@ -0,0 +1,44 @@
+---
+layout: default_docs
+title: Chapter 2. Setting up the JDBC Driver
+header: Chapter 2. Setting up the JDBC Driver
+resource: media
+previoustitle: Chapter 1. Introduction
+previous: intro.html
+nexttitle: Setting up the Class Path
+next: classpath.html
+---
+
+**Table of Contents**
+
+* [Getting the Driver](setup.html#build)
+* [Setting up the Class Path](classpath.html)
+* [Preparing the Database Server for JDBC](prepare.html)
+* [Creating a Database](your-database.html)
+
+This section describes the steps you need to take before you can write or run
+programs that use the JDBC interface.
+
+<a name="build"></a>
+# Getting the Driver
+
+Precompiled versions of the driver can be downloaded from the [PostgreSQL™ JDBC web site](http://jdbc.postgresql.org).
+
+Alternatively you can build the driver from source, but you should only need to
+do this if you are making changes to the source code. To build the JDBC driver,
+you need Ant 1.5 or higher and a JDK. Ant is a special tool for building Java-based
+packages. It can be downloaded from the [Ant web site](http://ant.apache.org/index.html).
+
+If you have several Java compilers installed, it depends on the Ant configuration
+which one gets used. Precompiled Ant distributions are typically set up to read
+a file `.antrc` in the current user's home directory for configuration. For example,
+to use a different JDK than the default, this may work:
+
+`JAVA_HOME=/usr/local/jdk1.6.0_07`
+`JAVACMD=$JAVA_HOME/bin/java`
+
+To compile the driver simply run **ant** in the top level directory. The compiled
+driver will be placed in `jars/postgresql.jar`. The resulting driver will be built
+for the version of Java you are running. If you build with a 1.4 or 1.5 JDK you
+will build a version that supports the JDBC 3 specification and if you build with
+a 1.6 or higher JDK you will build a version that supports the JDBC 4 specification.
\ No newline at end of file
diff --git a/docs/documentation/94/ssl-client.md b/docs/documentation/94/ssl-client.md
new file mode 100644
index 0000000..18dd55a
--- /dev/null
+++ b/docs/documentation/94/ssl-client.md
@@ -0,0 +1,70 @@
+---
+layout: default_docs
+title: Configuring the Client
+header: Chapter 4. Using SSL
+resource: media
+previoustitle: Chapter 4. Using SSL
+previous: ssl.html
+nexttitle: Custom SSLSocketFactory
+next: ssl-factory.html
+---
+
+Unlike psql and other libpq based programs the JDBC driver does server certificate
+validation by default. This means that when establishing a SSL connection the
+JDBC driver will validate the server's identity preventing "man in the middle"
+attacks. It does this by checking that the server certificate is signed by a
+trusted authority. If you have a certificate signed by a global certificate
+authority (CA), there is nothing further to do because Java comes with copies of
+the most common CA's certificates. If you are dealing with a self-signed certificate
+though, you need to make this available to the Java client to enable it to validate
+the server's certificate.
+
+> ### Note
+
+> Only the JDBC 3 driver supports SSL. The 1.4 JDK was the first version to come
+bundled with SSL support. Previous JDK versions that wanted to use SSL could
+make use of the additional JSSE library, but it does not support the full range
+of features utilized by the PostgreSQL™ JDBC driver.
+
+To make the server certificate available to Java, the first step is to convert
+it to a form Java understands.
+
+`openssl x509 -in server.crt -out server.crt.der -outform der`
+
+From here the easiest thing to do is import this certificate into Java's system
+truststore.
+
+`keytool -keystore $JAVA_HOME/lib/security/cacerts -alias postgresql -import -file server.crt.der`
+
+The default password for the cacerts keystore is `changeit`. The alias to postgesql
+is not important and you may select any name you desire.
+
+If you do not have access to the system cacerts truststore you can create your
+own truststore.
+
+`keytool -keystore mystore -alias postgresql -import -file server.crt.der.`
+
+When starting your Java application you must specify this keystore and password
+to use.
+
+`java -Djavax.net.ssl.trustStore=mystore -Djavax.net.ssl.trustStorePassword=mypassword com.mycompany.MyApp`
+
+In the event of problems extra debugging information is available by adding
+`-Djavax.net.debug=ssl` to your command line.
+
+To instruct the JDBC driver to try and establish a SSL connection you must add
+the connection URL parameter `ssl=true`.
+
+<a name="nonvalidating"></a>
+## Using SSL without Certificate Validation
+
+In some situations it may not be possible to configure your Java environment to
+make the server certificate available, for example in an applet. For a large
+scale deployment it would be best to get a certificate signed by recognized
+certificate authority, but that is not always an option. The JDBC driver provides
+an option to establish a SSL connection without doing any validation, but please
+understand the risk involved before enabling this option.
+
+A non-validating connection is established via a custom `SSLSocketFactory` class
+that is provided with the driver. Setting the connection URL parameter `sslfactory=org.postgresql.ssl.NonValidatingFactory`
+will turn off all SSL validation.
\ No newline at end of file
diff --git a/docs/documentation/94/ssl-factory.md b/docs/documentation/94/ssl-factory.md
new file mode 100644
index 0000000..a7e31ee
--- /dev/null
+++ b/docs/documentation/94/ssl-factory.md
@@ -0,0 +1,29 @@
+---
+layout: default_docs
+title: Custom SSLSocketFactory
+header: Chapter 4. Using SSL
+resource: media
+previoustitle: Configuring the Client
+previous: ssl-client.html
+nexttitle: Chapter 5. Issuing a Query and Processing the Result
+next: query.html
+---
+
+PostgreSQL™ provides a way for developers to customize how a SSL connection is
+established. This may be used to provide a custom certificate source or other
+extensions by allowing the developer to create their own `SSLContext` instance.
+The connection URL parameters `sslfactory` and `sslfactoryarg` allow the user
+to specify which custom class to use for creating the `SSLSocketFactory`. The
+class name specified by `sslfactory` must extend `javax.net.ssl.SSLSocketFactory`
+and be available to the driver's classloader. This class must have a zero argument
+constructor or a single argument constructor taking a String argument. This
+argument may optionally be supplied by `sslfactoryarg`.
+
+Information on how to actually implement such a class is beyond the scope of this
+documentation. Places to look for help are the [JSSE Reference Guide](https://docs.oracle.com/javase/8/docs/technotes/guides/security/jsse/JSSERefGuide.html)
+and the source to the `NonValidatingFactory` provided by the JDBC driver.
+
+The Java SSL API is not very well known to the JDBC driver developers and we
+would be interested in any interesting and generally useful extensions that you
+have implemented using this mechanism. Specifically it would be nice to be able
+to provide client certificates to be validated by the server.
diff --git a/docs/documentation/94/ssl.md b/docs/documentation/94/ssl.md
new file mode 100644
index 0000000..af93238
--- /dev/null
+++ b/docs/documentation/94/ssl.md
@@ -0,0 +1,37 @@
+---
+layout: default_docs
+title: Chapter 4. Using SSL
+header: Chapter 4. Using SSL
+resource: media
+previoustitle: Connecting to the Database
+previous: connect.html
+nexttitle: Configuring the Client
+next: ssl-client.html
+---
+
+**Table of Contents**
+
+* [Configuring the Server](ssl.html#ssl-server)
+* [Configuring the Client](ssl-client.html)
+ * [Using SSL without Certificate Validation](ssl-client.html#nonvalidating)
+* [Custom SSLSocketFactory](ssl-factory.html)
+
+<a name="ssl-server"></a>
+# Configuring the Server
+
+Configuring the PostgreSQL™ server for SSL is covered in the [main
+documentation](http://www.postgresql.org/docs/current/static/ssl-tcp.html),
+so it will not be repeated here. Before trying to access your SSL enabled
+server from Java, make sure you can get to it via **psql**. You should
+see output like the following if you have established a SSL connnection.
+
+`$ ./bin/psql -h localhost`
+`Welcome to psql 8.0.0rc5, the PostgreSQL interactive terminal.`
+
+`Type: \copyright for distribution terms`
+ `\h for help with SQL commands`
+ `\? for help with psql commands`
+ `\g or terminate with semicolon to execute query`
+ `\q to quit`
+
+`SSL connection (cipher: DHE-RSA-AES256-SHA, bits: 256)`
\ No newline at end of file
diff --git a/docs/documentation/94/statement.md b/docs/documentation/94/statement.md
new file mode 100644
index 0000000..20f3e5f
--- /dev/null
+++ b/docs/documentation/94/statement.md
@@ -0,0 +1,25 @@
+---
+layout: default_docs
+title: Using the Statement or PreparedStatement Interface
+header: Chapter 5. Issuing a Query and Processing the Result
+resource: media
+previoustitle: Chapter 5. Issuing a Query and Processing the Result
+previous: query.html
+nexttitle: Using the ResultSet Interface
+next: resultset.html
+---
+
+The following must be considered when using the `Statement` or `PreparedStatement`
+interface:
+
+* You can use a single `Statement` instance as many times as you want. You could
+ create one as soon as you open the connection and use it for the connection's
+ lifetime. But you have to remember that only one `ResultSet` can exist
+ per `Statement` or `PreparedStatement` at a given time.
+* If you need to perform a query while processing a `ResultSet`, you can simply
+ create and use another `Statement`.
+* If you are using threads, and several are using the database, you must use a
+ separate `Statement` for each thread. Refer to [Chapter 10, *Using the Driver in a Multithreaded or a Servlet Environment*](thread.html)
+ if you are thinking of using threads, as it covers some important points.
+* When you are done using the `Statement` or `PreparedStatement` you should close
+ it.
\ No newline at end of file
diff --git a/docs/documentation/94/thread.md b/docs/documentation/94/thread.md
new file mode 100644
index 0000000..d79f25b
--- /dev/null
+++ b/docs/documentation/94/thread.md
@@ -0,0 +1,38 @@
+---
+layout: default_docs
+title: Chapter 10. Using the Driver in a Multithreaded or a Servlet Environment
+header: Chapter 10. Using the Driver in a Multithreaded or a Servlet Environment
+resource: media
+previoustitle: Server Prepared Statements
+previous: server-prepare.html
+nexttitle: Chapter 11. Connection Pools and Data Sources
+next: datasource.html
+---
+
+A problem with many JDBC drivers is that only one thread can use a `Connection`
+at any one time --- otherwise a thread could send a query while another one is
+receiving results, and this could cause severe confusion.
+
+The PostgreSQL™ JDBC driver is thread safe. Consequently, if your application
+uses multiple threads then you do not have to worry about complex algorithms to
+ensure that only one thread uses the database at a time.
+
+If a thread attempts to use the connection while another one is using it, it
+will wait until the other thread has finished its current operation. If the
+operation is a regular SQL statement, then the operation consists of sending the
+statement and retrieving any `ResultSet` (in full). If it is a fast-path call
+(e.g., reading a block from a large object) then it consists of sending and
+retrieving the respective data.
+
+This is fine for applications and applets but can cause a performance problem
+with servlets. If you have several threads performing queries then each but one
+will pause. To solve this, you are advised to create a pool of connections. When
+ever a thread needs to use the database, it asks a manager class for a `Connection`
+object. The manager hands a free connection to the thread and marks it as busy.
+If a free connection is not available, it opens one. Once the thread has
+finished using the connection, it returns it to the manager which can then either
+close it or add it to the pool. The manager would also check that the connection
+is still alive and remove it from the pool if it is dead. The down side of a
+connection pool is that it increases the load on the server because a new session
+is created for each `Connection` object. It is up to you and your applications's
+requirements.
\ No newline at end of file
diff --git a/docs/documentation/94/tomcat.md b/docs/documentation/94/tomcat.md
new file mode 100644
index 0000000..ece8816
--- /dev/null
+++ b/docs/documentation/94/tomcat.md
@@ -0,0 +1,121 @@
+---
+layout: default_docs
+title: Tomcat setup
+header: Chapter 11. Connection Pools and Data Sources
+resource: media
+previoustitle: Applications DataSource
+previous: ds-ds.html
+nexttitle: Data Sources and JNDI
+next: jndi.html
+---
+
+### Note
+
+The postgresql.jar file must be placed in $CATALINA_HOME/common/lib in both
+Tomcat 4 and 5.
+
+The absolute easiest way to set this up in either tomcat instance is to use the
+admin web application that comes with Tomcat, simply add the datasource to the
+context you want to use it in.
+
+Setup for Tomcat 4 place the following inside the <Context> tag inside
+conf/server.xml
+
+<pre><code>
+<Resource name="jdbc/postgres" scope="Shareable" type="javax.sql.DataSource"/>
+<ResourceParams name="jdbc/postgres">
+ <parameter>
+ <name>validationQuery</name>
+ <value>select version();</value>
+ </parameter>
+ <parameter>
+ <name>url</name>
+ <value>jdbc:postgresql://localhost/davec</value>
+ </parameter>
+ <parameter>
+ <name>password</name>
+ <value>davec</value>
+ </parameter>
+ <parameter>
+ <name>maxActive</name>
+ <value>4</value>
+ </parameter>
+ <parameter>
+ <name>maxWait</name>
+ <value>5000</value>
+ </parameter>
+ <parameter>
+ <name>driverClassName</name>
+ <value>org.postgresql.Driver</value>
+ </parameter>
+ <parameter>
+ <name>username</name>
+ <value>davec</value>
+ </parameter>
+ <parameter>
+ <name>maxIdle</name>
+ <value>2</value>
+ </parameter>
+</ResourceParams>
+</code></pre>
+
+Setup for Tomcat 5, you can use the above method, except that it goes inside the
+<DefaultContext> tag inside the <Host> tag. eg. <Host> ... <DefaultContext> ...
+
+Alternatively there is a conf/Catalina/hostname/context.xml file. For example
+http://localhost:8080/servlet-example has a directory $CATALINA_HOME/conf/Catalina/localhost/servlet-example.xml file.
+Inside this file place the above xml inside the <Context> tag
+
+Then you can use the following code to access the connection.
+
+<pre><code>
+import javax.naming.*;
+import javax.sql.*;
+import java.sql.*;
+public class DBTest
+{
+
+ String foo = "Not Connected";
+ int bar = -1;
+
+ public void init()
+ {
+ try
+ {
+ Context ctx = new InitialContext();
+ if(ctx == null )
+ throw new Exception("Boom - No Context");
+
+ // /jdbc/postgres is the name of the resource above
+ DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/postgres");
+
+ if (ds != null)
+ {
+ Connection conn = ds.getConnection();
+
+ if(conn != null)
+ {
+ foo = "Got Connection "+conn.toString();
+ Statement stmt = conn.createStatement();
+ ResultSet rst = stmt.executeQuery("select id, foo, bar from testdata");
+
+ if(rst.next())
+ {
+ foo=rst.getString(2);
+ bar=rst.getInt(3);
+ }
+ conn.close();
+ }
+ }
+ }
+ catch(Exception e)
+ {
+ e.printStackTrace();
+ }
+ }
+
+ public String getFoo() { return foo; }
+
+ public int getBar() { return bar;}
+}
+</code></pre>
\ No newline at end of file
diff --git a/docs/documentation/94/update.md b/docs/documentation/94/update.md
new file mode 100644
index 0000000..a681c41
--- /dev/null
+++ b/docs/documentation/94/update.md
@@ -0,0 +1,30 @@
+---
+layout: default_docs
+title: Performing Updates
+header: Chapter 5. Issuing a Query and Processing the Result
+resource: media
+previoustitle: Using the ResultSet Interface
+previous: resultset.html
+nexttitle: Creating and Modifying Database Objects
+next: ddl.html
+---
+
+To change data (perform an `INSERT`, `UPDATE`, or `DELETE`) you use the
+`executeUpdate()` method. This method is similar to the method `executeQuery()`
+used to issue a `SELECT` statement, but it doesn't return a `ResultSet`; instead
+it returns the number of rows affected by the `INSERT`, `UPDATE`, or `DELETE`
+statement. [Example 5.3, “Deleting Rows in JDBC”](update.html#delete-example)
+illustrates the usage.
+
+<a name="delete-example"></a>
+**Example 5.3. Deleting Rows in JDBC**
+
+This example will issue a simple `DELETE` statement and print out the number of
+rows deleted.
+
+`int foovalue = 500;`
+`PreparedStatement st = conn.prepareStatement("DELETE FROM mytable WHERE columnfoo = ?");`
+`st.setInt(1, foovalue);`
+`int rowsDeleted = st.executeUpdate();`
+`System.out.println(rowsDeleted + " rows deleted");`
+`st.close();`
\ No newline at end of file
diff --git a/docs/documentation/94/use.md b/docs/documentation/94/use.md
new file mode 100644
index 0000000..97f27f9
--- /dev/null
+++ b/docs/documentation/94/use.md
@@ -0,0 +1,32 @@
+---
+layout: default_docs
+title: Chapter 3. Initializing the Driver
+header: Chapter 3. Initializing the Driver
+resource: media
+previoustitle: Creating a Database
+previous: your-database.html
+nexttitle: Chapter 3. Loading the Driver
+next: load.html
+---
+
+**Table of Contents**
+
+
+* [Importing JDBC](use.html#import)
+* [Loading the Driver](load.html)
+* [Connecting to the Databas](connect.html)
+ * [Connection Parameters](connect.html#connection-parameters)
+
+This section describes how to load and initialize the JDBC driver in your programs.
+
+<a name="import"></a>
+# Importing JDBC
+
+Any source that uses JDBC needs to import the `java.sql` package, using:
+
+import java.sql.*;
+
+### Note
+
+You should not import the `org.postgresql` package unless you are not using standard
+PostgreSQL™ extensions to the JDBC API.
\ No newline at end of file
diff --git a/docs/documentation/94/your-database.md b/docs/documentation/94/your-database.md
new file mode 100644
index 0000000..e809e74
--- /dev/null
+++ b/docs/documentation/94/your-database.md
@@ -0,0 +1,20 @@
+---
+layout: default_docs
+title: Creating a Database
+header: Chapter 2. Setting up the JDBC Driver
+resource: media
+previoustitle: Preparing the Database Server for JDBC
+previous: prepare.html
+nexttitle: Chapter 3. Initializing the Driver
+next: use.html
+---
+
+When creating a database to be accessed via JDBC it is important to select an
+appropriate encoding for your data. Many other client interfaces do not care
+what data you send back and forth, and will allow you to do inappropriate things,
+but Java makes sure that your data is correctly encoded. Do not use a database
+that uses the `SQL_ASCII` encoding. This is not a real encoding and you will
+have problems the moment you store data in it that does not fit in the seven
+bit ASCII character set. If you do not know what your encoding will be or are
+otherwise unsure about what you will be storing the `UNICODE` encoding is a
+reasonable default to use.
\ No newline at end of file
diff --git a/docs/documentation/changelog.md b/docs/documentation/changelog.md
new file mode 100644
index 0000000..9981e77
--- /dev/null
+++ b/docs/documentation/changelog.md
@@ -0,0 +1,2540 @@
+---
+layout: changes
+title: PostgreSQL JDBC Changelog
+resource: ../media
+nav: ../
+---
+
+# History of Changes
+{% comment %}There are no new lines after "for" and after "endfor" below in order to keep formatting of the output list sane.{% endcomment %}
+* [Introduction and explanation of symbols](#introduction)
+{% for post in site.categories.new_release %}* [Version {{ post.version }} ({{ post.date | date: "%Y-%m-%d"}})](#version_{{ post.version }})
+ * [Contributors to this release](#contributors_{{ post.version }})
+{% endfor %}* [Version 9.4.1212 (2016-11-01)](#version_9.4.1212)
+ * [Contributors to this release](#contributors_9.4.1212)
+* [Version 9.4.1211 (2016-09-18)](#version_9.4.1211)
+ * [Contributors to this release](#contributors_9.4.1211)
+* [Version 9.4.1210 (2016-09-07)](#version_9.4.1210)
+ * [Contributors to this release](#contributors_9.4.1210)
+* [Version 9.4.1209 (2016-07-15)](#version_9.4.1209)
+ * [Contributors to this release](#contributors_9.4.1209)
+* [Version 9.4.1208 (2016-02-19)](#version_9.4.1208)
+ * [Contributors to this release](#contributors_9.4.1208)
+* [Version 9.4.1207 (2015-12-23)](#version_9.4.1207)
+ * [Contributors to this release](#contributors_9.4.1207)
+* [Version 9.4-1206 (2015-11-25)](#version_9.4-1206)
+ * [Contributors to this release](#contributors_9.4-1206)
+* [Version 9.4-1205 (2015-11-03)](#version_9.4-1205)
+ * [Contributors to this release](#contributors_9.4-1205)
+* [Version 9.4-1204 (2015-10-09)](#version_9.4-1204)
+ * [Contributors to this release](#contributors_9.4-1204)
+* [Version 9.4-1203 (2015-09-17)](#version_9.4-1203)
+ * [Contributors to this release](#contributors_9.4-1203)
+* [Version 9.4-1202 (2015-08-27)](#version_9.4-1202)
+ * [Contributors to this release](#contributors_9.4-1202)
+* [Version 9.4-1201 (2015-02-25)](#version_9.4-1201)
+ * [Contributors to this release](#contributors_9.4-1201)
+* [Version 9.4-1200 (2015-01-02)](#version_9.4-1200)
+ * [Contributors to this release](#contributors_9.4-1200)
+* [Version 9.3-1103 (2015-19-09)](#version_9.3-1104)
+* [Version 9.3-1103 (2015-01-02)](#version_9.3-1103)
+* [Version 9.3-1102 (2014-07-10)](#version_9.3-1102)
+* [Version 9.3-1101 (2014-02-19)](#version_9.3-1101)
+* [Version 9.3-1100 (2013-11-01)](#version_9.3-1100)
+* [Version 9.2-1004 (2013-10-31)](#version_9.2-1004)
+* [Version 9.2-1003 (2013-07-08)](#version_9.2-1003)
+ * [Contributors to this release](#contributors_9.2-1003)
+* [Version 9.2-1002 (2012-11-14)](#version_9.2-1002)
+ * [Contributors to this release](#contributors_9.2-1002)
+* [Version 9.2-1001 (2012-10-31)](#version_9.2-1001)
+ * [Contributors to this release](#contributors_9.2-1001)
+* [Version 9.2-1000 (2012-09-27)](#version_9.2-1000)
+ * [Contributors to this release](#contributors_9.2-1000)
+* [Version 9.1-902 (2011-04-18)](#version_9.1-902)
+ * [Contributors to this release](#contributors_9.1-902)
+* [Version 9.1-901 (2011-04-18)](#version_9.1-901)
+ * [Contributors to this release](#contributors_9.1-901)
+* [Version 9.1dev-900 (2011-04-18)](#version_9.1dev-900)
+ * [Contributors to this release](#contributors_9.1dev-900)
+* [Version 9.0-801 (2010-09-20)](#version_9.0-801)
+ * [Contributors to this release](#contributors_9.0-801)
+* [Version 9.0-dev800 (2010-05-11)](#version_9.0-dev800)
+ * [Contributors to this release](#contributors_9.0-dev800)
+* [Archived Versions 8.0-8.4](pgjdbc_changelog-8.0-8.4.tar.gz)
+* [All Committers](#all-committers)
+
+[![](../media/img/rss.png)](../changes.rss)
+
+<a name="introduction"></a>
+## Introduction and explanation of symbols
+
+Changes are sorted by "type" and then chronologically with the most recent at the top. These symbols
+denote the various action types:![add](../media/img/add.jpg)=add,
+<img alt="fix" src="../media/img/fix.jpg" />=fix,
+<img alt="remove" src="../media/img/remove.jpg" />=remove,
+<img alt="update" src="../media/img/update.jpg" />=update
+***
+
+{% for post in site.categories.new_release %}
+<a name="version_{{ post.version }}"></a>
+## Version {{ post.version }} ({{ post.date | date: "%Y-%m-%d"}})
+{{ post.content }}
+{% endfor %}
+
+<a name="version_9.4.1212"></a>
+## Version 9.4.1212 (2016-11-02)
+
+Notable changes:
+
+* ? can now be used in non-prepared statements (regression was introduced in 1210)
+
+AlexElin (1):
+
+* chore: add coverage badge (#646) [05c2f8d](https://github.com/pgjdbc/pgjdbc/commit/05c2f8d0d5ad66d9bf659754483ef92acb1b30ff)
+
+Jorge Solorzano (6):
+
+* docs: split readme.md to contributing.md (#652) [7270435](https://github.com/pgjdbc/pgjdbc/commit/7270435aebc204df72c388bcdd47b17d64dbe21f)
+* docs: improve readme.md (#666) [cf6b836](https://github.com/pgjdbc/pgjdbc/commit/cf6b836c2acbddc12f74944534fddeb012df4fdb)
+* docs: change license to BSD-2-Clause (#660) [b4c90c8](https://github.com/pgjdbc/pgjdbc/commit/b4c90c80795031cfa790b9a589a22da606f50734)
+* style: update the header in the project (#662) [8be516d](https://github.com/pgjdbc/pgjdbc/commit/8be516d47ece60b7aeba5a9474b5cac1d538a04a)
+* fix: copy src/main/resources (#676) [14f3fce](https://github.com/pgjdbc/pgjdbc/commit/14f3fcebe417242474289d2fd3f5d2b5e66b0f0b)
+* style: copy license file to META-INF folder (#677) [c518697](https://github.com/pgjdbc/pgjdbc/commit/c518697036c40543f29b303135b0ef025b883009)
+
+Sebastian Utz (1):
+
+* fix: makes escape processing strict according to JDBC spec [PR#657](https://github.com/pgjdbc/pgjdbc/pull/657) [00a8478](https://github.com/pgjdbc/pgjdbc/commit/00a847879f313105de124776b7edaab928bf5b4c)
+
+Vladimir Sitnikov (4):
+
+* fix: do not convert ?, ? to $1, $2 when statement.executeQuery(String) is used (#644) [PR#643](https://github.com/pgjdbc/pgjdbc/pull/643) [08e1a40](https://github.com/pgjdbc/pgjdbc/commit/08e1a409163220f84b57e9384a96bef019e2bc19)
+* tests: make CursorFetchTest.testGetRow to use stable order of rows so the test does not depend on actual implementation of UNION [3c8efe4](https://github.com/pgjdbc/pgjdbc/commit/3c8efe422f17e2684f8d2936b999a4cc422d0482)
+* fix: avoid ClassLoader leaks caused by SharedTimer [PR#664](https://github.com/pgjdbc/pgjdbc/pull/664) [f52bf7f](https://github.com/pgjdbc/pgjdbc/commit/f52bf7fc7a71341fae3a9255af0e2b2c271a35dd)
+* Make successful OSGi activation less noisy [PR#672](https://github.com/pgjdbc/pgjdbc/pull/672) [22b9025](https://github.com/pgjdbc/pgjdbc/commit/22b902518abe4d429e8bef908eb90db1be9ccd79)
+
+zapov (1):
+
+* fix: Don't break when there is no column metadata (#663) [6d2a53e](https://github.com/pgjdbc/pgjdbc/commit/6d2a53eb45f49fa5b34b97e6e29d71c9eb114053)
+
+<a name="contributors_9.4.1212"></a>
+### Contributors to this release
+
+We thank the following people for their contributions to this release.
+
+[AlexElin](https://github.com/AlexElin)
+[Jorge Solorzano](https://github.com/jorsol)
+[Rikard Pavelic](https://github.com/zapov)
+[Sebastian Utz](https://github.com/seut)
+[Vladimir Sitnikov](https://github.com/vlsi)
+
+<a name="version_9.4.1211"></a>
+## Version 9.4.1211 (2016-09-18)
+
+Notable changes:
+* json type is returned as PGObject like in pre-9.4.1210 (fixed regression of 9.4.1210)
+* 'current transaction is aborted' exception includes the original exception via caused-by chain
+
+Daniel Gustafsson (1):
+
+* doc: fix brand names and links in readme (#636) [56c04d0](https://github.com/pgjdbc/pgjdbc/commit/56c04d0ec95ede31b5f13a70ab76f2b4df09aef5)
+
+Vladimir Sitnikov (4):
+
+* chore: eploy to Travis was silently broken for a couple of days since "test" command was missing [67d7e3c](https://github.com/pgjdbc/pgjdbc/commit/67d7e3c58852b349b1bd12690afaac558263dcf0)
+* fix: json should be returned as PGObject, not as String for backward compatibility reasons (#640) [PR#639](https://github.com/pgjdbc/pgjdbc/pull/639) [beaec3a](https://github.com/pgjdbc/pgjdbc/commit/beaec3a0ec5b556cc1abfd50b3bf9017d5c09ac4)
+* test: add DebugNonSafepoints to FlightRecorderProfiler [PR#622](https://github.com/pgjdbc/pgjdbc/pull/622) [154c463](https://github.com/pgjdbc/pgjdbc/commit/154c4630586ebccd3b4fb53db3ebc6c77b3cdeda)
+* feat: include root cause exception in case transaction fails (#628) [51775c1](https://github.com/pgjdbc/pgjdbc/commit/51775c167a0037a812b4cd4c22126e5ae853c8aa)
+
+<a name="contributors_9.4.1211"></a>
+### Contributors to this release
+
+We thank the following people for their contributions to this release.
+
+[Daniel Gustafsson](https://github.com/danielgustafsson)
+[Vladimir Sitnikov](https://github.com/vlsi)
+
+
+<a name="version_9.4.1210"></a>
+## Version 9.4.1210 (2016-09-07)
+
+Notable changes:
+
+* Better support for RETURN_GENERATED_KEYS, statements with RETURNING clause
+* Avoid user-visible prepared-statement errors if client uses DEALLOCATE/DISCARD statements (invalidate cache when those statements detected)
+* Avoid user-visible prepared-statement errors if client changes search_path (invalidate cache when set search_path detected)
+* Support comments when replacing {fn ...} JDBC syntax
+* Support for Types.REF_CURSOR
+
+AlexElin (3):
+
+* style: change method names to start with a lower case letter (#615) [22c72b4](https://github.com/pgjdbc/pgjdbc/commit/22c72b4d5908a1bfc0860ff06e2f33050f632d94)
+* refactor: fix some hintbugs warnings (#616) [dd71f6f](https://github.com/pgjdbc/pgjdbc/commit/dd71f6f3a1ea31e4b7fb4bf92188a6e87f78c633)
+* refactor: use varargs in Gt.tr (#629) [07c7902](https://github.com/pgjdbc/pgjdbc/commit/07c790234496b4b36fe9dbdffdb33b75f0989036)
+
+Chrriis (1):
+
+* perf: cache result set column mapping for prepared statements [PR#614](https://github.com/pgjdbc/pgjdbc/pull/614) [88fbbc5](https://github.com/pgjdbc/pgjdbc/commit/88fbbc59132090ad7602377014f7d55fde3aa487)
+
+Marios Trivyzas (1):
+
+* perf: add point type info to Client (#612) [ba14509](https://github.com/pgjdbc/pgjdbc/commit/ba14509182e8e4399ad24658ea00daa16c24dcfa)
+
+Mathias Fußenegger (2):
+
+* doc: fix test README link in README (#609) [c09be96](https://github.com/pgjdbc/pgjdbc/commit/c09be96c94557cd16be88e35117b89ca905d610f)
+* perf: add json type info to Client (#610) [4ad2df3](https://github.com/pgjdbc/pgjdbc/commit/4ad2df328d1202cb9516b8a8e382e4fef4db6441)
+
+Pavel Raiskup (1):
+
+* packaging: sync spec file with Fedora package [PR#608](https://github.com/pgjdbc/pgjdbc/pull/608) [dd48911](https://github.com/pgjdbc/pgjdbc/commit/dd48911b24b6547703c3dba3441a59099150f2aa)
+
+Philippe Marschall (1):
+
+* feat: support Types.REF_CURSOR [PR#635](https://github.com/pgjdbc/pgjdbc/pull/635) [b5c3f59](https://github.com/pgjdbc/pgjdbc/commit/b5c3f592c2c07fecf9f91b6a2b1a93d0362e3e8b)
+
+Vladimir Gordiychuk (1):
+
+* test: fix Travis job so it actually tests against HEAD PostgreSQL (#630) [9030373](https://github.com/pgjdbc/pgjdbc/commit/90303734fcdad73bcdfaebcaec13d5e42060a83a)
+
+Vladimir Sitnikov (23):
+
+* test: skip json testing on pre-9.2 databases (those do not implement json type) [0a17d82](https://github.com/pgjdbc/pgjdbc/commit/0a17d8231de50c1fb2b6f99e4d110e651f4fd4b4)
+* chore: make sure JDK9+PG 9.4 Travis job indeed uses PG 9.4 [01b65c3](https://github.com/pgjdbc/pgjdbc/commit/01b65c3642cd02332eada69e45fc2dd818738f38)
+* test: add PostgreSQL HEAD to pgjdbc regression test matrix (#613) [PR#561](https://github.com/pgjdbc/pgjdbc/pull/561) [65a32ff](https://github.com/pgjdbc/pgjdbc/commit/65a32ff4d5d25d4f30246d5643c1a1893ffcbe30)
+* test: add benchmark for resultSet.getByName [ff4bfda](https://github.com/pgjdbc/pgjdbc/commit/ff4bfda1fca0c28d779912cf72c12de062f37345)
+* chore: use Travis' PostgreSQL 9.5 [d1feb58](https://github.com/pgjdbc/pgjdbc/commit/d1feb5865db002de7adcac789ed768d304214807)
+* docs: add javadoc badge to the project readme [5d7a9bb](https://github.com/pgjdbc/pgjdbc/commit/5d7a9bb347ca447c8f1745c0b631f4b358acd33d)
+* refactor: remove autoCommit argument from QueryExecutor#createSimpleQuery/createParameterizedQuery [756363e](https://github.com/pgjdbc/pgjdbc/commit/756363efb5e09fc97d819e7367862b0d0c93e56b)
+* fix: support cases when user-provided queries have 'returning' [PR#488](https://github.com/pgjdbc/pgjdbc/pull/488) [c3d8571](https://github.com/pgjdbc/pgjdbc/commit/c3d8571e53cc5b702dae2f832b02c872ad44c3b7)
+* feat: support execute statements via simple 'Q' command [PR#558](https://github.com/pgjdbc/pgjdbc/pull/558) [232569c](https://github.com/pgjdbc/pgjdbc/commit/232569c6bd9eb625fc70ebe642d35c8256726a16)
+* feat: show proper error message when connecting to non-UTF-8 database [PR#594](https://github.com/pgjdbc/pgjdbc/pull/594) [ec5fb4f](https://github.com/pgjdbc/pgjdbc/commit/ec5fb4f5a66b6598aea1c7ab8df3126ee77d15e2)
+* test: add tests for Parser.parseDelete/Select/Move/WithKeyword [3b7c7c4](https://github.com/pgjdbc/pgjdbc/commit/3b7c7c48ceba3bd13c31f74c89f95ab506b94b6d)
+* chore: update to 1.1.0 version of parent pom to upgrade bndlib 2.3.0 -> 2.4.0 [4019ed6](https://github.com/pgjdbc/pgjdbc/commit/4019ed63f27a17c9f381e784fb3e72b2ad64d6fe)
+* chore: use latest java version for one of Java 8 Travis jobs [0452e79](https://github.com/pgjdbc/pgjdbc/commit/0452e79c42ca6fb493b21956b43a37ae93fbcda0)
+* refactor: introduce ResultHandlerBase to factor out common error processing logic [edcdccd](https://github.com/pgjdbc/pgjdbc/commit/edcdccd658cbf3f2bfd677901f7bebac13a6259b)
+* feat: reset server-prepared statements on deallocate/discard, ability to autorollback on sqlexception from executing a query [PR#451](https://github.com/pgjdbc/pgjdbc/pull/451) [adc08d5](https://github.com/pgjdbc/pgjdbc/commit/adc08d57d2a9726309ea80d574b1db835396c1c8)
+* fix: add a test case when "deallocate all" detector is turned off [aa53fba](https://github.com/pgjdbc/pgjdbc/commit/aa53fbae604ade36b84ad22393b800e11e030829)
+* fix: invalidate prepared statement cache when "set search_path=..." query is detected [PR#496](https://github.com/pgjdbc/pgjdbc/pull/496) [17c8afb](https://github.com/pgjdbc/pgjdbc/commit/17c8afb11c319255aeffc93617545181d20400a3)
+* fix: properly account cache size when duplicate entries returned to the cache [191ccf2](https://github.com/pgjdbc/pgjdbc/commit/191ccf2ceca2e4159027de0ff5eaed4a4b4f1fe1)
+* feat: support 10+ version parsing Note: 10.2 means 10 major, 2 minor, that is 10_00_02 9.2 means 9.2 major, that is 9_02_00 [PR#631](https://github.com/pgjdbc/pgjdbc/pull/631) [a639431](https://github.com/pgjdbc/pgjdbc/commit/a639431d41dd92d0467d4ca618a35a2b5dc1e2d8)
+* fix: honor comments when replacing {fn curdate()} kind of calls [PR#632](https://github.com/pgjdbc/pgjdbc/pull/632) [2d9b313](https://github.com/pgjdbc/pgjdbc/commit/2d9b313160dc5b73df2ae9001795592b37e8e8e0)
+* chore: skip "deploy to Central" step when building PRs [9bc194a](https://github.com/pgjdbc/pgjdbc/commit/9bc194a3ef234ee96535b9fea8af4bb8e6fbf2b8)
+* test: add performance test for "reused vs non-reused at client side" prepared statements [2d70385](https://github.com/pgjdbc/pgjdbc/commit/2d70385f06d8f58a59a618f1967ac0634a6b925c)
+* chore: improve ./release_notes.sh so it does not require parameters [d8736b4](https://github.com/pgjdbc/pgjdbc/commit/d8736b47bbf8d17de286aae618f3f6219388a03d)
+
+<a name="contributors_9.4.1210"></a>
+### Contributors to this release
+
+We thank the following people for their contributions to this release.
+
+[AlexElin](https://github.com/AlexElin)
+[Christopher Deckers](https://github.com/Chrriis)
+[Marios Trivyzas](https://github.com/matriv)
+[Mathias Fußenegger](https://github.com/mfussenegger)
+[Pavel Raiskup](https://github.com/praiskup)
+[Philippe Marschall](https://github.com/marschall)
+[Vladimir Gordiychuk](https://github.com/Gordiychuk)
+[Vladimir Sitnikov](https://github.com/vlsi)
+
+<a name="version_9.4.1209"></a>
+## Version 9.4.1209 (2016-07-15)
+
+Notable changes:
+
+* BUG: json datatype is returned as java.lang.String object, not as PGObject (fixed in 9.4.1211)
+* Many improvements to `insert into .. values(?,?) -> insert .. values(?,?), (?,?)...` rewriter. Give it a try by using `reWriteBatchedInserts=true` connection property. 2-3x improvements for insert batch can be expected
+* Full test suite passes against PostgreSQL 9.6, and OpenJDK 9
+* Performance optimization for timestamps (~TimeZone.getDefault optimization)
+* Allow build-from-source on GNU/Linux without maven repositories, and add Fedora Copr test to the regression suite
+
+AlexElin (2):
+
+* style: code cleanup and Java 5' features [8e8dbab](https://github.com/pgjdbc/pgjdbc/commit/8e8dbab04a72813e71b28c74a74513d795979e6a)
+* style: cleanup and Java 5' features for tests (#602) [28c0c22](https://github.com/pgjdbc/pgjdbc/commit/28c0c2217d739678056a4cb193c4ec886cc9fada)
+
+Christian Ullrich (4):
+
+* docs: fix test password in readme closes #553 [PR#553](https://github.com/pgjdbc/pgjdbc/pull/553) [07f8610](https://github.com/pgjdbc/pgjdbc/commit/07f8610fe2e44dff4b57ffd630fd1d10300128d2)
+* test: make tests independent from server LC_MESSAGES (#554) [b756a15](https://github.com/pgjdbc/pgjdbc/commit/b756a1507f06686540b56b3a29186841ea741bad)
+* fix: update waffle version [PR#555](https://github.com/pgjdbc/pgjdbc/pull/555) [db1a6e4](https://github.com/pgjdbc/pgjdbc/commit/db1a6e44ceb17b20c3995f3366145a932711753c)
+* test: add basic tests for SSPI authentication [PR#557](https://github.com/pgjdbc/pgjdbc/pull/557) [16c27b9](https://github.com/pgjdbc/pgjdbc/commit/16c27b9e31546f4ebdc23deeb0178ffce9cc2537)
+
+Christopher Deckers (2):
+
+* fix: improve insert values(...) batch rewrite [PR#580](https://github.com/pgjdbc/pgjdbc/pull/580) [510e6e0](https://github.com/pgjdbc/pgjdbc/commit/510e6e0fec5e3a44ffda854f5cf808ce9f72ee2e)
+* perf: cache timezone in statement#setDate, resultSet#getDate, etc [PR#588](https://github.com/pgjdbc/pgjdbc/pull/588) [d2b86a0](https://github.com/pgjdbc/pgjdbc/commit/d2b86a0a223d1b573bb017172dd4c009c7274a47)
+
+Dave Cramer (5):
+
+* use binary trick for tolower, optimize switch, added tests [2200a4d](https://github.com/pgjdbc/pgjdbc/commit/2200a4d5877aa805c89910ef62b47c076c8a2825)
+* fix:bugs with parse [72945b0](https://github.com/pgjdbc/pgjdbc/commit/72945b04279613828cc32d97cc86317a73feb1fd)
+* fix: added test for move and fixed checkstyle errors [fc59851](https://github.com/pgjdbc/pgjdbc/commit/fc598512f7e2b89f6a026ef69d4c0225a44db060)
+* fixed index ASC/DESC for 9.6 (#569) [c9e5fc8](https://github.com/pgjdbc/pgjdbc/commit/c9e5fc8bf53ead845f7b56c9cbe3c1058b636ca5)
+* test: DataSource.getConnection().unwrap(PGConnection.class) [PR#573](https://github.com/pgjdbc/pgjdbc/pull/573) [f6b176e](https://github.com/pgjdbc/pgjdbc/commit/f6b176ed6e7c2bbec5be294e3d419d624652747d)
+
+Florin Asăvoaie (1):
+
+* Refactored an unnecessary conversion of List<String[]> to String[][] when calling the sendStartupPacket. (#544) [2032836](https://github.com/pgjdbc/pgjdbc/commit/2032836b5c60e95bf8b40bf173d1fae02d3f7176)
+
+George Kankava (1):
+
+* fix: PgDatabaseMetaData: close statement in finally [PR#516](https://github.com/pgjdbc/pgjdbc/pull/516) [b4c45ca](https://github.com/pgjdbc/pgjdbc/commit/b4c45ca20c338810da9db328d61df298acd1d00b)
+
+Jeremy Whiting (3):
+
+* perf: Add optimization to re-write batched insert stataments. [ac8abf3](https://github.com/pgjdbc/pgjdbc/commit/ac8abf3f2acbef3f52eb7874b6815d1adc974299)
+* fix: Change optimization to delay parameter and statement re-write to immediately before execution. [e591577](https://github.com/pgjdbc/pgjdbc/commit/e59157742c77769cc19e14aeb5aebd9c042e2050)
+* feat: Added to SQL parser to allow inspection of Statement attributes and Command. [4ddb693](https://github.com/pgjdbc/pgjdbc/commit/4ddb693ff073c128116b0d79f5aeb45c5ae7307c)
+
+Laurenz Albe (1):
+
+* fix: interpretation of empty but set "ssl" connection property [PR#528](https://github.com/pgjdbc/pgjdbc/pull/528) [91f05b4](https://github.com/pgjdbc/pgjdbc/commit/91f05b402bb1e19d507f365be890cee8a54dc00f)
+
+Minglei Tu (1):
+
+* feat: support java.sql.Types.TIME_WITH_TIMEZONE and java.sql.Types.TIMESTAMP_WITH_TIMEZONE in setNull method [PR#570](https://github.com/pgjdbc/pgjdbc/pull/570) [1b73bf6](https://github.com/pgjdbc/pgjdbc/commit/1b73bf6efa8879943987f79d1084c419200ccca9)
+
+Pavel Raiskup (3):
+
+* Allow build-from-source on GNU/Linux without maven repositories (#546) [87489a9](https://github.com/pgjdbc/pgjdbc/commit/87489a9974fefbcf0aad9c2869e4dc0e6199b38a)
+* chore: test Fedora packaging CI via Travis job [PR#578](https://github.com/pgjdbc/pgjdbc/pull/578) [1eb4085](https://github.com/pgjdbc/pgjdbc/commit/1eb4085c2425e4d6b6fc74c3e2a6b527eb9ff927)
+* packaging: heal Fedora build (#601) [af50d0b](https://github.com/pgjdbc/pgjdbc/commit/af50d0bfc7157ef6da160f7064fe1f0ca838b109)
+
+Petro Semeniuk (1):
+
+* fix: use per-connection cache for field metadata (table name, column name, etc) [PR#551](https://github.com/pgjdbc/pgjdbc/pull/551) [dc3bdda](https://github.com/pgjdbc/pgjdbc/commit/dc3bddab3f2b14fd81284f109fa5056dbe5ab40b)
+
+Philippe Marschall (4):
+
+* style: Use more generics [PR#519](https://github.com/pgjdbc/pgjdbc/pull/519) [88e39a0](https://github.com/pgjdbc/pgjdbc/commit/88e39a0087f6bc7447877972278307f4befff16d)
+* style: remove unused code [PR#520](https://github.com/pgjdbc/pgjdbc/pull/520) [f21f168](https://github.com/pgjdbc/pgjdbc/commit/f21f1689241920defe9c7beafde12d0b0f318ca0)
+* refactor: Remove pgTypeName null check [PR#525](https://github.com/pgjdbc/pgjdbc/pull/525) [462928b](https://github.com/pgjdbc/pgjdbc/commit/462928b4c53c29cdc8ceaec541c6fd688f2eac3a)
+* refactor: remove ClassCastException catch [PR#527](https://github.com/pgjdbc/pgjdbc/pull/527) [8bee06b](https://github.com/pgjdbc/pgjdbc/commit/8bee06be4b9679d880f97dbe68cf9a301dd6c420)
+
+Tanya Gordeeva (1):
+
+* fix: add a socket timeout on cancel requests [PR#603](https://github.com/pgjdbc/pgjdbc/pull/603) [ab2a6d8](https://github.com/pgjdbc/pgjdbc/commit/ab2a6d89081fc2c1fdb2a8600f413db33669022c)
+
+Vladimir Sitnikov (23):
+
+* test: add tests for null::float8[] [e6b5bb3](https://github.com/pgjdbc/pgjdbc/commit/e6b5bb3575696aa7a4bd83f03c05f5297a3a555d)
+* test: createArrayOf(..., null) test [a274321](https://github.com/pgjdbc/pgjdbc/commit/a274321c6ad705ad2517026191634bba9490804f)
+* test: avoid "The connection attempt failed" in ConnectTimeoutTest.testTimeout [PR#531](https://github.com/pgjdbc/pgjdbc/pull/531) [fbabfa4](https://github.com/pgjdbc/pgjdbc/commit/fbabfa4e69aeaf7a9e69a0801740b22b141bcb47)
+* fix: NPE in DatabaseMetaData.getTypeInfo when types are dropped concurrently [PR#530](https://github.com/pgjdbc/pgjdbc/pull/530) [f3b0fd0](https://github.com/pgjdbc/pgjdbc/commit/f3b0fd007ca2fc186626c4ee5157015932c4a359)
+* fix: binary timestamptz -> getString should add +XX zone offset to text representation [PR#130](https://github.com/pgjdbc/pgjdbc/pull/130) [1e1f3c4](https://github.com/pgjdbc/pgjdbc/commit/1e1f3c4ab1fbbc5b071b50991da6c34afe92e6f0)
+* refactor: "build without waffle/osgi" PR [766f806](https://github.com/pgjdbc/pgjdbc/commit/766f8069697f0ec2e4c932fdf86bc3bc8bd19312)
+* test: add PostgreSQL 9.6 to CI tests (#560) [3ff47da](https://github.com/pgjdbc/pgjdbc/commit/3ff47daf68bf45694d5671eef1d9d32fb87f00d3)
+* chore: make sure ubenchmark is tested with checkstyle [PR#564](https://github.com/pgjdbc/pgjdbc/pull/564) [f6ed8e6](https://github.com/pgjdbc/pgjdbc/commit/f6ed8e6768914f06a3108cbc9a969bb9d46b8f7b)
+* chore: add explicit MCENTRAL=Y to Travis jobs that deploy to Maven Central [18ca8f2](https://github.com/pgjdbc/pgjdbc/commit/18ca8f227a6c1310162e328d18c3ae6041cabee8)
+* test: prune some Travis jobs to make CI faster [c5c1d7c](https://github.com/pgjdbc/pgjdbc/commit/c5c1d7cc6f4e078bb6442198254b650dab363023)
+* chore: propagate java source/target to maven-compiler-plugin [d8117d1](https://github.com/pgjdbc/pgjdbc/commit/d8117d19b953b86f959d87c4f0ea5ede696fb692)
+* chore: add codecov.yml [fb2977f](https://github.com/pgjdbc/pgjdbc/commit/fb2977fbcd8160c0b83c05227aac9a7306489e4b)
+* refactor: use enum instead of int for PgStatement.statementState to simplify debugging [32d4e08](https://github.com/pgjdbc/pgjdbc/commit/32d4e08f41e4c9fd5fbbeaefde3c364fe3f7f66d)
+* test: use TestUtil.getPort() in V3ParameterListTests instead of hard-coded 5432 [9a4b296](https://github.com/pgjdbc/pgjdbc/commit/9a4b296c02427a8b21a23e8b6bb37bb8a552121f)
+* chore: make codecov to always wait 7 builds [9f9aa95](https://github.com/pgjdbc/pgjdbc/commit/9f9aa9575a54f79c30214981a49eb8e02767c3dc)
+* test: add jdk9 Travis job [PR#565](https://github.com/pgjdbc/pgjdbc/pull/565) [bbb0d35](https://github.com/pgjdbc/pgjdbc/commit/bbb0d3521378d8c4515c844cd9bb3d656f95a739)
+* fix: incorrect binary data format in bind parameter X when using batch execution (#582) [7388dc9](https://github.com/pgjdbc/pgjdbc/commit/7388dc97343073990ffc558e7b376ad8966c7ac9)
+* perf: execute "SET application_name" if name has changed only [PR#537](https://github.com/pgjdbc/pgjdbc/pull/537) [893c1a4](https://github.com/pgjdbc/pgjdbc/commit/893c1a41bedf56017473194113d335d280992851)
+* fix: fix some sonarqube warnings [7311b4e](https://github.com/pgjdbc/pgjdbc/commit/7311b4ef160231780323573911c1543d0515340b)
+* fix: revert array naming to pre 1202 behavior (e.g. _int4) [PR#595](https://github.com/pgjdbc/pgjdbc/pull/595) [1d8ebfc](https://github.com/pgjdbc/pgjdbc/commit/1d8ebfc48466f9105985bda88514ab04602bcae8)
+* refactor: rename dmlcommand -> sqlcommand [79db127](https://github.com/pgjdbc/pgjdbc/commit/79db1273cce04174999f46981aea26905ae5a189)
+* perf: implement fast-path to TimeZone.getDefault if the cache field is accessible through reflection [6b3f2e0](https://github.com/pgjdbc/pgjdbc/commit/6b3f2e07ac81a440c58b3f8231b4754f60fb5b67)
+* feat: make connectTimeout=10 (seconds) by default [b4d5976](https://github.com/pgjdbc/pgjdbc/commit/b4d5976a14bfacb3969e95c12dd39f293206e627)
+
+aryabukhin (1):
+
+* feat: add support for url-encoded JDBC URL property values [PR#532](https://github.com/pgjdbc/pgjdbc/pull/532) [4c15f31](https://github.com/pgjdbc/pgjdbc/commit/4c15f31bd9c23240ba04532c420ba3e1cb96fc21)
+
+Marc Petzold (1):
+
+* feat: support HSTORE in PgPreparedStatement#setObject(int, java.lang.Object, int, int) [785d0c7](https://github.com/pgjdbc/pgjdbc/commit/785d0c75b77ed2cb59d319eb18f9d784155a068c)
+
+goeland86 (1):
+
+* fix: avoid NPE in new PgArray(, null).toString() [PR#526](https://github.com/pgjdbc/pgjdbc/pull/526) [74b4972](https://github.com/pgjdbc/pgjdbc/commit/74b497248d0fdc3e6db32b2628256f88738c2f74)
+
+<a name="contributors_9.4.1209"></a>
+### Contributors to this release
+
+We thank the following people for their contributions to this release.
+
+[AlexElin](https://github.com/AlexElin)
+[Christian Ullrich](https://github.com/chrullrich)
+[Christopher Deckers](https://github.com/Chrriis)
+[Dave Cramer](davec at postgresintl.com)
+[Florin Asăvoaie](https://github.com/FlorinAsavoaie)
+[George Kankava](https://github.com/georgekankava)
+[Jeremy Whiting](https://github.com/whitingjr)
+[Laurenz Albe](https://github.com/laurenz)
+[Minglei Tu](https://github.com/tminglei)
+[Pavel Raiskup](https://github.com/praiskup)
+[Petro Semeniuk](https://github.com/PetroSemeniuk)
+[Philippe Marschall](https://github.com/marschall)
+[Tanya Gordeeva](https://github.com/tmgordeeva)
+[Vladimir Sitnikov](https://github.com/vlsi)
+[aryabukhin](https://github.com/aryabukhin)
+[Marc Petzold](https://github.com/dosimeta)
+[goeland86](https://github.com/goeland86)
+
+<a name="version_9.4.1208"></a>
+## Version 9.4.1208 (2016-02-16)
+
+John Harvey (1):
+
+* chore: rework update-translations.sh into pom file as a profile [e2fa9ec](https://github.com/pgjdbc/pgjdbc/commit/e2fa9ecfd289acde98cba768e008088838cd9c6e)
+
+Dave Cramer (3):
+
+* fix:regression from previous behaviour where setObject(index,object,VARHCAR) should call getString if it can't cast it to a string [PR#482](https://github.com/pgjdbc/pgjdbc/pull/482) [9d6389c](https://github.com/pgjdbc/pgjdbc/commit/9d6389c57906c9d491087f8db9fa011d8308f8c2)
+* fix:correct comment [PR#482](https://github.com/pgjdbc/pgjdbc/pull/482) [bfd73c7](https://github.com/pgjdbc/pgjdbc/commit/bfd73c72d3f59af3674e078e0e7c4b227207985d)
+* Update README.md [PR#482](https://github.com/pgjdbc/pgjdbc/pull/482) [5a956a3](https://github.com/pgjdbc/pgjdbc/commit/5a956a3720546086b3bb7dd156d1d2e3cdd1ee5a)
+
+George Kankava (3):
+
+* fix: squid:S1206 -equals(Object obj) and hashCode() should be overridden in pairs [PR#515](https://github.com/pgjdbc/pgjdbc/pull/515) [a07d6d3](https://github.com/pgjdbc/pgjdbc/commit/a07d6d395e6c7b8f3c55b2c535e5719ec431af02)
+* fix: squid:S2325 - private methods that don't access instance data should be static [PR#514](https://github.com/pgjdbc/pgjdbc/pull/514) [7aac95c](https://github.com/pgjdbc/pgjdbc/commit/7aac95c17587ddcccaac9169c0e8634703ce91e6)
+* fix: squid:S1488 - Local Variables should not be declared and then immediately returned or thrown [PR#513](https://github.com/pgjdbc/pgjdbc/pull/513) [299c9f5](https://github.com/pgjdbc/pgjdbc/commit/299c9f592580dc00d115a7f9744d7214b5d92f74)
+
+Gilles Cornu (1):
+
+* docs: update travis-ci badge [PR#475](https://github.com/pgjdbc/pgjdbc/pull/475) [f9405db](https://github.com/pgjdbc/pgjdbc/commit/f9405dbe8b4dd78bb7c107bc9051283f4841a2e1)
+
+Jeremy Whiting (1):
+
+* fix: load the ssl configuration property when defined through Properties. [a6a61be](https://github.com/pgjdbc/pgjdbc/commit/a6a61be858fd3fff53003b78f061d60cd04710d1)
+
+Markus KARG (1):
+
+* docs: fix broken link to testing README [PR#481](https://github.com/pgjdbc/pgjdbc/pull/481) [0a11144](https://github.com/pgjdbc/pgjdbc/commit/0a11144bc6a7b0e3177b3a79d84ad68f2fad788d)
+
+Philippe Marschall (7):
+
+* style: use java generics instead of raw types [PR#463](https://github.com/pgjdbc/pgjdbc/pull/463) [c10acf0](https://github.com/pgjdbc/pgjdbc/commit/c10acf00e4d54de99bef21c947cbad1e686175f6)
+* refactor: do not synchronize on ConcurrentHashMap [PR#482](https://github.com/pgjdbc/pgjdbc/pull/482) [ea4cadd](https://github.com/pgjdbc/pgjdbc/commit/ea4caddf0cea82e59d70e7eb938dd08db55667bb)
+* perf: add guards around debug log statements [PR#469](https://github.com/pgjdbc/pgjdbc/pull/469) [d77aa41](https://github.com/pgjdbc/pgjdbc/commit/d77aa4103bc4388840d17123afc9266412780a76)
+* fix: Do not swallow security exceptions [PR#471](https://github.com/pgjdbc/pgjdbc/pull/471) [beab720](https://github.com/pgjdbc/pgjdbc/commit/beab720eb08430ec67d42adc927519701c879944)
+* feat: implement resultSet.getObject(col, Class) with JSR-310 support [PR#482](https://github.com/pgjdbc/pgjdbc/pull/482) [9aa3142](https://github.com/pgjdbc/pgjdbc/commit/9aa3142af745a0a43a44cd9ed3a33470c0661371)
+* feat: implement JSR-310 support in setObject [e52f7e3](https://github.com/pgjdbc/pgjdbc/commit/e52f7e3d08b45b79906474a81c49cff7e7eaa6df)
+* fix: support local date times not in time zone [61384ec](https://github.com/pgjdbc/pgjdbc/commit/61384ec4f9f1128b3e2f92c2dd0a89ba6111f014)
+
+Rikard Pavelic (1):
+
+* perf: cache result of parsing server_version [PR#464](https://github.com/pgjdbc/pgjdbc/pull/464) [9c43d27](https://github.com/pgjdbc/pgjdbc/commit/9c43d27486c9980782147a9f11798793a53047be)
+
+Vladimir Sitnikov (24):
+
+* doc: update current versions in readme.md [PR#482](https://github.com/pgjdbc/pgjdbc/pull/482) [4f5d57c](https://github.com/pgjdbc/pgjdbc/commit/4f5d57c2f2c94a98439f20929b377d46a947ab56)
+* refactor: move implementation of Prepared and Callable statements to PgPreparedStatement and PgCallableStatement [PR#459](https://github.com/pgjdbc/pgjdbc/pull/459) [8fca8b4](https://github.com/pgjdbc/pgjdbc/commit/8fca8b433b36002df472c5c064e3d886ee4394eb)
+* style: add import order check [PR#482](https://github.com/pgjdbc/pgjdbc/pull/482) [77a188c](https://github.com/pgjdbc/pgjdbc/commit/77a188c785b5ad2d50bdad5d30decf68787322c1)
+* style: align import order with style convention [PR#482](https://github.com/pgjdbc/pgjdbc/pull/482) [00c7eb3](https://github.com/pgjdbc/pgjdbc/commit/00c7eb32a162d9d21ab6ac23e1a9bc5f0c270d2d)
+* doc: add gitter chat link to readme [PR#482](https://github.com/pgjdbc/pgjdbc/pull/482) [53190c9](https://github.com/pgjdbc/pgjdbc/commit/53190c9f5e30626b094c3371d11685cea5c759d3)
+* style: enable more checkstyle verifications [PR#482](https://github.com/pgjdbc/pgjdbc/pull/482) [b0225f6](https://github.com/pgjdbc/pgjdbc/commit/b0225f69532bcb5c136a12791635d8db742ee34c)
+* style: reformat code to fix checkstyle violations [PR#482](https://github.com/pgjdbc/pgjdbc/pull/482) [8f1c9d7](https://github.com/pgjdbc/pgjdbc/commit/8f1c9d7bd48de29e3d6dabd0489520ec49d83b25)
+* style: reformat with Eclipse [PR#467](https://github.com/pgjdbc/pgjdbc/pull/467) [2d5e7fa](https://github.com/pgjdbc/pgjdbc/commit/2d5e7fa57045a47887de4ea300a743a160ae4f86)
+* Update IDEA config [PR#482](https://github.com/pgjdbc/pgjdbc/pull/482) [7083008](https://github.com/pgjdbc/pgjdbc/commit/70830082918a020299822653ff05608e541a85ad)
+* docs: fix typos in code comments [PR#472](https://github.com/pgjdbc/pgjdbc/pull/472) [5d43712](https://github.com/pgjdbc/pgjdbc/commit/5d437128ce5252d043a912554d692a825c2b1cda)
+* style: update translations [484eafd](https://github.com/pgjdbc/pgjdbc/commit/484eafd84ac83b231f72f4d7888cac30c339bac5)
+* doc: update russian translations [92011d7](https://github.com/pgjdbc/pgjdbc/commit/92011d7022b49aff0843956a9a10b401e5efede5)
+* test: add insert .. on conflict tests for PostgreSQL 9.5 [d622a9f](https://github.com/pgjdbc/pgjdbc/commit/d622a9fe928bdc2606e5399770d429c72ccfff49)
+* fix: improve handling of DATE columns around DST dates in binary transfer [642b48a](https://github.com/pgjdbc/pgjdbc/commit/642b48a787098a6c5a068710bdbbf9f1b11f3aac)
+* test: improve insertBatch test [aea9383](https://github.com/pgjdbc/pgjdbc/commit/aea93832af5371e25ce5e4ed04ba72f350c35a47)
+* test: track code coverage [PR#494](https://github.com/pgjdbc/pgjdbc/pull/494) [0f979c3](https://github.com/pgjdbc/pgjdbc/commit/0f979c3bbe1a36e6614e3d448ea43de7be27448b)
+* test: PostgreSQL 8.4 and 9.5 databases, XA configuration [PR#499](https://github.com/pgjdbc/pgjdbc/pull/499) [8c9898a](https://github.com/pgjdbc/pgjdbc/commit/8c9898af9d6ab21f2a727cc2f673519d2c4352c7)
+* fix: make sure executeBatch returns error response for rows that would not get into database [PR#502](https://github.com/pgjdbc/pgjdbc/pull/502) [d6e3b17](https://github.com/pgjdbc/pgjdbc/commit/d6e3b17e41ded02bd111a7644c0b47b936862e6e)
+* test: add benchmarks for insert via copy and insert via array of structs [880244e](https://github.com/pgjdbc/pgjdbc/commit/880244e264181447f279babe2dd696d9b18cd023)
+* fix: PgArray returning null for binary arrays [PR#504](https://github.com/pgjdbc/pgjdbc/pull/504) [b225535](https://github.com/pgjdbc/pgjdbc/commit/b225535640b78c5e99c27f1991ab567c17fb6333)
+* doc: backend protocol, wanted features [PR#478](https://github.com/pgjdbc/pgjdbc/pull/478) [ee6118e](https://github.com/pgjdbc/pgjdbc/commit/ee6118ee7ae18cd05fbbe340ee8cfa80ca120154)
+* fix: OSGi require-capability manifest entry [PR#497](https://github.com/pgjdbc/pgjdbc/pull/497) [a3e2045](https://github.com/pgjdbc/pgjdbc/commit/a3e204580220ca0b243f9562b2cbf44e0e60d51c)
+* fix: make sure {fn now()} jdbc translation is not performed in dollar-quoted strings [PR#511](https://github.com/pgjdbc/pgjdbc/pull/511) [9109451](https://github.com/pgjdbc/pgjdbc/commit/9109451c65d43328b8e4344642331d7750d79cf6)
+
+mtran (1):
+
+* feat: ability to customize socket factory (e.g. for unix domain sockets) [PR#457](https://github.com/pgjdbc/pgjdbc/pull/457) [dc1844c](https://github.com/pgjdbc/pgjdbc/commit/dc1844c21efbb4a840347d5aaa991384e8883b69)
+
+<a name="contributors_9.4.1208"></a>
+### Contributors to this release
+
+We thank the following people for their contributions to this release.
+
+[John Harvey](https://github.com/crunchyjohn)
+[Dave Cramer](davec at postgresintl.com)
+[George Kankava](https://github.com/georgekankava)
+[Gilles Cornu](https://github.com/gildegoma)
+[Markus KARG](https://github.com/mkarg)
+[Rikard Pavelic](https://github.com/zapov)
+[Jeremy Whiting](<jwhiting at redhat.com>)
+[Vladimir Sitnikov](https://github.com/vlsi)
+[Stephen Nelson](https://github.com/lordnelson)
+[Philippe Marschall](https://github.com/marschall)
+[mtran](mtran at dhatim.com)
+
+<a name="version_9.4.1207"></a>
+## Version 9.4.1207 (2015-12-23)
+
+Jeremy Whiting (3):
+
+* Changed property loader to avoid using a default when property not already set. Allows the caller to detect when unset. Thus allowing connection Cto use programmatic log level value. Added test cases to check PGProperty method working properly. [PR#438](https://github.com/pgjdbc/pgjdbc/pull/438) [ecf4a2c](https://github.com/pgjdbc/pgjdbc/commit/ecf4a2ca9b2dcf8f233e89d33ec983c5f51bf97d)
+* Update testcase to set properties where TestUtil methods look them up. [PR#438](https://github.com/pgjdbc/pgjdbc/pull/438) [b86e07a](https://github.com/pgjdbc/pgjdbc/commit/b86e07a5b5df7e5057d8a1c33ad5ad706e20f9da)
+* Restore boot time ssl property after test cases complete. Revert change to assertion test. Safely remove existing ssl property. [PR#438](https://github.com/pgjdbc/pgjdbc/pull/438) [274f382](https://github.com/pgjdbc/pgjdbc/commit/274f38254203c26b0ad890cfd93548ce5a2cd3a9)
+
+Philippe Marschall (2):
+
+* Fix null check in getTablePrivileges [PR#453](https://github.com/pgjdbc/pgjdbc/pull/453) [244ce59](https://github.com/pgjdbc/pgjdbc/commit/244ce59f13d7b6e06a059c832a1348a74ee5e2fe)
+* Useless condition in parseQuery [PR#454](https://github.com/pgjdbc/pgjdbc/pull/454) [dd229d5](https://github.com/pgjdbc/pgjdbc/commit/dd229d5f163f0284a53b01f36d6bed74a7406e7c)
+
+Stephen Nelson (1):
+
+* chore: migrate the build to Maven [PR#322](https://github.com/pgjdbc/pgjdbc/pull/322) [f470f05](https://github.com/pgjdbc/pgjdbc/commit/f470f055fe3dadc6bc94429969119de896269e94)
+
+Vladimir Sitnikov (12):
+
+* doc: add coding guidelines to readme [PR#442](https://github.com/pgjdbc/pgjdbc/pull/442) [af62c6d](https://github.com/pgjdbc/pgjdbc/commit/af62c6d211097b7e39c04f6293c6d0f60f817adf)
+* chore: remove docbkx/pgjdbc.xml from reposiory [PR#435](https://github.com/pgjdbc/pgjdbc/pull/435) [92b65f0](https://github.com/pgjdbc/pgjdbc/commit/92b65f04de1240b24bd4f71e34903422656660c5)
+* chore: move files to "pgjdbc" maven module to prepare for pre-processor fix [PR#435](https://github.com/pgjdbc/pgjdbc/pull/435) [f95b44e](https://github.com/pgjdbc/pgjdbc/commit/f95b44ece4450ac22e98e9c3ef4b1d3ba531698f)
+* chore: use java comment preprocessor to build jre6/jre7/jre8 jars from the same sources [PR#435](https://github.com/pgjdbc/pgjdbc/pull/435) [42c2e3b](https://github.com/pgjdbc/pgjdbc/commit/42c2e3b7953b2e68281c4ec269bd9749e135065b)
+* doc: fix javadocs warnings when building via java 8 [PR#435](https://github.com/pgjdbc/pgjdbc/pull/435) [3b10873](https://github.com/pgjdbc/pgjdbc/commit/3b10873496c7e7cbd88a748a296c0f04dbce489a)
+* test: improve CopyLargeFileTest performance by dropping non required index and foreign key [PR#435](https://github.com/pgjdbc/pgjdbc/pull/435) [410a662](https://github.com/pgjdbc/pgjdbc/commit/410a662ac7cd197e33909e64172534f92325432a)
+* test: speedup DriverTest.testConnectFailover by adding a connect timeout of 5 seconds [PR#435](https://github.com/pgjdbc/pgjdbc/pull/435) [ed1a916](https://github.com/pgjdbc/pgjdbc/commit/ed1a91644fb070d0ea3347b97f79102ccfb7d66d)
+* chore: skip gpg signature when deploying snapshot artifacts via Travis [PR#449](https://github.com/pgjdbc/pgjdbc/pull/449) [d196cf4](https://github.com/pgjdbc/pgjdbc/commit/d196cf4e08c9339dfbccbf3434a69f9f74fbe7a2)
+* chore: use custom settings.xml when deploying snapshots via Travis [PR#449](https://github.com/pgjdbc/pgjdbc/pull/449) [cf40cf2](https://github.com/pgjdbc/pgjdbc/commit/cf40cf271cebefb3f71a955dd8b736c67187bdb0)
+* test: add test for insert batch that changes server-prepared statement names [PR#449](https://github.com/pgjdbc/pgjdbc/pull/449) [e5ac899](https://github.com/pgjdbc/pgjdbc/commit/e5ac89945ec4905c82bc5d1fd033103edbe6f1d6)
+* fix: prepared statement "S_2" does not exist in batch executions [PR#449](https://github.com/pgjdbc/pgjdbc/pull/449) [fa310e0](https://github.com/pgjdbc/pgjdbc/commit/fa310e076954f9686be879319af622aa30131b0f)
+* doc: add note on how to skip tests when building from source [PR#460](https://github.com/pgjdbc/pgjdbc/pull/460) [823e124](https://github.com/pgjdbc/pgjdbc/commit/823e1248e93572c15253c05f05227d5fdbed5402)
+
+Yao Chunlin (1):
+
+* Fix bug when call XAResource.start with TMJOIN flag, the old localAutoCommitMode lost. [PR#434](https://github.com/pgjdbc/pgjdbc/pull/434) [df09e2b](https://github.com/pgjdbc/pgjdbc/commit/df09e2bee35e49238d883cc6881deb5d8dea6401)
+
+<a name="contributors_9.4.1207"></a>
+### Contributors to this release
+
+We thank the following people for their contributions to this release.
+
+[Jeremy Whiting](<jwhiting at redhat.com>)
+[Vladimir Sitnikov](https://github.com/vlsi)
+[Stephen Nelson](https://github.com/lordnelson)
+[Philippe Marschall](https://github.com/marschall)
+[Yao Chunlin](https://github.com/chunlinyao)
+
+
+<a name="version_9.4-1206"></a>
+## Version 9.4-1206 (2015-11-25)
+
+Andrea Catalucci (1):
+
+* Fixed typo in Driver.java.in [PR#428](https://github.com/pgjdbc/pgjdbc/pull/428) [2589020](https://github.com/pgjdbc/pgjdbc/commit/2589020ad85edace6f43474c2e8fc86ea23bb5e6)
+
+Dave Cramer (3):
+
+* make sure logs actually get written [PR#422](https://github.com/pgjdbc/pgjdbc/pull/422) [2ad367e](https://github.com/pgjdbc/pgjdbc/commit/2ad367e0c46c69079b36140f95ec7b794b5aa8a5)
+* fix: Binary handling of empty arrays. The type of the empty array was not properly read as a result getting the type of the array caused an NPE fixes Issue #421 reported by Juha Komulainen [PR#422](https://github.com/pgjdbc/pgjdbc/pull/422) [38d8488](https://github.com/pgjdbc/pgjdbc/commit/38d8488559b4bbc5dcb7f87f542cd23d457b761d)
+* fix:building on java 1.6 [PR#422](https://github.com/pgjdbc/pgjdbc/pull/422) [9133012](https://github.com/pgjdbc/pgjdbc/commit/9133012e1e679c587b81ee43927ec1b688ba8bb8)
+* fix test case to actually check the value don't mask the exception in the event that it is thrown [PR#422](https://github.com/pgjdbc/pgjdbc/pull/422) [e975c07](https://github.com/pgjdbc/pgjdbc/commit/e975c07ceecea4d2aee457e56a6964bc4203fdba)
+* add an explicit message for the test case [PR#422](https://github.com/pgjdbc/pgjdbc/pull/422) [270b1a3](https://github.com/pgjdbc/pgjdbc/commit/270b1a386a75227c8e947f989ddd73765f0dfa30)
+
+Laurenz Albe (3):
+
+* Replace question marks only in PreparedStatements [PR#427](https://github.com/pgjdbc/pgjdbc/pull/427) [3d30a4c](https://github.com/pgjdbc/pgjdbc/commit/3d30a4c76b44ed43a5e5f9460dae16d9efdfc527)
+* Allow both single and double question marks in simple statements [PR#427](https://github.com/pgjdbc/pgjdbc/pull/427) [39d510c](https://github.com/pgjdbc/pgjdbc/commit/39d510c096cf435ff0f47bb510ae893a0c2b96d2)
+* Prettify code and add another regression test [PR#427](https://github.com/pgjdbc/pgjdbc/pull/427) [2f8a67f](https://github.com/pgjdbc/pgjdbc/commit/2f8a67f7b9ee00cd57fd1d89612995dd339f4192)
+
+Vladimir Sitnikov (3):
+
+* chore: fix dos end-of-lines [PR#418](https://github.com/pgjdbc/pgjdbc/pull/418) [63d1dd3](https://github.com/pgjdbc/pgjdbc/commit/63d1dd3ae62ee914a5416002e4795a9bedcc984e)
+* test: add tests for getBigDecimal of int4 field in both text and binary modes [PR#426](https://github.com/pgjdbc/pgjdbc/pull/426) [faac288](https://github.com/pgjdbc/pgjdbc/commit/faac28818c222f5f873074d18935c10810c7e470)
+* fix: fix invalid values when receiving int2, int4, int8 via getBigDecimal() [PR#424](https://github.com/pgjdbc/pgjdbc/pull/424) [e6f1beb](https://github.com/pgjdbc/pgjdbc/commit/e6f1beb19c1581b003ac85ab29454ac58b157d96)
+
+John K. Harvey(1)
+
+* fix: update translations to handle Russian characters [PR#430](https://github.com/pgjdbc/pgjdbc/pull/430) this hasn't been committed yet but the message class files were updated
+
+<a name="contributors_9.4-1206"></a>
+### Contributors to this release
+
+We thank the following people for their contributions to this release.
+
+[John K Harvey] (https://github.com/crunchyjohn)
+[Andrea Catalucci](https://github.com/AndreaCatalucci)
+[Laurenz Albe](https://github.com/laurenz)
+[Vladimir Sitnikov](https://github.com/vlsi)
+
+<a name="version_9.4-1205"></a>
+## Version 9.4-1205 (2015-11-03)
+
+Chapman Flack (2):
+
+* fix: recover cs, de, fr, it translations [PR#409](https://github.com/pgjdbc/pgjdbc/pull/409) [1793454](https://github.com/pgjdbc/pgjdbc/commit/17934540232d4d538d3b312b8d50026afeb5282e)
+* fix: redo spelling changes in unclobbered .po [PR#409](https://github.com/pgjdbc/pgjdbc/pull/409) [5bfb26d](https://github.com/pgjdbc/pgjdbc/commit/5bfb26d2a0330d36d124c05d566db7c25f0fca8f)
+
+Dave Cramer (10):
+
+* use UTF-8 instead of US-ASCII for initial encoding [PR#398](https://github.com/pgjdbc/pgjdbc/pull/398) [8dae0ae](https://github.com/pgjdbc/pgjdbc/commit/8dae0ae5df6ffaa484d0d6ff69aaa33f5d1d713b)
+* fix: coerce array type names to lower case [PR#402](https://github.com/pgjdbc/pgjdbc/pull/402) [f1a5cc4](https://github.com/pgjdbc/pgjdbc/commit/f1a5cc4a1dcc1ff52a607b31d2d6da65b6a9d530)
+* fix:getColumns should return columns for anything that looks like a table [PR#405](https://github.com/pgjdbc/pgjdbc/pull/405) [f9f55d6](https://github.com/pgjdbc/pgjdbc/commit/f9f55d6b15d185ae4ad387a578fec7e73389418f)
+* revert: undo changes to getTypeInfo which removed core types [PR#406](https://github.com/pgjdbc/pgjdbc/pull/406) [779ce18](https://github.com/pgjdbc/pgjdbc/commit/779ce1859bead6ff1f80a2c2e9bbc7c4347206d6)
+* fix: tests [PR#406](https://github.com/pgjdbc/pgjdbc/pull/406) [7736b8d](https://github.com/pgjdbc/pgjdbc/commit/7736b8dd4079aa72c39e20d7d0b3f6a6968d2e5e)
+* reformat: tests [PR#406](https://github.com/pgjdbc/pgjdbc/pull/406) [4acf7ae](https://github.com/pgjdbc/pgjdbc/commit/4acf7aef9e476aa829e300a1b580ed30b89532dd)
+* fix:Do not set the loglevel when instantiating a connection it is set when the Driver starts [PR#407](https://github.com/pgjdbc/pgjdbc/pull/407) [84b28eb](https://github.com/pgjdbc/pgjdbc/commit/84b28eb9f450f844d375a427816ef1758ff66b18)
+* fix: japanese translation [8aa478b](https://github.com/pgjdbc/pgjdbc/commit/8aa478b6c2770f125587f20a65cb60cd90ed8ccc)
+* updated translation class files [2fa59d1](https://github.com/pgjdbc/pgjdbc/commit/2fa59d1f6660a8a91d910aabff50c8277b724ca5)
+* build:incremented for 1205 [PR#410](https://github.com/pgjdbc/pgjdbc/pull/410) [fa0d7d5](https://github.com/pgjdbc/pgjdbc/commit/fa0d7d5d1caa3e7fbbfb7572beb9167cab38a6b4)
+
+Michael Paquier (2):
+
+* Remove non-ASCII character in code [PR#400](https://github.com/pgjdbc/pgjdbc/pull/400) [9f08e46](https://github.com/pgjdbc/pgjdbc/commit/9f08e46a75deb2f63bd73355b935b5f63799aad6)
+* Add missing entry in lib/.gitignore [PR#401](https://github.com/pgjdbc/pgjdbc/pull/401) [358aef1](https://github.com/pgjdbc/pgjdbc/commit/358aef16bdb30668788cebf19662977f75d2b522)
+
+Rikard Pavelic (1):
+
+ * fix: Improve type detection with casing issues. [PR#404](https://github.com/pgjdbc/pgjdbc/pull/404) [0de91a5](https://github.com/pgjdbc/pgjdbc/commit/0de91a570c27f78f4648c75dfd00c1b2d66aceaf)
+
+Vladimir Sitnikov (9):
+
+* fix: avoid memory leak when redeploying pgjdbc [PR#394](https://github.com/pgjdbc/pgjdbc/pull/394) [d7cab7b](https://github.com/pgjdbc/pgjdbc/commit/d7cab7bd86e4adde0aa0a2fb4a6dfed59cf05cd8)
+* test: add {?= call mysum(?, ?)} kind of test for CallableStatement [PR#410](https://github.com/pgjdbc/pgjdbc/pull/410) [45c8368](https://github.com/pgjdbc/pgjdbc/commit/45c83689d455493df38e711344635353b7e17cfe)
+* perf: add BigDecimal test performance test to ProcessResultSet [PR#411](https://github.com/pgjdbc/pgjdbc/pull/411) [6dc4183](https://github.com/pgjdbc/pgjdbc/commit/6dc41835603089405201606c45661428fb90a90e)
+* perf: optimize ResultSet.getObject [PR#411](https://github.com/pgjdbc/pgjdbc/pull/411) [567e268](https://github.com/pgjdbc/pgjdbc/commit/567e26842095be327ff03b60bb55884be2ecf960)
+* perf: optimize getBigDecimal [PR#411](https://github.com/pgjdbc/pgjdbc/pull/411) [33904ef](https://github.com/pgjdbc/pgjdbc/commit/33904ef00aa545b8a8997e62d0e5da58ea9348de)
+* test: add statement.getQueryTimeoutMs, so millisecond-scale timeouts can be tested [PR#413](https://github.com/pgjdbc/pgjdbc/pull/413) [892d7af](https://github.com/pgjdbc/pgjdbc/commit/892d7af82c4e077613a077ac950e63a8a5d069cc)
+* fix: statement.cancel and statement.setQueryTimeout should be thread-safe [PR#412](https://github.com/pgjdbc/pgjdbc/pull/412) [bc3d848](https://github.com/pgjdbc/pgjdbc/commit/bc3d8488a0a4fa16e712be83d8debaf4b9130dfa)
+* chore: print markdown links in release notes script [PR#416](https://github.com/pgjdbc/pgjdbc/pull/416) [a5b8ea7](https://github.com/pgjdbc/pgjdbc/commit/a5b8ea7460392b6e1fd0bc9f79ca5975b6cf8625)
+* chore: add .gitattributes to ensure automatic end-of-line storage of text files is used [PR#417](https://github.com/pgjdbc/pgjdbc/pull/417) [254b739](https://github.com/pgjdbc/pgjdbc/commit/254b739250c670f5113e94ab30656ff59abbd0a2)
+
+<a name="contributors_9.4-1205"></a>
+### Contributors to this release
+
+We thank the following people for their contributions to this release.
+
+[Chapman Flack](https://github.com/jcflack)
+[Michael Paquier](https://github.com/michaelpq)
+[Rikard Pavelic](https://github.com/zapov)
+[Vladimir Sitnikov](https://github.com/vlsi)
+
+<a name="version_9.4-1204"></a>
+## Version 9.4-1204 (2015-10-09)
+
+[Alexey Mozhenin](https://github.com/amozhenin)
+
+* fix: Make sure copy manager completesPR #378 (7c420ed)
+* test: update for CopyLargeFileTest test to fit into 10 minutes limit PR #378 (39cd851)
+
+[Dave Cramer](http://postgresintl.com)
+
+ * fix: implemented getFunctions in jdbc4 (03483e1)
+ * fix: error in getFunctionColumns PR #376 (5fafb86)
+ * fix: filter DatabaseMetaData.getColumns by tables PR #386 (0c95126)
+ * fix: abort connections after IOException instead of close PR #392 (3e68a70)
+
+[Vladimir Sitnikov](https://github.com/vlsi)
+
+ * pref: improve executeBatch by avoiding statement-by-statement execution PR #380 (92a9f30)
+ * perf: improve setTimestamp, setTime, setDate performance PR #379 (5a03a6e)
+ * chore: update jmh, drop irrelevant benchmark Parser#unmarkDoubleQuestion PR #384 (0d1237c)
+ * chore: add more benchmarks, add missing FlightRecorderProfiler PR #385 (613a641)
+ * feat: ignore empty sub-queries in composite queries PR #386 (3fb8046)
+ * fix: binary processing of Date/Time/Timestamps PR #387 (5ec0ac3)
+ * test: add tests for parsing of empty queries separated by semicolons PR #388 (d9310ce)
+ * fix: ConcurrentModificationException when calling PreparedStatement.close from a concurrent thread PR #392 (40bcc01)
+
+<a name="contributors_9.4-1204"></a>
+### Contributors to this release
+
+We thank the following people for their contributions to this release.
+
+[Alexey Mozhenin](https://github.com/amozhenin)
+[Vladimir Sitnikov](https://github.com/vlsi)
+
+<a name="version_9.4-1203"></a>
+## Version 9.4-1203 (2015-09-17)
+
+Author: [Dave Cramer](<davec at postgresintl.com>)
+
+* fix: Implemented getFunctions
+* fix: changed getProcedureColumns to getFunctionColumns
+* fix: CopyManager fails to copy a file, reading just part of the data #366
+
+Author: [Lonny Jacobson](https://github.com/lonnyj)
+
+* add: Added PGTime/PGTimestamp
+
+Author: [Patric Bechtel](https://github.com/patric42)
+
+* fix: setObject(int parameterIndex, Object x, int targetSqlType) as it will set scale of BigDecimal 'x' to 0 as default, resulting in rounded whole values (!). PR #353 (24312c6)
+* fix: round to correct amount test: add test for BigDecimal rounding behaviour in setObject(index,Object,targetSqlType) and setObject(index,Object,targetSqlType,scale) PR #353 (ff14f62)
+
+<a name="contributors_9.4-1203"></a>
+### Contributors to this release
+
+We thank the following people for their contributions to this release.
+
+[Lonny Jacobson](https://github.com/lonnyj)
+[Patric Bechtel](https://github.com/patric42)
+[Alexey Mozhenin](https://github.com/amozhenin)
+
+
+<a name="version_9.4-1202"></a>
+## Version 9.4-1202 (2015-08-27)
+
+Author: [Alexis Meneses](https://github.com/alexismeneses)
+
+* ResultSet positioning methods in some particular cases PR #296 (282536b)
+
+Author: [Craig Ringer](https://github.com/ringerc)
+
+* Disable binary xfer on batches returning generated keys PR #273 (763ae84)
+* Add a new test case demonstrating a bug in returning support PR #273 (4d2b046)
+* Always Describe a query in a batch that returns generated keys PR #273 (a6bd36f)
+
+Author: [Dave Cramer](<davec at postgresintl.com>)
+
+* chore: fix build.xml to allow releasing to maven PR #262 (34f9361)
+* fix: BlobInputStream ignores constructor parameters #263 PR #273 (c1c6edc)
+* don't reset forceBinary transfer if we setPreparedThreshold (937a11c)
+* Revert "perf: Remove expensive finalize methods from Statement and Connection" PR #293 (a0d3997)
+* updated copyright PR #312 (263375c)
+* Revert "Issue 250 -- Adding setURL/getURL to BaseDataSource.java" PR #312 (a1ac380)
+* fixed mailing list href PR #326 (c3e86a6)
+* increment driver version PR #346 (b8ee75d)
+
+Author: [David R. Bild](https://github.com/drbild)
+
+* feat: add equality support to PSQLState PR #277 (7698cd9)
+
+Author: [David Schlosnagle](https://github.com/schlosna)
+
+* Improve version checking PR #355 (f7a84db)
+
+Author: [Eugene Koontz](https://github.com/ekoontz)
+
+* Add support within "private Object buildArray (PgArrayList input, int index, int count)" for array elements whose type is jsonb PR #349 (d313138)
+
+Author: [Jeremy Whiting](<jwhiting at redhat.com>)
+
+* Added setter method for logging level. The method exactly matches property name in documentation. PR #282 (d9595d1)
+* Added getter method. PR #282 (65759f0)
+* Adding XML catalog to help unit tests not remote entity resolution. PR #284 (cb87067)
+* Added support to locally resolve dtd or entity files. PR #284 (017970d)
+* Disable verbose logging of the catalog resolver. PR #284 (fcc34f5)
+
+Author: [Kris Jurka](<jurka at ejurka.com>)
+
+* Improve error message for failure to update multicolumn primary key RSs. PR #284 (05ff811)
+* Remove all JDBC3 code as JDK 1.4/1.5 are no longer supported. PR #284 (f9a956b)
+* Add preliminary support for JDBC4.2. PR #284 (bd05fd2)
+
+Author: [Lonny Jacobson](https://github.com/lonnyj)
+
+* Added setURL/getURL methods. (fcc8f75)
+* Added a unit test for setURL PR #309 (5fa405b)
+
+Author: [Markus KARG](https://github.com/quipsy-karg)
+
+* perf: use shared PGBoolean instances PR #321 (159fed6)
+* docs: parameter "database" is optional PR #332 (9a9d03f)
+* refactor: binary transfer for setObject(int, Object, int) PR #351 (3ff2129)
+
+Author: [Michael Paquier](https://github.com/michaelpq)
+
+* Update entries in lib/.gitignore PR #262 (8cd15a9)
+
+Author: [Phillip Ross](https://github.com/phillipross)
+
+* Fix for issue https://github.com/pgjdbc/pgjdbc/issues/342 - Modifications to PGline to store coefficients and constant value for linear equation representations used by postgresql for native line datatype. PR #343 (0565416)
+* Fix for issue https://github.com/pgjdbc/pgjdbc/issues/342 - Removed extra copyright comments. PR #343 (5f21a18)
+* Fix for issue https://github.com/pgjdbc/pgjdbc/issues/342 - Handle vertical lines. PR #343 (3918b24)
+* Fix for issue https://github.com/pgjdbc/pgjdbc/issues/342 - Added test method for testing PGline PR #343 (1a50585)
+* Fix for issue https://github.com/pgjdbc/pgjdbc/issues/342 - Modifications to PGline test method to only attempt database access if the postgresql version supports it (v9.4+). PR #343 (15eedb5)
+
+Author: [Rikard Pavelic](<rikard at ngs.hr>)
+
+* feat: Improved composite/array type support and type naming changes. PR #333 (cddcd18)
+
+Author: [Robert J. Macomber](https://github.com/rjmac)
+
+* Deadlock after IO exception during copy cancel PR #363 (d535c13)
+
+Author: [Sehrope Sarkuni](https://github.com/sehrope)
+
+* style: clean up newline whitespace PR #273 (1b77b4c)
+* style: clean up whitespace in .travis.yml PR #274 (3ee5bbf)
+* fix: correct incorrect PG database version in .travis.yml matrix PR #274 (74b88c6)
+* style: reorder jdk versions in .travis.yml PR #274 (21289e7)
+* feat: add PostgreSQL 9.4 to .travis.yml matrix PR #274 (9e94f35)
+* feat: add escapeLiteral(...) and escapeIdentifier(...) to PGConnection PR #275 (096241f)
+
+Author: [Stephen Nelson](https://github.com/lordnelson)
+
+* Replace for loops with Java 5-style for loops. Replace String.indexOf with String.contains. Replace StringBuffer with StringBuilder. Remove boxing/unboxing of primitives. PR #245 (206a542)
+
+Author: [Vladimir Gordiychuk](https://github.com/Gordiychuk)
+
+* feat: Customize default fetchSize for statements PR #287 (093a4bc)
+* feat: Customize default fetchSize for statements PR #287 (519bfe1)
+* perf: Read test only property "org.postgresql.forceBinary" spend many time when creating statements PR #291 (e185a48)
+
+Author: [Vladimir Sitnikov](https://github.com/vlsi)
+
+* perf: Remove expensive finalize method from Statement Finalize method on Statement is moved to a separate class that is lazily created if user sets "autoCloseUnclosedConnections"="true". This dramatically improves performance of statement instantiation and reduces garbage collection overhead on several wildly used JMVs. PR #290 (eb83210)
+* docs: fix misleading statement on "can't use jdk5 features" in README.md PR #298 (5b91aed)
+* feat: implement micro-benchmark module for performance testing PR #297 (48b79a3)
+* feat: add benchmark for Parser.unmarkDoubleQuestion PR #297 (e5a7e4e)
+* feat: improve sql parsing performance PR #301 (fdd9249)
+* perf: Remove AbstractJdbc2Statement.finalize() PR #299 (b3a2f80)
+* test: add test for prepare-fetch-execute performance PR #303 (d23306c)
+* perf: improve performance of preparing statements PR #303 (7c0655b)
+* test: add test for utf8-encoder performance PR #307 (6345ab1)
+* perf: improve performance of UTF-8 encoding PR #307 (f2c175f)
+* perf: skip instantiation of testReturn and functionReturnType for non-callable statements PR #323 (8eacd06)
+* perf: parse SQL to a single string, not a array of fragments PR #319 (4797114)
+* perf: cache parsed statement across .prepareStatement calls PR #319 (5642abc)
+* refactor: cleanup constructors of JDBC4 and JDBC42 connections/statements PR #318 (a4789c0)
+* refactor: use Dequeue<...> instead of raw ArrayList in v3.QueryExecutorImpl PR #314 (787d775)
+* perf: SimpleParameterList.flags int[] -> byte[] PR #325 (f5bceda)
+* perf: cut new byte[1] from QueryExecutorImpl.receiveCommandStatus PR #326 (0ae1968)
+* perf: avoid useBinary(field) check for each sendBind PR #324 (45269b8)
+* refactor: cleanup Parser and NativeQuery after #311 PR #346 (a1029df)
+* refactor: cleanup Parser and CallableQueryKey after #319 PR #346 (5ec7dea)
+* perf: skip caching of very large queries to prevent statement cache pollution PR #346 (126b60c)
+* use current_schema() for Connection#getSchema PR #356 (ffda429)
+* chore: simple script to compose release notes PR #357 (341ff8e)
+* chore: teach release_notes.sh to identify PR ids out of merge commits PR #358 (f3214b1)
+
+<a name="contributors_9.4-1202"></a>
+### Contributors to this release
+
+We thank the following people for their contributions to this release.
+
+[Alexis Meneses](https://github.com/alexismeneses)
+[Craig Ringer](https://github.com/ringerc)
+[Jeremy Whiting](<jwhiting at redhat.com>)
+[Sehrope Sarkuni](https://github.com/sehrope)
+[Mikko Tiihonen](https://github.com/gmokki)
+[Dave Cramer](<davec at postgresintl.com>)
+[Stephen Nelson](https://github.com/lordnelson)
+[Vladimir Gordiychuk](https://github.com/Gordiychuk)
+[Vladimir Sitnikov](https://github.com/vlsi)
+[David Schlosnagle](https://github.com/schlosna)
+[Eugene Koontz](https://github.com/ekoontz)
+[Markus KARG](https://github.com/quipsy-karg)
+[Phillip Ross](https://github.com/phillipross)
+[Rikard Pavelic](<rikard at ngs.hr>)
+[Robert J. Macomber](https://github.com/rjmac)
+[Michael Paquier](https://github.com/michaelpq)
+[Lonny Jacobson](https://github.com/lonnyj)
+[Kris Jurka](<jurka at ejurka.com>)
+[David R. Bild](https://github.com/drbild)
+
+[Other committers](https://github.com/pgjdbc/pgjdbc/graphs/contributors?from=2013-10-31&to=2015-01-20&type=c)
+
+<a name="version_9.4-1201"></a>
+## Version 9.4-1201 (2015-02-25)
+Author: [Alexis Meneses](https://github.com/alexismeneses)
+
+* ![fix](../media/img/fix.jpg)Do not pull a concrete implementation of slf4j in maven pom. Fixes #251 [PR #252](https://github.com/pgjdbc/pgjdbc/pull/252) (6c2848c)
+* ![fix](../media/img/fix.jpg)Declare all maven dependencies as optional in the pom [PR #252](https://github.com/pgjdbc/pgjdbc/pull/252) (1d02876)
+* ![fix](../media/img/fix.jpg)Automatically load maven-ant-tasks to remove the need of "-lib lib" when building the project using ant PR #253 (7e80fca)
+* ![fix](../media/img/fix.jpg)ant clean target delete maven dependencies added into "lib" directory [PR #253](https://github.com/pgjdbc/pgjdbc/pull/253) (cb7964e)
+* ![chore](../media/img/chore.jpg) travis uses build process simplification [PR #253](https://github.com/pgjdbc/pgjdbc/pull/253) (e09032c)
+* ![fix](../media/img/fix.jpg) regression of `ssl` parameter processing when used in additional Properties [PR #260](https://github.com/pgjdbc/pgjdbc/pull/260) (33d55af)
+
+Author: Dave Cramer <davec at postgresintl.com>
+
+* ![fix](../media/img/fix.jpg) Make junit optional in the pom [PR #254](https://github.com/pgjdbc/pgjdbc/pull/254) (9530047)
+* ![fix](../media/img/fix.jpg) Added commit message readme [PR #255](https://github.com/pgjdbc/pgjdbc/pull/255) (c6312eb)
+* ![fix](../media/img/fix.jpg) setUrl method of BaseDataSource. fixes issue #258 [PR #358](https://github.com/pgjdbc/pgjdbc/pull/358) (52a8d91)
+
+Mikko Tiihonen (1):
+
+* ![fix](../media/img/fix.jpg) setUrl method of BaseDataSource. Add test to make sure it does not break again PR #257 (477c7c8)
+
+<a name="contributors_9.4-1201"></a>
+### Contributors to this release
+
+We thank the following people for their contributions to this release.
+
+[Alexis Meneses](https://github.com/alexismeneses)
+[Sehrope Sarkuni](https://github.com/sehrope)
+[Mikko Tiihonen](https://github.com/gmokki)
+[Dave Cramer](<davec at postgresintl.com>)
+
+[Other committers](https://github.com/pgjdbc/pgjdbc/graphs/contributors?from=2013-10-31&to=2015-01-20&type=c)
+
+<a name="version_9.4-1200"></a>
+## Version 9.4-1200 (2015-01-02)
+Author: [Alexis Meneses](https://github.com/alexismeneses)
+
+* ![fix](../media/img/fix.jpg) Support for setBinaryStream with unknown length [PR #220](https://github.com/pgjdbc/pgjdbc/pull/220)
+* ![add](../media/img/add.jpg) Improved support for BLOBS [PR #219](https://github.com/pgjdbc/pgjdbc/pull/219)
+* Added the support for very large objects (4TB) when backend is at least 9.3 using lo_xxx64 functions (see release 9.3 notes).
+* Added support for various JDBC4 methods related to Blobs:
+* setBlob with input stream in PreparedStatement
+* getBinaryStream with position and offset in Blob (also helps a lot handling very large objects)
+* ![fix](../media/img/fix.jpg) Fix for setStringType in DataSource [PR #221](https://github.com/pgjdbc/pgjdbc/pull/221)
+* ![fix](../media/img/fix.jpg) Set search path in startup packet [PR #216](https://github.com/pgjdbc/pgjdbc/pull/216)
+* ![fix](../media/img/fix.jpg) Connection.isValid() should have no impact on transaction state [PR #218](https://github.com/pgjdbc/pgjdbc/pull/218) fixes issue [#214](https://github.com/pgjdbc/pgjdbc/issues/214)
+* ![fix](../media/img/fix.jpg) Replace StringBuffer with StringBuilder for performance [PR #243](https://github.com/pgjdbc/pgjdbc/pull/243)
+* ![fix](../media/img/fix.jpg) Make Pgjdbc an OSGi bundle [PR #241](https://github.com/pgjdbc/pgjdbc/pull/241)
+* ![fix](../media/img/fix.jpg) Fixing the Travis-CI integration
+
+Author: [Sehrope Sarkuni](https://github.com/sehrope)
+
+* ![fix](../media/img/fix.jpg) Fix Timer thread classloader leak [PR #197](https://github.com/pgjdbc/pgjdbc/pull/197)
+* ![fix](../media/img/fix.jpg) Escape search_path in Connection.setSchema [PR #207](https://github.com/pgjdbc/pgjdbc/pull/207)
+* ![add](../media/img/add.jpg) Add SSL factory SingleCertValidatingFactory [PR #88](https://github.com/pgjdbc/pgjdbc/pull/88)
+* ![add](../media/img/add.jpg) Speed up connection creation on 9.0+ [PR #144](https://github.com/pgjdbc/pgjdbc/pull/144)
+
+Author: [Mikko Tiihonen](https://github.com/gmokki)
+
+* ![add](../media/img/add.jpg) Enhance connection fail-over with master/slave restriction and loadbalancing [PR #209](https://github.com/pgjdbc/pgjdbc/pull/209) Based on work by chenhj at cn.fujitsu.com
+
+Author: [Minglei Tu](https://github.com/tminglei)
+
+* ![add](../media/img/add.jpg) add ?-contained operator support [PR#227](https://github.com/pgjdbc/pgjdbc/pull/227)
+
+Author: [Martin Simka](https://github.com/simkam)
+
+* ![fix](../media/img/fix.jpg) GSS: fall back to old authentication when Subject doesn't contain instance of GssCredentials [PR#228](https://github.com/pgjdbc/pgjdbc/pull/228)
+* ![fix](../media/img/fix.jpg) gssapi: Re-use existing Subject and GssCredentials [PR#201](https://github.com/pgjdbc/pgjdbc/pull/201)
+
+Author: [bryonv](https://github.com/byronvf)
+
+* ![fix](../media/img/fix.jpg) Honor stringtype=unspecified when also saving null values
+* Currently, saving a string with setString applies oid.UNSPECIFIED, but saving null with setNull(index, java.sql.Types.VARCHAR) saves with oid.VARCHAR.
+* For consistency, if the user requested that we treat string types as unspecified, we should do so in all cases.
+
+Author: [Craig Ringer](https://github.com/ringerc)
+
+* ![add](../media/img/add.jpg) Add native SSPI authentication support on Windows using JNA via Waffle [PR #212](https://github.com/pgjdbc/pgjdbc/pull/212)
+* ![fix](../media/img/fix.jpg) Add limited support for returning generated columns in batches [PR #204](https://github.com/pgjdbc/pgjdbc/pull/204). Fixes issues [#194](https://github.com/pgjdbc/pgjdbc/issues/194) and [#195](https://github.com/pgjdbc/pgjdbc/issues/195)
+
+
+<a name="contributors_9.4-1200"></a>
+### Contributors to this release
+
+We thank the following people for their contributions to this release.
+
+[Alexis Meneses](https://github.com/alexismeneses)
+[Sehrope Sarkuni](https://github.com/sehrope)
+[Minglei Tu](https://github.com/tminglei)
+[Martin Simka](https://github.com/simkam)
+[Mikko Tiihonen](https://github.com/gmokki)
+[bryonv](https://github.com/byronvf)
+Craig Ringer <craig at 2ndquadrant.com>
+Dave Cramer <davec at postgresintl.com>
+
+[Other committers](https://github.com/pgjdbc/pgjdbc/graphs/contributors?from=2013-10-31&to=2015-01-20&type=c)
+
+***
+<a name="version_9.3-1103"></a>
+## Version 9.3-1103 (2015-01-02)
+Author: Ancoron <ancoron.luciferis at gmail.com>
+
+ Backport PGXAConnection.equals() fix from master
+
+Author: Ancoron <ancoron.luciferis at gmail.com>
+
+ Fix connection URL generation for 'stringtype' parameter in BaseDataSource
+
+Author: Heikki Linnakangas <heikki.linnakangas at iki.fi>
+
+ Fix equals-method of the wrapper returned by PGXAConnection.getConnection()
+ Patch by Florent Guillaume
+
+Author: Alexis Meneses <alexismeneses at users.noreply.github.com>
+
+ Fixes on get/set/current-schema (9.3 branch)
+
+Author: Alexis Meneses <alexismeneses at users.noreply.github.com>
+
+ Add a TestSuite for JDBC 4.1
+
+Author: Alexis Meneses <alexismeneses at users.noreply.github.com>
+
+ Unescape/unquote result of getSchema
+
+Author: Alexis Meneses <alexismeneses at users.noreply.github.com>
+
+ Setting the search_path from currentSchema property is done in startup packet (v3 protocol only)
+
+Author: Alexis Meneses <alexismeneses at users.noreply.github.com>
+
+ Add tests for schema name containing special characters
+
+Author: Alexis Meneses <alexismeneses at users.noreply.github.com>
+
+ Escape schema name when setting search_path
+
+Author: Damiano Albani <damiano.albani at gmail.com>
+
+ Add support for "currentSchema" connection property.
+
+Author: Dave Cramer <davec at postgresintl.com>
+
+ Fixed timezone test as per Tom Lane's suggestion. …
+ Now using Europe/Helsinki as the exemplar.
+
+Author: Dave Cramer <davec at postgresintl.com>
+
+ Clob will now use the connection encoding
+ pull #121 from brekka/clob_encoding
+
+Author: Dave Cramer <davec at postgresintl.com>
+
+ backpatched Statement.isClosed() implementation of PGPoolingDataSource with some performance improvements. #180
+
+Author: nicolas-f <github at nettrader.fr>
+
+ Implement hashcode in PGObject 9.3
+ Handle null value
+
+Author: Dave Cramer <davec at postgresintl.com>
+Date: Mon Aug 18 12:30:48 2014 +0000
+
+ NPE fix in org.postgresql.Driver.getPropertyInfo #176 \
+ from Sergey Ignatov
+
+<a name="version_9.3-1102"></a>
+## Version 9.3-1102 (2014-07-10)
+
+Author:epgrubmair bug #161
+
+ fix copyOut close hanging bug #161 from epgrubmair
+
+Author:romank0
+
+ backpatch exception during close of fully read stream from romank0
+
+Author:Christophe Canovas
+
+ Added caching for ResultSetMetaData complete commit
+
+Author:Elizabeth Chatman
+
+ NullPointerException in AbstractJdbc2DatabaseMetaData.getUDTs
+
+
+ setNull, setString, setObject may fail if a specified type cannot be transferred in a binary mode #151
+
+ backpatch fix for changing datestyle before copy
+
+Author:TomonariKatsumata
+
+ binary transfer fixes new feature -1 for forceBinaryTransfer
+
+Author:Sergey Chernov
+
+ connectTimeout property support backpatch
+
+Author:Naoya Anzai
+
+ fix prepared statement ERROR due to EMPTY_QUERY defined as static.
+
+
+<a name="version_9.3-1101"></a>
+## Version 9.3-1101 (2014-02-14)
+
+Author:Jeremy Whiting <jwhiting at redhat.com>
+
+ Added feature to disable column name sanitiser with a new property.
+ disableColumnSanitiser= boolean
+ remove toLower calls for performance
+
+Author:Craig Ringer <craig at 2ndquadrant.com>
+
+ Add a MainClass that tells the user they can't just run the JDBC driver
+ After one too many reports of
+ "Failed to load Main-Class manifest attribute from postgresql-xxx.jar"
+ I'm submitting a dummy main-class that tells the user what they should
+ do instead.
+
+ The message looks like:
+
+ ------------
+ PostgreSQL x.y JDBC4.1 (build bbbb)
+ Found in: jar:file:/path/to/postgresql-x.y-bbbb.jdbc41.jar!/org/postgresql/Driver.class
+
+ The PgJDBC driver is not an executable Java program.
+
+ You must install it according to the JDBC driver installation instructions for your application / container / appserver, then use it by specifying a JDBC URL of the form
+ jdbc:postgresql://
+ or using an application specific method.
+
+ See the PgJDBC documentation: http://jdbc.postgresql.org/documentation/head/index.html
+
+ This command has had no effect.
+ ------------
+
+
+ fixed bug PreparedStatement.getMetaData failed if result set was closed
+ reported by Emmanuel Guiton
+
+Author: cchantep <chantepie at altern.org>
+Date: Thu Dec 12 15:54:55 2013 +0100
+
+ Base table more usefull than "" as basic table name
+
+
+ fixed driver fails to find foreign tables fix from plalg at hotmail.com
+
+Author: Heikki Linnakangas <heikki.linnakangas at iki.fi>
+
+ Fix various setQueryTimeout bugs.
+
+ 1. If you call setQueryTimeout(5), wait 10 seconds, and call execute(), the
+ cancel timer has already expired, and the statement will be allowed to run
+ forever. Likewise, if you call setQueryTimeout(5), wait 4 seconds, and call
+ execute(), the statement will be canceled after only 1 second.
+
+ 2. If you call setQueryTimeout on a PreparedStatement, and execute the same
+ statement several times, the timeout only takes affect on the first
+ statement.
+
+ 3. If you call setQueryTimeout on one Statement, but don't execute it, the
+ timer will still fire, possible on an unrelated victim Statement.
+
+ The root cause of all of these bugs was that the timer was started at the
+ setQueryTimeout() call, not on the execute() call.
+
+ Also, remove the finally-block from the cancellation task's run-method,
+ because that might erroneously cancel the timer for the next query, if a
+ new query is started using the same statement fast enough.
+
+Author: Heikki Linnakangas <heikki.linnakangas at iki.fi>
+
+ Use StringBuffer to construct a string.
+
+ This piece of code isn't performance-critical at all, but silences a
+ Coverity complaint.
+
+Author: Heikki Linnakangas <heikki.linnakangas at iki.fi>
+
+ Avoid integer overflow.
+
+ The function returns long, but does the calculation first in int. If someone
+ sets the timeout to 600 hours in the URL, it will overflow, even though the
+ return value of the function is long and hence could return a larger value.
+
+ To silence a Coverity complaint.
+
+Author: Heikki Linnakangas <heikki.linnakangas at iki.fi>
+
+ Plug some Statement leaks in metadata queries.
+
+ These are fairly harmless, nobody calls these metadata methods frequently
+ enough for the leaks to matter, and a regular Statement doesn't hold onto
+ any server resources anyway. But let's appease Coverity.
+
+Author: Heikki Linnakangas <heikki.linnakangas at iki.fi>
+
+ Make sure file is closed on exception.
+
+ The system will eventually close the file anyway, and this read is highly
+ unlikely to throw an IOException in practice.
+
+ Also, use RandomAccessFile.readFully(byte[]) to slurp the file into byte
+ array, rather than FileInputStream.read(byte[]). The latter would need to
+ be called in a loop to protect from short reads.
+
+ Both issues were complained of by Coverity.
+
+
+Author: Stephen Nelson <stephen at eccostudio.com>
+
+ Generate a non-Maven JAR filename using build-time version and JDBC API level.
+
+Author: Stephen Nelson <stephen at eccostudio.com>
+
+ Build script changes to allow packaging and deployment to Maven central using maven-ant-tasks
+
+ Updated build.properties to contain the sonatype urls. Updated build.xml so that gpg signing works for each accompanying artifact type. Updated pom.xml to allow templated group and artifact ids.
+
+Author: Craig Ringer <craig at 2ndquadrant.com>
+
+ NonValidatingFactory should be included in both JDBC3 and JDBC4
+
+Author: Michael McCaskill <michael at team.shoeboxed.com>
+
+ Use proper System property
+
+ Using 'path.separator' results in malformed paths such as:
+ /default/dir:./postgresql/root.crt
+ This corrects the problem.
+
+Author: Dave Cramer <davecramer at gmail.com>
+
+ reset interrupted bit and throw unchecked exception if we get interrupted while trying to connect
+
+Author: Dave Cramer <davecramer at gmail.com>
+
+ add functions to allow LargeObjectMaager to commit on close from Marc Cousin
+
+Author: tminglei <tmlneu at gmail.com>
+
+ add uuid array support (rename ArrayElementBuilder to ArrayAssistant)
+
+Author: Nick White <nwhite at palantir.com>
+
+ allow the first query to be binary
+
+Author: Dave Cramer <davec at postgresintl.com>
+
+ Merge pull request #107 from cchantep/rs-basic-tblname
+
+ Basic table name for resultset metadata
+
+Author: Dave Cramer <davecramer at gmail.com>
+
+ fixed bug PreparedStatement.getMetaData failed if result set was closed
+ reported by Emmanuel Guiton #bugfix#
+
+
+
+<a name="version_9.3-1100"></a>
+## Version 9.3-1100 (2013-11-01)
+
+Author: Dave Cramer <davecramer at gmail.com>
+Date: Thu Oct 17 08:29:07 2013 -0400
+
+ reset interrupted bit and throw unchecked exception if we get interrupted while trying to connect
+
+Author: Dave Cramer <davecramer at gmail.com>
+Date: Tue Oct 15 06:51:45 2013 -0400
+
+ add functions to allow LargeObjectMaager to commit on close from Marc Cousin
+
+Author: halset <halset at ecc.no>
+Date: Mon Sep 9 12:12:26 2013 +0200
+
+ fix for setBlob with large blob
+
+Author: Dave Cramer <davecramer at gmail.com>
+Date: Tue Sep 10 09:00:37 2013 -0400
+
+ fixed DatabaseMetaDataTest as per Sylvain Cuaz
+
+Author: Dave Cramer <davecramer at gmail.com>
+Date: Mon Jul 29 09:43:20 2013 -0400
+
+ fixed sort order for DatabaseMetaData
+
+Author: Dave Cramer <davec at postgresintl.com>
+Date: Sun Jul 21 13:18:26 2013 +0000
+
+ backpatched canceltimer bug reported by Andri-Redko
+
+Author: Dave Cramer <davec at postgresintl.com>
+Date: Wed May 22 04:03:58 2013 -0700
+
+ Merge pull request #60 from davecramer/REL9_2_STABLE
+
+ backpatch BaseDataSource
+
+Author: Dave Cramer <davec at postgresintl.com>
+Date: Tue May 21 21:03:21 2013 -0400
+
+ check for null before appending to url
+
+Author: Dave Cramer <davecramer at gmail.com>
+Date: Tue May 21 20:23:00 2013 -0400
+
+ initialize binaryTranferEnable to null
+
+Author: Dave Cramer <davecramer at gmail.com>
+Date: Tue May 21 20:08:27 2013 -0400
+
+ fixed tcpkeepalive as per Rui Zhu
+ pass stringtype on to url through properties from Mike O'Toole
+
+Author: Dave Cramer <davecramer at gmail.com>
+
+Date: Wed Feb 20 06:58:59 2013 -0500
+
+ avoid NullPointerException from Derrik Hudson on User Defined Types
+
+Author: Kris Jurka <jurka at ejurka.com>
+Date: Tue Mar 26 05:33:45 2013 -0700
+
+ Lookup correct array delimiter in Connection.createArrayOf.
+
+ The old code had hardcoded a comma, but that's not true for all
+ datatypes.
+
+ Identification and fix by sumo in pull request #49, testcase by me.
+
+Author: Dave Cramer <davecramer at gmail.com>
+Date: Thu Nov 1 11:24:34 2012 -0400
+
+ fix toString to handle binary integer and float types
+
+Author: Dave Cramer <davecramer at gmail.com>
+Date: Wed Oct 31 10:23:23 2012 -0400
+
+ Fix performance regression introduced by using InetSocketAddress.getHostName()
+ Patch provided by Scott Harrington, improved upon by Kris Jurka
+
+Author: Dave Cramer <davec at postgresintl.com>
+Date: Thu Oct 18 07:44:06 2012 -0400
+
+ removed testSetObjectFromJavaArray out of jdbc2 tests
+
+Author: Dave Cramer <davec at postgresintl.com>
+Date: Wed Oct 17 14:22:03 2012 -0400
+
+ added BR translation class file
+
+Author: Dave Cramer <davecramer at gmail.com>
+Date: Thu Sep 27 09:38:25 2012 -0400
+
+ fixed missing isValid function
+
+Author: Dave Cramer <davecramer at gmail.com>
+Date: Fri Sep 21 14:58:00 2012 -0400
+
+ fixed attacl for servers below 8.3
+
+Author: Craig Ringer <ringerc at ringerc.id.au>
+Date: Thu Sep 20 17:51:39 2012 +0800
+
+ Add some info to the README with contributor info
+
+ Discuss:
+ - Bug reporting
+ - Submitting patches
+ - Test matrix
+ - GitHub
+
+Author: Craig Ringer <ringerc at ringerc.id.au>
+Date: Thu Sep 20 13:47:26 2012 +0800
+
+ Update URLs in README to refer to the Oracle page locations
+
+ Oracle has been doing a very poor job of maintaining old SUN URLs,
+ and it's likely that these will break at some point, so best update
+ them to reflect Oracle's control of Java now.
+
+ Added a link to the JDBC tutorial in the process.
+
+Author: Craig Ringer <ringerc at ringerc.id.au>
+Date: Thu Sep 20 14:02:18 2012 +0800
+
+ Allow testing to continue when local host name doesn't resolve
+
+ It seems to be a common and default configuration on some Linux systems
+ for the local hostname not to resolve to the loopback IP address. This
+ causes testTimeoutOccurs(org.postgresql.test.jdbc2.LoginTimeoutTest)
+ to fail. I'm seeing this on Fedora 17 among others.
+
+ While it's best to fix such systems, not causing an easily avoided
+ and spurious failure in PgJDBC's test suite is probably worthwhile.
+ Spit out a warning and continue.
+
+Author: Dave Cramer <davecramer at gmail.com>
+Date: Fri Aug 24 14:24:31 2012 -0400
+
+ Fixed build to not delete pgjdbc.html, which breaks the website build
+
+Author: Dave Cramer <davec at postgresintl.com>
+Date: Thu Sep 13 07:48:52 2012 -0400
+
+ updated translations
+
+Author: Dave Cramer <davec at postgresintl.com>
+Date: Thu Sep 13 07:43:40 2012 -0400
+
+ Added explicit test case for array handling from Craig Ringer
+
+Author: Dave Cramer <davec at postgresintl.com>
+Date: Thu Sep 13 07:46:55 2012 -0400
+
+ added docs for send/recv buffer size
+
+Author: Dave Cramer <davec at postgresintl.com>
+Date: Wed Sep 12 05:11:02 2012 -0400
+
+ added test case for send/recv buffers sizes
+
+Author: Dave Cramer <davec at postgresintl.com>
+Date: Tue Sep 11 20:55:41 2012 -0400
+
+ patch from Bernd Helme for send recev buffer sizes
+
+Author: Dave Cramer <davec at postgresintl.com>
+Date: Tue Sep 11 20:12:13 2012 -0400
+
+ new translation from Euler Taveira
+
+Author: Craig Ringer <ringerc at ringerc.id.au>
+Date: Thu Sep 20 16:07:43 2012 +0800
+
+ Fix breakage of JDBC3 builds with JDK5 by bddc05f939
+
+ Fixes:
+ commit bddc05f939ac9227b682e85d1ba0a9b902da814c
+ simple connection failover from Mikko Tiihonen
+
+ See:
+ https://github.com/pgjdbc/pgjdbc/issues/6
+
+ These fixes only affect builds of the JDBC3 driver. The JDBC4 driver
+ appears fine.
+
+Author: Dave Cramer <davec at postgresintl.com>
+Date: Thu Sep 13 07:43:40 2012 -0400
+
+ added explicit test case for array handling from Craig Ringer
+
+Author: Dave Cramer <davecramer at gmail.com>
+Date: Mon Jun 4 08:56:38 2012 -0400
+
+ simple connection failover from Mikko Tiihonen
+
+Author: Dave Cramer <davecramer at gmail.com>
+Date: Sun Jun 3 07:49:37 2012 -0400
+
+ implemented setBinaryStream by Johann Oskarsson
+
+Author: Dave Cramer <davecramer at gmail.com>
+Date: Fri Jun 1 17:57:31 2012 -0400
+
+ fixed docs from Mikko Tiihonen
+
+Author: Dave Cramer <davecramer at gmail.com>
+Date: Fri Jun 1 17:18:05 2012 -0400
+
+ fixed urls in docs from Mikko Tiihonen
+
+Author: Dave Cramer <davecramer at gmail.com>
+Date: Fri Jun 1 17:16:49 2012 -0400
+
+ fixed docs for loading in java 6.0 from Mikko Tiihonen
+
+Author: Dave Cramer <davecramer at gmail.com>
+Date: Tue May 15 20:35:51 2012 -0400
+
+ rest of Add hstore patch
+
+Author: Dave Cramer <davecramer at gmail.com>
+Date: Tue May 15 06:47:09 2012 -0400
+
+ Add support for hstore from Mikko Tiihonen
+
+Author: Dave Cramer <davecramer at gmail.com>
+Date: Tue May 15 06:24:34 2012 -0400
+
+ change Hashtable with Map from Mikko Tiihonen
+
+Author: Dave Cramer <davecramer at gmail.com>
+Date: Tue May 15 06:23:24 2012 -0400
+
+ change vector to list from Mikko Tiihonen
+
+Author: Dave Cramer <davec at postgresintl.com>
+Date: Wed May 2 14:12:17 2012 -0400
+
+ setProtocolVersion argument mis-spelled from Mikko Tiihonen
+
+Author: Dave Cramer <davec at postgresintl.com>
+Date: Wed May 2 14:09:28 2012 -0400
+
+ fix to build for java 1.8 from Mikko Tiihonen
+
+Author: Dave Cramer <davecramer at gmail.com>
+Date: Fri Apr 27 09:54:47 2012 -0400
+
+ check for array bounds before accessing the array
+
+Author: Kris Jurka <jurka at ejurka.com>
+Date: Mon Mar 12 17:57:55 2012 -0700
+
+ Fix setQueryTimeout test.
+
+ When setQueryTimeout was fixed to use the correct units, I
+ neglected to adjust the test at the same time.
+
+Author: Kris Jurka <jurka at ejurka.com>
+Date: Mon Mar 12 17:43:58 2012 -0700
+
+ Use a Set instead of a BitSet for tracking which types support
+ binary transfer.
+
+ A BitSet is a compact representation if we're only considering
+ builtin types that will have low oids, but if any user defined
+ types are enabled, all bets are off. Once the oid counter exceeds
+ INT_MAX, database connections were failing outright even if no
+ high oid types used binary transfer because we represent these
+ oids with negative values that a BitSet cannot handle.
+
+Author: Kris Jurka <jurka at ejurka.com>
+Date: Mon Mar 12 17:33:40 2012 -0700
+
+ Fix ResultSetMetaData retrieval when the oid counter exceeds INT_MAX.
+
+ Since Java doesn't have unsigned ints we retrieve the values as long
+ and then truncate to int, so it may have a negative value.
+
+ As reported by Owen Tran.
+
+Author: Kris Jurka <jurka at ejurka.com>
+Date: Mon Mar 12 17:33:27 2012 -0700
+
+ Fix ResultSetMetaData retrieval when the oid counter exceeds INT_MAX.
+
+ Since Java doesn't have unsigned ints we retrieve the values as long
+ and then truncate to int, so it may have a negative value.
+
+ As reported by Owen Tran.
+
+Author: Dave Cramer <davecramer at gmail.com>
+Date: Mon Feb 13 16:43:57 2012 -0500
+
+ resolve ACL getTablePriveledges for later servers
+
+Author: Kris Jurka <jurka at ejurka.com>
+Date: Fri Feb 10 01:13:48 2012 -0800
+
+ Fix bugs in setQueryTimeout.
+
+ Setting a timeout of zero seconds should disable the timeout.
+ The timeout should be in seconds, but was implemented as milliseconds.
+
+Author: Kris Jurka <jurka at ejurka.com>
+Date: Fri Feb 10 00:34:59 2012 -0800
+
+ Move logic out of concrete JDBC version classes.
+
+ The concrete JDBC implementation classes should do as little work
+ as possible. They exist solely to connect the right set of concrete
+ implemention classes, leaving all the real work to the Abstract
+ versions. Some logic had started to creep out into these concrete
+ classes which is bad because it duplicates code in paths that aren't
+ likely to be tested by a developer who is working primarily with a
+ single JDK version.
+
+Author: Kris Jurka <jurka at ejurka.com>
+Date: Thu Feb 9 23:59:41 2012 -0800
+
+ Cache a copy of ResultSetMetaData in the ResultSet.
+
+ This solves a major performance problem for ResultSetMetaData users
+ which did not cache the ResultSetMetaData object. One of the users
+ is the driver's own implementation of updatable ResultSets, so this
+ can't be worked around solely in end user code.
+
+ In the 9.0 and earlier releases, the Field objects were used to hold
+ database lookup results and these were longer lived than the
+ ResultSetMetaData object. Now that ResultSetMetaData is holding
+ these database lookups we must hold onto the object to avoid
+ repeating the database queries.
+
+ Reported as bug #6293, fix by Steven Schlansker.
+
+Author: Kris Jurka <books at ejurka.com>
+Date: Mon Feb 6 13:09:48 2012 -0800
+
+ Convert .cvsignore files to .gitignore files.
+
+Author: Kris Jurka <books at ejurka.com>
+Date: Mon Feb 6 13:01:36 2012 -0800
+
+ Remove PostgreSQL CVS keyword expansion tags.
+
+commit a57743f980a9de37877aa42a29e9c57514d5550e
+Author: Kris Jurka <books at ejurka.com>
+Date: Mon Feb 6 13:01:28 2012 -0800
+
+ Remove PostgreSQL CVS keyword expansion tags.
+
+Author: Dave Cramer <davec at fastcrypt.com>
+Date: Thu Jan 19 20:00:51 2012 +0000
+
+ added isValid implementation from Luis Flores
+
+Author: Dave Cramer <davec at fastcrypt.com>
+Date: Thu Jan 19 12:06:44 2012 +0000
+
+ SSPI authentication support from Christian Ullrich
+
+Author: Dave Cramer <davec at fastcrypt.com>
+Date: Mon Jan 16 21:00:51 2012 +0000
+
+ removed ssl tests for buildfarm
+
+Author: Dave Cramer <davec at fastcrypt.com>
+Date: Thu Jan 5 01:12:44 2012 +0000
+
+ removed quotes around language specifier server no longer supports this
+
+Author: Dave Cramer <davec at fastcrypt.com>
+Date: Tue Jan 3 15:27:55 2012 +0000
+
+ remove MakeSSL.java this is now generated
+
+Author: Dave Cramer <davec at fastcrypt.com>
+Date: Mon Nov 28 11:24:19 2011 +0000
+
+ removed Override to compile with java 1.4 added extra docs for ssl from Mikko Tiihonen
+
+Author: Dave Cramer <davec at fastcrypt.com>
+Date: Thu Nov 17 11:45:21 2011 +0000
+
+ docs for ssl from Andras Bodor
+
+Author: Dave Cramer <davec at fastcrypt.com>
+Date: Thu Nov 17 11:27:51 2011 +0000
+
+ SSL implementation from Andras Bodor more closely follow libpq
+
+Author: Dave Cramer <davec at fastcrypt.com>
+Date: Tue Oct 4 08:33:43 2011 +0000
+
+ stack overflow fix from Mike Fowler
+
+Author: Dave Cramer <davec at fastcrypt.com>
+Date: Fri Sep 30 10:08:17 2011 +0000
+
+ small fixes to binary transfer code and unit tests from Mikko Tiihonen
+
+Author: Dave Cramer <davec at fastcrypt.com>
+Date: Tue Sep 27 11:15:23 2011 +0000
+
+ more jdk 1.4 compatability issues fixed from Mike Fowler
+
+Author: Dave Cramer <davec at fastcrypt.com>
+Date: Mon Sep 26 15:16:05 2011 +0000
+
+ patch from Mike Fowler to fix broken builds
+
+Author: Dave Cramer <davec at fastcrypt.com>
+Date: Mon Sep 26 12:52:31 2011 +0000
+
+ Mikko Tiihonen patches for binary types
+
+Author: Dave Cramer <davec at fastcrypt.com>
+Date: Thu Sep 22 12:53:26 2011 +0000
+
+ binary protocol implementation from Mikko Tiihonen
+
+Author: Dave Cramer <davec at fastcrypt.com>
+Date: Tue Sep 20 15:58:49 2011 +0000
+
+ forgot driver.java.in for cancel query implementation
+
+Author: Dave Cramer <davec at fastcrypt.com>
+Date: Tue Sep 20 14:57:13 2011 +0000
+
+ implemented query timeout
+
+Author: Dave Cramer <davec at fastcrypt.com>
+Date: Tue Sep 20 14:43:44 2011 +0000
+
+ changed name of table from testmetadata to metadatatest, test was failing due to confusion with test_statement tables
+
+Author: Kris Jurka <books at ejurka.com>
+Date: Sun Sep 11 01:39:32 2011 +0000
+
+ Open HEAD for 9.2 development.
+
+<a name="version_9.2-1004"></a>
+## Version 9.2-1004 (2013-10-31)
+
+Author: Dave Cramer <davec at postgresintl.com>
+Date: Tue Oct 29 14:32:44 2013 +0000
+
+ move default port back to 5432
+
+
+Author: Dave Cramer <davec at postgresintl.com>
+Date: Tue Oct 29 12:41:09 2013 +0000
+
+ resolved conflict
+
+Author: Dave Cramer <davec at postgresintl.com>
+Date: Tue Oct 29 05:38:39 2013 -0700
+
+ Merge pull request #96 from lordnelson/maven-to-9.2-branch
+
+ Build script changes to allow packaging and deployment to Maven central ...
+
+Author: Stephen Nelson <stephen at eccostudio.com>
+Date: Sat Apr 13 00:20:36 2013 +0100
+
+ Build script changes to allow packaging and deployment to Maven central using maven-ant-tasks.
+
+ Updated build.properties to contain the sonatype urls. Updated build.xml so that gpg signing works for each accompanying artifact type. Updated pom.xml to allow templated group and artifact ids.
+
+ Use 1.4 version of gpg plugin for signing Maven upload.
+
+Author: Craig Ringer <craig at 2ndquadrant.com>
+Date: Fri Oct 25 01:27:23 2013 -0700
+
+ Merge pull request #93 from ringerc/REL9_2_STABLE
+
+ Fix #92, missing NonValidatingFactory in JDBC3 driver
+
+Author: Craig Ringer <craig at 2ndquadrant.com>
+Date: Fri Oct 25 16:18:10 2013 +0800
+
+ Fix #92, missing NonValidatingFactory in JDBC3 driver
+
+ See https://github.com/pgjdbc/pgjdbc/issues/92
+
+ You need this patch if attempts to use a URL like
+
+ jdbc:postgresql://ipaddress:port/dbname?ssl=true&sslfactory=org.postgresql.ssl.NonValidatingFactory
+
+ fails with:
+
+ java.lang.ClassNotFoundException: org.postgresql.ssl.NonValidatingFactory
+
+ in the stack trace.
+
+Author: Dave Cramer <davecramer at gmail.com>
+Date: Thu Oct 17 08:29:07 2013 -0400
+
+ reset interrupted bit and throw unchecked exception if we get interrupted while trying to connect
+
+Author: Dave Cramer <davecramer at gmail.com>
+Date: Tue Oct 15 06:51:45 2013 -0400
+
+ add functions to allow LargeObjectMaager to commit on close from Marc Cousin
+
+Author: Dave Cramer <davec at postgresintl.com>
+Date: Tue Sep 10 07:25:06 2013 -0700
+
+ Merge pull request #87 from davecramer/REL9_2_STABLE
+
+ Fixed setBlob with large blob from Tore Halset
+
+Author: halset <halset at ecc.no>
+Date: Mon Sep 9 12:12:26 2013 +0200
+
+ fix for setBlob with large blob
+
+Author: Dave Cramer <davec at postgresintl.com>
+Date: Tue Sep 10 06:20:52 2013 -0700
+
+ Merge pull request #84 from davecramer/REL9_2_STABLE
+
+ Fixed sort order for DatabaseMetaData from Sylvain Cuaz
+
+Author: Dave Cramer <davecramer at gmail.com>
+Date: Tue Sep 10 09:00:37 2013 -0400
+
+ fixed DatabaseMetaDataTest as per Sylvain Cuaz
+
+Author: Dave Cramer <davecramer at gmail.com>
+Date: Mon Jul 29 09:43:20 2013 -0400
+
+ fixed sort order for DatabaseMetaData
+
+Author: Dave Cramer <davec at postgresintl.com>
+Date: Sun Jul 21 13:18:26 2013 +0000
+
+ backpatched canceltimer bug reported by Andri-Redko
+
+Author: Dave Cramer <davec at postgresintl.com>
+Date: Sun Jun 23 06:22:09 2013 -0700
+
+ Merge pull request #66 from davecramer/REL9_2_STABLE
+
+ fixed compile mistake
+
+Author: Dave Cramer <davec at postgresintl.com>
+Date: Sun Jun 23 09:17:27 2013 -0400
+
+ fixed compile mistake
+
+Author: Dave Cramer <davec at postgresintl.com>
+Date: Mon May 27 15:23:14 2013 -0700
+
+ Merge pull request #62 from davecramer/REL9_2_STABLE
+
+ incremented version to fix pushing a 1.7 build for maven
+<a name="version_9.2-1003"></a>
+## Version 9.2-1003 (2013-07-08)
+
+Author: Dave Cramer
+Date: Mon Jul 8 03:23:25 2013 -0700
+
+ Merge pull request #68 from tomdcc/setobject-varchar-stringtype
+
+ Make PreparedStatement.setObject(pos, value, Types.VARCHAR) respect stringtype=unspecified
+
+Author: Tom Dunstan
+Date: Sun Jul 7 16:20:41 2013 +0930
+
+ Make PreparedStatement.getObject() for an enum type return a string rather than a PGObject
+
+Author: Tom Dunstan
+Date: Sun Jul 7 12:53:43 2013 +0930
+
+ Make PreparedStatement.setObject(pos, value, Types.VARCHAR) respect stringtype=unspecified
+
+Author: Dave Cramer
+Date: Wed Jul 3 03:42:36 2013 -0700
+
+ Merge pull request #67 from njwhite/hstore
+
+ the driver will always return Maps for hstore columns
+
+Author: Dave Cramer
+Date: Wed Jul 3 03:42:11 2013 -0700
+
+ Merge pull request #35 from fionatay/translations
+
+ Correct spelling in error messages and translations
+
+
+Author: Nick White
+Date: Fri Jun 28 21:44:53 2013 -0400
+
+ the driver will always return Maps for hstore columns
+
+
+Author: Dave Cramer
+Date: Tue Jun 25 08:31:34 2013 -0700
+
+ Merge pull request #64 from polarislabs/respect_ant_srcdir
+
+ Respect ant srcdir
+
+
+Author: Bryan Varner
+Date: Fri Jun 21 11:39:35 2013 -0400
+
+ Respect the ${srcdir} property for all source file references in ant script.
+
+ This makes it possible to restructure the build (in the future?) so that source and artifact files (.java and .class) are not intermingled in the same directories on disk.
+
+Author: Bryan Varner
+Date: Fri Jun 21 11:31:11 2013 -0400
+
+ Ignore netbeans and IDEA projects files.
+
+Author: Dave Cramer
+Date: Mon Jun 10 09:19:51 2013 -0700
+
+ Merge pull request #52 from valgog/master
+
+ Consider search_path when looking up type OIDs in TypeInfoCache
+
+Author: Dave Cramer
+Date: Wed May 22 08:05:11 2013 -0700
+
+ Merge pull request #61 from davecramer/master
+
+ expose URL in BaseDataSource
+
+Author: Dave Cramer
+Date: Wed May 22 10:56:55 2013 -0400
+
+ expose URL property in BaseDataSource
+ make sure stringtype gets into url from properties
+
+Author: Dave Cramer
+Date: Mon May 20 16:57:37 2013 -0700
+
+ Merge pull request #59 from davecramer/master
+
+ support for materialized views from Thomas Kellerer
+
+Author: Dave Cramer
+Date: Mon May 20 19:56:30 2013 -0400
+
+ support for materialized views from Thomas Kelllerer
+
+Author: Dave Cramer
+Date: Mon May 20 11:46:52 2013 -0700
+
+ Merge pull request #58 from davecramer/master
+
+ pgbouncer transaction patch
+
+Author: Valentine Gogichashvili
+Date: Mon Apr 15 11:16:23 2013 +0200
+
+ Added another test case for searching objects using search_path
+
+Author: Valentine Gogichashvili
+Date: Fri Apr 12 17:05:00 2013 +0200
+
+ search_path support should be working correctly even for complex cases
+
+Author: Valentine Gogichashvili
+Date: Fri Apr 12 03:31:40 2013 +0200
+
+ Test is checking search_path usage dirctly on TypeInfo methods
+
+Author: Valentine Gogichashvili
+Date: Fri Apr 12 02:35:27 2013 +0200
+
+ Consider search_path when resolving type names to OIDs
+
+ In case when types with the same name existed in several schemas,
+ TypeInfoCache did not consider the current search_path and was choosing
+ an OID of a type not deterministically. These change will make
+ the type from the current schema to be chosen. Also this change remains
+ backwards compatible with the previous implementation, still being anble
+ to find a type, that is not included into the current search_path.
+
+ Provided test fails now, as it does not TypeInfoCache
+ directly. So more work is to be done to make this test work.
+
+Author: Kris Jurka
+Date: Tue Mar 26 05:33:45 2013 -0700
+
+ Lookup correct array delimiter in Connection.createArrayOf.
+
+ The old code had hardcoded a comma, but that's not true for all
+ datatypes.
+
+ Identification and fix by sumo in pull request #49, testcase by me.
+
+Author: Kris Jurka
+Date: Tue Mar 26 05:27:06 2013 -0700
+
+ Remove plaintext README in favor of Markdown version.
+
+ Having two copies is just going to invite drift.
+
+Author: Dave Cramer
+Date: Wed Mar 20 02:30:46 2013 -0700
+
+ Merge pull request #48 from ChenHuajun/master
+
+ Fix a simple mistake in Driver.getPropertyInfo()
+
+Author: chj
+Date: Wed Mar 20 14:52:49 2013 +0800
+
+ fix a simple miss in getPropertyInfo()
+
+Author: Dave Cramer
+Date: Wed Feb 27 04:27:55 2013 -0800
+
+ Merge pull request #45 from fathomdb/fix_default_password
+
+ Change default password to 'test'
+
+Author: Dave Cramer
+Date: Wed Feb 27 04:27:26 2013 -0800
+
+ Merge pull request #44 from fathomdb/support_wrappers
+
+ Support for JDBC4 isWrapperFor & unwrap methods
+
+Author: Justin Santa Barbara
+Date: Mon Feb 25 08:12:46 2013 -0800
+
+ Change default password to 'test'
+
+ ./org/postgresql/test/README says the default password for unit tests is 'test',
+ but the default was actually 'password'
+
+Author: Justin Santa Barbara
+Date: Mon Feb 25 07:57:24 2013 -0800
+
+ Added unit test for wrapper functions
+
+Author: Justin Santa Barbara
+Date: Sat Feb 23 11:19:49 2013 -0800
+
+ Support for JDBC4 isWrapperFor & unwrap methods
+
+Author: Dave Cramer
+Date: Wed Feb 20 09:32:12 2013 -0500
+
+ removed compile error with double ,
+
+Author: Dave Cramer
+Date: Wed Feb 20 04:00:46 2013 -0800
+
+ Merge pull request #42 from davecramer/master
+
+ Avoid NPE on user defined types which have a value of null provided by Derrick Hudson
+
+Author: Dave Cramer
+Date: Wed Feb 20 06:58:59 2013 -0500
+
+ avoid NullPointerException from Derrik Hudson on User Defined Types
+
+Author: Dave Cramer
+Date: Wed Feb 20 03:42:10 2013 -0800
+
+ Merge pull request #41 from davecramer/master
+
+ Added constant for turning logging OFF
+
+Author: Dave Cramer
+Date: Wed Feb 20 06:40:54 2013 -0500
+
+ added Loglevel.OFF to complete the settings
+
+Author: lordnelson
+Date: Tue Feb 19 14:13:16 2013 +0000
+
+ Markdown version of the README
+
+Author: Dave Cramer
+Date: Thu Feb 7 06:00:11 2013 -0800
+
+ Merge pull request #38 from davecramer/master
+
+ logging did not work properly when using a datasource, also many properties were not copied to the datasource
+
+Author: Dave Cramer
+Date: Thu Feb 7 08:55:06 2013 -0500
+
+ log can not be output when using DataSource
+ property settings were not being copied to the datasource
+ these included logLevel, binaryTranfer, sslfactory, applicationName
+ patch provided by Chen Huajun
+
+Author: Kris Jurka
+Date: Thu Jan 31 16:40:41 2013 -0800
+
+ Expose enhanced error message fields from constraint violations.
+
+ The server now provides the schema, table, column, datatype, and
+ constraint names for certain errors. So expose that to users so
+ they don't have to go rummaging through the error text trying
+ to find it.
+
+ The server doesn't always provide all the fields and doesn't cover
+ all the error messages, but it's a good start. In the future it
+ would be good to expose this information in a PGXXX class instead
+ of the supposedly private ServerErrorMessage.
+
+Author: Dave Cramer
+Date: Tue Jan 29 02:36:13 2013 -0800
+
+ Merge pull request #37 from davecramer/master
+
+ fix loading of driver so that it checks for beginning of postgresql url before parsing anything
+
+Author: Dave Cramer
+Date: Mon Jan 28 16:52:56 2013 -0500
+
+ make sure driver doesn't parse anything if the url isn't for us, also catch other possible errors, reported by Nathaniel Waisbrot
+
+Author: Fiona Tay
+Date: Sun Jan 20 23:46:31 2013 -0800
+
+ Fix spelling of occured in error message
+ - An error occurred while setting up the SSL connection
+
+Author: Fiona Tay
+Date: Sun Jan 20 23:45:26 2013 -0800
+
+ Fix spelling of occured in error message
+ - Something unusual has occurred to cause the driver to fail
+
+Author: Fiona Tay
+Date: Sun Jan 20 23:44:02 2013 -0800
+
+ Fix spelling of occured in error message
+ - An I/O error occured while sending to the backend.
+
+Author: Dave Cramer
+Date: Fri Jan 11 11:38:17 2013 -0800
+
+ Merge pull request #33 from davecramer/master
+
+ fix bug where update_count not updated correctly
+
+Author: Dave Cramer
+Date: Fri Jan 11 14:36:48 2013 -0500
+
+ fixed mistake where update_count not updated properly
+
+Author: Dave Cramer
+Date: Fri Jan 11 10:25:55 2013 -0800
+
+ Merge pull request #32 from davecramer/master
+
+ Allow ParseException to be thrown
+
+Author: Dave Cramer
+Date: Fri Jan 11 13:21:56 2013 -0500
+
+ Fixed my patch to deal with update counts over 2^32
+ Check to see if the update count is greater than Integer.MAX_VALUE before
+ setting the update_count to Statement.SUCCESS_NO_INFO
+ NumberFormatException will still be thrown if there is a problem
+ parsing it.
+
+Author: Dave Cramer
+Date: Fri Jan 11 08:57:05 2013 -0800
+
+ Merge pull request #31 from davecramer/master
+
+ Bug reference 7766 reported by Zelaine Fong
+
+Author: Dave Cramer
+Date: Fri Jan 11 11:54:20 2013 -0500
+
+ Bug reference 7766 reported by Zelaine Fong
+ if an insert or update or delete statement affects more than 2^32 rows
+ we now return Statement.SUCCESS_NO_INFO
+
+Author: Dave Cramer
+Date: Fri Jan 11 08:38:06 2013 -0800
+
+ Merge pull request #30 from davecramer/master
+
+ Fix cancel timer bug reported by Andriy Redko
+
+Author: Dave Cramer
+Date: Fri Jan 11 11:34:44 2013 -0500
+
+ fix cancelTimer bug reported by Andri Redko.
+ now cancel timer when connection is closed
+ make sure timer is cancelled if there is an exception in execute
+
+Author: Dave Cramer
+Date: Fri Jan 11 06:11:41 2013 -0800
+
+ Merge pull request #29 from davecramer/master
+
+ DbKeyStoreSocketFactory was in wrong package
+
+Author: Dave Cramer
+Date: Fri Jan 11 09:09:59 2013 -0500
+
+ changed package to org.postgresql.ssl
+
+Author: Dave Cramer
+Date: Fri Jan 11 05:57:43 2013 -0800
+
+ Merge pull request #28 from davecramer/master
+
+ Japanese Translation spelling fixed by Tomonari Katsumata
+
+Author: Dave Cramer
+Date: Fri Jan 11 08:56:22 2013 -0500
+
+ Japanese translation spelling corrected provided by Tomonari Katsumata
+
+Author: Dave Cramer
+Date: Fri Jan 11 05:43:41 2013 -0800
+
+ Merge pull request #26 from stevenschlansker/read-only
+
+ Allow driver to set read-only based on a connection parameter.
+
+Author: Dave Cramer
+Date: Fri Jan 11 05:43:24 2013 -0800
+
+ Merge pull request #25 from rkrzewski/backend_pid
+
+ Expose PID of the backend process serving a paricular JDBC connection
+
+Author: Dave Cramer
+Date: Fri Jan 11 05:41:51 2013 -0800
+
+ Merge pull request #27 from davecramer/master
+
+ DbKeyStoreFactory
+
+Author: Dave Cramer
+Date: Fri Jan 11 08:37:06 2013 -0500
+
+ SSL client certificate via Keystore from a Resource file provided by Brendan Jurd
+
+ It seems that the most common way to deal with this situation is to
+ specify the keystore file and the password via system properties
+ (javax.net.ssl.keyStore et. al.), but that wasn't suitable in my case.
+ I needed to be able to load the keystore from a Resource file
+ embedded in the compiled JAR.
+
+ The class I came up with is attached. It builds on the WrappedFactory
+ provided in jdbc-postgres. All the implementer needs to do is
+ override the two abstract methods to provide an InputStream of the key
+ store, and the password to access it. The InputStream could be a
+ FileInputStream, or an InputStream returned by getResource(), or
+ whatever.
+
+ This class uses the same keystore for KeyManager (selecting the
+ key/cert to send as the client) and for TrustManager (verifying the
+ server's certificate against trusted CAs). It could easily be
+ extended to allow for two separate keystores by adding another couple
+ of methods.
+
+Author: Steven Schlansker
+Date: Sun Dec 30 11:06:43 2012 -0800
+
+ Allow driver to set read-only based on a connection parameter.
+
+<a name="contributors_9.2-1003"></a>
+### Contributors to this release
+
+We thank the following people for their contributions to this release.
+
+This is a list of all people who participated as committers:
+
+Dave Cramer (davec), Kris Jurka.
+***
+
+<a name="version_9.2-1002"></a>
+## Version 9.2-1002 (2012-11-14)
+
+* ![fix](../media/img/fix.jpg) Fix Statement.toString to handle binary integer and Float types
+ Committed by davec.
+
+<a name="contributors_9.2-1002"></a>
+### Contributors to this release
+
+We thank the following people for their contributions to this release.
+
+This is a list of all people who participated as committers:
+
+Dave Cramer (davec).
+***
+
+<a name="version_9.2-1001"></a>
+## Version 9.2-1001 (2012-10-31)
+
+* ![fix](../media/img/fix.jpg) Fix performance regression introduced by using InetSocketAddress.getHostName
+ Committed by davec. Thanks to Scott Harrington, Kris Jurka.
+
+<a name="contributors_9.2-1001"></a>
+### Contributors to this release
+
+We thank the following people for their contributions to this release.
+
+This is a list of all people who participated as committers:<br />Dave Cramer (davec).
+
+This is a list of other contributors:<br />Scott Harrington, Kris Jurka.
+***
+
+<a name="version_9.2-1000"></a>
+## Version 9.2-1000 (2012-09-27)
+
+* ![add](../media/img/add.jpg) Implemented query timeout Committed by davec. Thanks to davec.
+* ![add](../media/img/add.jpg) First pass implementation of binary protocol Committed by davec.
+ Thanks to Mikko Tiihonen.
+* ![add](../media/img/add.jpg) SSPI authentication support Committed by davec. Thanks to
+ Christian Ullrich.
+* ![add](../media/img/add.jpg) isValid implementation Committed by davec. Thanks to Louis
+ Flores.
+* ![add](../media/img/add.jpg) Add support for hstore Committed by davec. Thanks to
+ Mikko Tiihonen.
+* ![add](../media/img/add.jpg) Implemented JDBC4 setBinaryStream Committed by davec. Thanks to Johann Oskarsson.
+* ![add](../media/img/add.jpg) Implementation of simple connection failover Committed by davec.
+ Thanks to Mikko Tiihonen.
+* ![add](../media/img/add.jpg) Allow changing of send recv buffer sizes Committed by davec.
+ Thanks to Bernd Helme.
+* ![fix](../media/img/fix.jpg) Fixed broken jdk 1.4 builds Committed by davec. Thanks to
+ Mike Fowler.
+* ![fix](../media/img/fix.jpg) Stack overflow fix Committed by davec. Thanks to Mike Fowler.
+* ![fix](../media/img/fix.jpg) A BitSet is a compact representation if we're only considering
+ builtin types that will have low oids, but if any user defined
+ types are enabled, all bets are off. Once the oid counter exceeds
+ INT_MAX, database connections were failing outright even if no
+ high oid types used binary transfer because we represent these
+ oids with negative values that a BitSet cannot handle.
+ Committed by jurka.
+* ![fix](../media/img/fix.jpg) Fix attacl for servers below 8.3 Committed by davec.
+* ![update](../media/img/update.jpg) SSL implementation to mimic libpq more closely
+ Committed by davec. Thanks to Andras Bodor.
+* ![update](../media/img/update.jpg) fix to build for java 1.8 Committed by davec.
+ Thanks to Mikko Tiihonen.
+* ![update](../media/img/update.jpg) Updated Brazilian Portuguese translation.
+ Committed by davec. Thanks to Euler Taveira de Oliveira.
+* ![update](../media/img/update.jpg) Documentation updates Committed by ringerc.
+
+<a name="contributors_9.2-1000"></a>
+### Contributors to this release
+
+We thank the following people for their contributions to this release.
+
+This is a list of all people who participated as committers:
+
+Dave Cramer (davec), Kris Jurka (jurka), Craig Ringer (ringerc).
+
+This is a list of other contributors:
+
+Andras Bodor, Bernd Helme, Christian Ullrich, davec, Euler Taveira de Oliveira, Johann Oskarsson,
+Louis Flores, Mike Fowler, Mikko Tiihonen.
+***
+
+<a name="version_9.1-902"></a>
+## Version 9.1-902 (2011-04-18)
+
+* ![fix](../media/img/fix.jpg) Fix ResultSetMetaData retrieval when the oid counter
+ exceeds INT_MAX. Since Java doesn't have unsigned ints we retrieve the values
+ as long and then truncate to int, so it may have a negative value. Committed by
+ jurka. Thanks to Owen Tran .
+* ![fix](../media/img/fix.jpg) Cache a copy of ResultSetMetaData in the ResultSet.
+ This solves a major performance problem for ResultSetMetaData users
+ which did not cache the ResultSetMetaData object. One of the users
+ is the driver's own implementation of updatable ResultSets, so this
+ can't be worked around solely in end user code.
+ In the 9.0 and earlier releases, the Field objects were used to hold
+ database lookup results and these were longer lived than the
+ ResultSetMetaData object. Now that ResultSetMetaData is holding
+ these database lookups we must hold onto the object to avoid
+ repeating the database queries.
+ Committed by jurka. Thanks to Steven Schlansker.
+
+<a name="contributors_9.1-902"></a>
+### Contributors to this release
+
+We thank the following people for their contributions to this release.
+
+This is a list of all people who participated as committers:<br />Kris Jurka (jurka).
+
+This is a list of other contributors:<br />Owen Tran Steven Schlansker.
+***
+
+<a name="version_9.1-901"></a>
+## Version 9.1-901 (2011-04-18)
+
+* ![update](../media/img/update.jpg) Set version to 901 for release Committed by jurka.
+ Thanks to jurka.
+
+<a name="contributors_9.1-901"></a>
+### Contributors to this release
+
+We thank the following people for their contributions to this release.
+
+This is a list of all people who participated as committers:<br />Kris Jurka (jurka).
+
+This is a list of other contributors:
+
+jurka.
+***
+
+<a name="version_9.1dev-900"></a>
+## Version 9.1dev-900 (2011-04-18)
+
+* ![add](../media/img/add.jpg) Add support for setting application_name on both connection
+ startup and later through Connection.setClientInfo.
+ Committed by jurka.
+* ![add](../media/img/add.jpg) Fetch all metadata for the ResultSet in one query instead of
+ making a trip for each attribute of each column. Committed by jurka.
+* ![add](../media/img/add.jpg) Bring getSchemas up to JDBC 4 compliance. Return the additional
+ TABLE_CATALOG column that was added in JDBC 3. Additionally support the getSchemas
+ method added in JDBC 4 which filters the returned schemas. Committed by jurka.
+* ![add](../media/img/add.jpg) Bring getProcedures/getProcedureColumns up to JDBC 4 compliance.
+ Both methods have added a SPECIFIC_NAME column that can be used to differentiate
+ between overloaded functions. getProcedureColumns has added some other additional
+ columns to describe the datatype being returned. Committed by jurka. Thanks to Thor
+ Michael Store.
+* ![add](../media/img/add.jpg) Allow the driver to support setObject with Types.DISTINCT.
+ We report metadata indicating that values are of this type, so we'd better accept
+ it coming back in. Committed by jurka. Thanks to Vitalii Tymchyshyn.
+* ![add](../media/img/add.jpg) Support building with the 1.7 JDK. Committed by jurka.
+* ![add](../media/img/add.jpg) Support returning generated keys from batch statement
+ execution. Unfortunately we need to disable the actual batching that the driver
+ does behind the scenes because now that it is returning potentially large result
+ values we must avoid a deadlock. Committed by jurka.
+* ![fix](../media/img/fix.jpg) Report permission metadata for a table with no permissions
+ correctly. Committed by jurka. Thanks to danap.
+* ![fix](../media/img/fix.jpg) Ensure that an XAConnection throws SQLExceptions appropriately
+ even though it's a proxy class. Before this change it was throwing an
+ InvocationTargetException instead of the actual cause. Committed by jurka. Thanks
+ to Yaocl.
+* ![fix](../media/img/fix.jpg) Make updatable ResultSets work with SQLXML data. Committed by
+ jurka. Thanks to Michael Musset.
+* ![fix](../media/img/fix.jpg) If a domain has a not null constraint, report that
+ information in the metadata for both DatabaseMetaData.getColumns and
+ ResultSetMetaData.isNullable. Committed by jurka. Thanks to Thomas Kellerer.
+* ![fix](../media/img/fix.jpg) In DatabaseMetaData.getSchemas, return the user's own
+ temp schemas, but no others. Previously it wasn't returning the users own temp
+ schema, but was showing all toast temp schemas. Committed by jurka. Thanks to
+ Thomas Kellerer.
+* ![fix](../media/img/fix.jpg) Change ResultSetMetaData to return information on serial
+ datatypes in getColumnTypeName to match up with the behaviour of DatabaseMetaData.getColumns.
+ Committed by jurka.
+* ![fix](../media/img/fix.jpg) Fix literals that are injected into a SQL query to contain
+ the PG specific E'' marker if they are using the non-standard-conforming-strings
+ backslash escaping. This will get rid of the warnings from escape_string_warning.
+ Committed by jurka.
+* ![fix](../media/img/fix.jpg) Clear the generated keys associated with a Statement at
+ the next execution. If the next execution doesn't want generated keys, we don't
+ want to leave the old keys around. Committed by jurka.
+* ![fix](../media/img/fix.jpg) The 9.1 server canonicalizes the client_encoding setting,
+ so if we ask for unicode we get utf8. This confused the driver because previous
+ versions just echo back what we asked for. Ask for the canonical name now.
+ Committed by jurka. Thanks to Mike Fowler.
+* ![fix](../media/img/fix.jpg) When running tests, don't assume that we know the server's
+ default transaction isolation level. Committed by jurka. Thanks to Kevin Grittner.
+* ![update](../media/img/update.jpg) Update default permissions to account for changes in
+ different server versions. 8.2 removed the rule permission while 8.4 added a
+ trunctate permission. Committed by jurka.
+* ![update](../media/img/update.jpg) Newer server versions (9.0+) allow extra_float_digits
+ to be set to 3 instead of the old limit of 2 to get the maximum precision of
+ floating point values out of the server. Committed by jurka.
+* ![update](../media/img/update.jpg) Update the date tests for changes in the 1.6 JVM.
+ Older versions allowed five digit years and single digit days and months. The
+ latest code only allows a strict yyyy-mm-dd. This changed somewhere between
+ 1.6.0_11 and 1.6.0_21. Committed by jurka. Thanks to Mike Fowler.
+* ![update](../media/img/update.jpg) Use slightly different SQL State error codes for
+ the different types of connection setup failures to indicate which can be
+ retried and which cannot. Committed by jurka. Thanks to Donald Fraser and
+ Kevin Grittner.
+
+<a name="contributors_9.1dev-900"></a>
+### Contributors to this release
+
+We thank the following people for their contributions to this release.
+
+This is a list of all people who participated as committers:
+
+Kris Jurka (jurka).
+
+This is a list of other contributors:
+
+danap, Donald Fraser and Kevin Grittner, Kevin Grittner, Michael Musset, Mike Fowler,
+Thomas Kellerer, Thor Michael Store, Vitalii Tymchyshyn, Yaocl.
+***
+
+<a name="version_9.0-801"></a>
+## Version 9.0-801 (2010-09-20)
+
+* ![add](../media/img/add.jpg) Implement returning ASC/DESC order information in
+ getIndexInfo. Committed by jurka.
+* ![add](../media/img/add.jpg) Support PreparedStatement.setObject(int, Character).
+ Committed by jurka. Thanks to Vitalii Tymchyshyn.
+* ![fix](../media/img/fix.jpg) Work around a bug in the server's implementation of
+ the binary copy protocol. Committed by jurka. Thanks to Matthew Wakeling.
+* ![fix](../media/img/fix.jpg) Make ResultSetMetaData.getColumnType match the
+ results of DatabaseMetaData.getColumns.DATA_TYPE for domain and composite
+ types. Committed by jurka. Thanks to Thomas Kellerer.
+* ![fix](../media/img/fix.jpg) Fix DatabaseMetaData.getColumns for 7.2 servers.
+ This was accidentally broken in the previous release. Committed by jurka.
+* ![fix](../media/img/fix.jpg) Fix a minor concurrency issue during the setup for
+ processing escape functions. Committed by jurka. Thanks to Pierre Queinnec.
+* ![fix](../media/img/fix.jpg) Fix DatabaseMetaData routines that return index
+ information for a change in the 9.0 server that no longer renames the
+ pg_attribute entries for the index, but only adjust the table's attributes
+ on a column rename. Committed by jurka. Thanks to Adam Rauch.
+* ![fix](../media/img/fix.jpg) Track the tail of the SQLWarning chain so we can
+ quickly add a new element to it instead of having to walk the entire chain
+ from the head. This is important for the performance of handling plpgsql
+ functions which do a ton of RAISE NOTICES which get translated into warnings.
+ Committed by jurka. Thanks to Altaf Malik.
+
+<a name="contributors_9.0-801"></a>
+### Contributors to this release
+
+We thank the following people for their contributions to this release.
+
+This is a list of all people who participated as committers:
+
+Kris Jurka (jurka).
+
+This is a list of other contributors:
+
+Adam Rauch, Altaf Malik, Matthew Wakeling, Pierre Queinnec, Thomas Kellerer,
+Vitalii Tymchyshyn.
+***
+
+<a name="version_9.0-dev800"></a>
+## Version 9.0-dev800 (2010-05-11)
+
+* ![add](../media/img/add.jpg) Support reading the new hex escaped bytea
+ format. Committed by jurka.
+* ![add](../media/img/add.jpg) Add support for returning the new TRUNCATE
+ privilege, that was added in 8.4, to the list of known table privileges.
+ Committed by jurka. Thanks to Thomas Kellerer.
+* ![add](../media/img/add.jpg) Add the partial index constraint to the FILTER_CONDITION
+ column returned by DatabaseMetaData.getIndexInfo. Committed by jurka.
+ Thanks to Mark Kirkwood.
+* ![add](../media/img/add.jpg) Japanese translation of error messages. Committed
+ by jurka. Thanks to Hiroshi Saito.
+* ![add](../media/img/add.jpg) Bulgarian translation of error messages. Committed
+ by jurka. Thanks to Viktor Usunov.
+* ![add](../media/img/add.jpg) Add some more specific types to the return value
+ for DatabaseMetaData.getTables. Return composite types, temporary views,
+ and temporary sequences with TABLE_TYPE values specifically for them.
+ Committed by jurka. Thanks to Thomas Kellerer.
+* ![add](../media/img/add.jpg) Add loglevel and protocolversion options to
+ DataSources. Committed by jurka.
+* ![fix](../media/img/fix.jpg) Remove an unused Sun specific import that prevented
+ compilation on non-Sun JDKs. Committed by jurka. Thanks to Tom Lane.
+* ![fix](../media/img/fix.jpg) Change the processing of Statement.executeUpdate
+ to complain if any of the results of a multi-statement query string return
+ a ResultSet. Previously we were only checking the first result which
+ resulted in silent partial execution of later SELECT statements. Committed
+ by jurka. Thanks to Joseph Shraibman.
+* ![fix](../media/img/fix.jpg) Check that a Connection hasn't been closed before
+ allowing any operations on it. Committed by jurka. Thanks to Kevin
+ Grittner.
+* ![fix](../media/img/fix.jpg) Don't allow rollback or commit when a Connection
+ is in autocommit mode. Committed by jurka. Thanks to Kevin Grittner.
+* ![fix](../media/img/fix.jpg) Change the SQLStates reported for using a closed
+ Connection and closed ResultSet to be more consistent. Report connection_does_not_exist
+ (08003) for a closed Connection and object_not_in_state (55000) for a
+ ResultSet. Committed by jurka.
+* ![fix](../media/img/fix.jpg) When a COPY operation is the first statement
+ issued in a transaction, it was not sending the BEGIN necessary to
+ start the transaction. Committed by jurka. Thanks to Maciek Sakrejda.
+* ![fix](../media/img/fix.jpg) The 8.4 release added some code to avoid re-describing
+ a statement if we already had the type information available by copying
+ the resolved type information from the query to the parameters. Its
+ goal was just to overwrite parameters without a type (unknown), but it
+ was actually overwriting all types which could change the query's desired
+ behaviour. Committed by jurka. Thanks to Hiroshi Saito.
+* ![fix](../media/img/fix.jpg) Fix the ORDINAL_POSITION in the DatabaseMetaData.getColumns.
+ Previously we were returning simply pg_attribute.attnum, but that doesn't
+ work in the presence of dropped columns because later columns don't get
+ their attnum decremented if a preceding column is dropped. Instead use
+ the row_number window function for 8.4 and later servers to figure out the
+ live column position. Committed by jurka.
+* ![fix](../media/img/fix.jpg) Always specify an XA error code when creating an
+ XAException. Otherwise a transaction manager won't know what to do with
+ the error and may have to assume the worst. Committed by jurka. Thanks to
+ Heikki Linnakangas, Justin Bertram.
+* ![fix](../media/img/fix.jpg) LOB truncation didn't allow truncating to zero
+ length because it was improperly using the positioning length checks
+ which don't allow a zero length. Committed by jurka. Thanks to Simon Kissane.
+* ![fix](../media/img/fix.jpg) Protocol sync was lost when a batch statement parameter
+ had an embedded null byte. Committed by jurka. Thanks to Pierre Queinnec.
+* ![fix](../media/img/fix.jpg) Fix a problem using the Copy API to copy data to the
+ server from a Reader. After reading data out of the Reader and into a buffer,
+ we were sending the entire buffer on to the server, not just the subset of
+ it that was filled by the read operation. Committed by jurka. Thanks to Leonardo F.
+* ![fix](../media/img/fix.jpg) A XA transaction should not change the autocommit
+ setting of a Connection. Ensure that we restore this property correctly
+ after the XA transaction completes. Committed by jurka. Thanks to Heikki
+ Linnakangas, Achilleas Mantzios.
+* ![fix](../media/img/fix.jpg) PoolingDataSources were not picking up all of the
+ properties that were set for them. Notably it would not give you a SSL
+ connection when asked. Committed by jurka. Thanks to Eric Jain.
+* ![fix](../media/img/fix.jpg) When setNull is called with a TIME or TIMESTAMP
+ type we cannot pass that type information on to the backend because we
+ really don't know whether it is with or without a time zone. For a NULL
+ value it doesn't matter, but we can't establish a type because a later
+ call with a non-null value using the same PreparedStatement can potentially
+ end up using a specific type that is incorrect. Committed by jurka. Thanks
+ to Martti Jeenicke.
+
+<a name="contributors_9.0-dev800"></a>
+### Contributors to this release
+
+We thank the following people for their contributions to this release.
+
+This is a list of all people who participated as committers:
+
+Kris Jurka (jurka).
+
+This is a list of other contributors:
+
+Eric Jain, Heikki Linnakangas, Achilleas Mantzios, Heikki Linnakangas, Justin Bertram,
+Hiroshi Saito, Joseph Shraibman, Kevin Grittner, Leonardo F, Maciek Sakrejda, Mark
+Kirkwood, Martti Jeenicke, Pierre Queinnec, Simon Kissane, Thomas Kellerer, Tom Lane,
+Viktor Usunov.
+***
+
+<a name="all-committers"></a>
+## All Committers
+
+This is a list of all people who have ever participated as committers on this project.
+
+* Kris Jurka (jurka)
+* Oliver Jowett (oliver)
+* Dave Cramer (davec)
+* Barry Lind (blind)
+* Craig Ringer (ringerc)
diff --git a/docs/documentation/documentation.md b/docs/documentation/documentation.md
new file mode 100644
index 0000000..8fb0ff2
--- /dev/null
+++ b/docs/documentation/documentation.md
@@ -0,0 +1,23 @@
+---
+layout: documents
+title: PostgreSQL JDBC Documentation
+resource: ../media
+nav: ../
+---
+
+* [HEAD](head/index.html)
+* [42.x](head/index.html) Download - [postgresql-jdbc-head-doc.tar.gz](postgresql-jdbc-head-doc.tar.gz)
+* [9.4](94/index.html) Download - [postgresql-jdbc-94-doc.tar.gz](postgresql-jdbc-94-doc.tar.gz)
+* [9.3](93/index.html) Download - [postgresql-jdbc-93-doc.tar.gz](postgresql-jdbc-93-doc.tar.gz)
+* [9.2](92/index.html) Download - [postgresql-jdbc-92-doc.tar.gz](postgresql-jdbc-92-doc.tar.gz)
+* [9.1](91/index.html) Download - [postgresql-jdbc-91-doc.tar.gz](postgresql-jdbc-91-doc.tar.gz)
+* [9.0](90/index.html) Download - [postgresql-jdbc-84-doc.tar.gz](postgresql-jdbc-84-doc.tar.gz)
+* [8.4](84/index.html) Download - [postgresql-jdbc-84-doc.tar.gz](postgresql-jdbc-84-doc.tar.gz)
+* [8.3](83/index.html) Download - [postgresql-jdbc-83-doc.tar.gz](postgresql-jdbc-83-doc.tar.gz)
+* [8.2](82/index.html) Download - [postgresql-jdbc-82-doc.tar.gz](postgresql-jdbc-82-doc.tar.gz)
+* [8.1](81/index.html) Download - [postgresql-jdbc-81-doc.tar.gz](postgresql-jdbc-81-doc.tar.gz)
+* [8.0](80/index.html) Download - [postgresql-jdbc-80-doc.tar.gz](postgresql-jdbc-80-doc.tar.gz)
+* [7.4](http://www.postgresql.org/docs/7.4/static/jdbc.html)
+* [7.3](http://www.postgresql.org/docs/7.3/static/jdbc.html)
+* [7.2](http://www.postgresql.org/docs/7.2/static/jdbc.html)
+* [7.1](http://www.postgresql.org/docs/7.1/static/jdbc.html)
diff --git a/docs/documentation/faq.md b/docs/documentation/faq.md
new file mode 100644
index 0000000..50b54bf
--- /dev/null
+++ b/docs/documentation/faq.md
@@ -0,0 +1,154 @@
+---
+layout: faqs
+title: PostgreSQL JDBC FAQ
+resource: ../media
+nav: ../
+---
+
+# Frequently Asked Questions
+***
+* [1. New versioning scheme](#versioning)
+ * [1.1. Why the versioning change from 9.4.xxxx to 42.x.x?](#version-change)
+ * [1.2. Why the number 42?](#why-42)
+ * [1.3. What is not the 42.0.0 release?](#42-is-not)
+* [2. XA](#xa)
+ * [2.1. Does the driver have XA support?](#xa-support)
+ * [2.2. What is "transaction interleaving"?](#transaction-interleaving)
+* [3. Problems](#problems)
+ * [3.1. executeBatch hangs without error Possible solutions](#executeBatch-hangs-without-error)
+ * [3.2. I upgraded from 7.x to 8.x. Why did my application break?](#upgradeTo80)
+
+***
+<a name="versioning"></a>
+## 1. New versioning policy
+
+<a name="version-change"></a>
+### 1.1. Why the versioning change from 9.4.xxxx to 42.x.x?
+
+We have three issues we are trying to address here.
+
+a) We do not want to be tied to the server release schedule.
+
+Previously the version was based on the server release to declare some kind
+of compatibility, from 9.4.xxxx this was no longer the case and the
+increments was just in the last 4 digits, this leads us to the second issue.
+
+b) Avoid confusion as to which version to use with which server version.
+
+The naming scheme previously has 9.4 in it which leads people to believe it
+is for server version 9.4 only, when in fact it support PostgreSQL 8.2 and higher.
+That means that some users looking for PostgreSQL 9.5 were asking what is the
+version to use, and some users that still use PostgreSQL 8.4 were using
+the JDBC driver 8.4 Build 703.
+
+The driver is version agnostic for the most point so there is no reason to
+tie it to a specific server version. Unless you have unusual requirements
+(running old applications or JVMs), this is the driver you should be using.
+
+c) The previous version policy don't leave room for differentiate from
+bug fixes releases and feature releases.
+
+The new version policy will allow us to use more or less
+<a href="http://semver.org/">Semantic Versioning</a>, and have a more clear
+understanding of the versions.
+
+<a name="why-42"></a>
+### 1.2. Why the number 42?
+
+42 was more or less chosen at random. But it is large enough to avoid
+any future conflicts with the server. Given current server project policies,
+server version 42 should come out in 2049, plus or minus a bit.
+
+Some say that "The answer to the ultimate question of life,
+the universe and everything is 42."
+
+<a name="42-is-not"></a>
+### 1.3. What is not the 42.0.0 release?
+
+This release is not a rewrite of the driver, is not using a new architecture,
+nor is using something special, it's the continuation of the same driver
+following a better versioning policy.
+
+<a name="xa"></a>
+## 2. XA
+
+<a name="xa-support"></a>
+### 2.1. Does the driver have XA support?
+
+Yes, starting with the 8.1dev-403 driver. However, transaction interleaving is
+not supported.
+
+<a name="transaction-interleaving"></a>
+### 2.2. What is "transaction interleaving"?
+
+Transaction interleaving means that one database connection can be
+used for multiple transactions at the same time, switching between
+the transactions.
+
+Transaction interleaving is mostly useless, but it's a required part
+of the JTA specification. Some application servers use it to allow a
+bit more concurrency without allocating a bigger jdbc connection
+pool.
+
+Few JDBC drivers support transaction interleaving properly. Some
+fake it by issuing early prepare commands, risking transaction
+integrity, some give strange error messages, some fail in other,
+subtle ways. The PostgreSQL JDBC driver does it's best to detect
+interleaving and throws a proper error message when it can't do
+what's requested.
+
+Because of the lack of driver support, all of the popular application
+servers provide options to work around it, or don't use it at all.
+Therefore, lack of transaction interleaving shouldn't affect your
+application or data integrity.
+
+See the JTA specification, section 3.4.4, or search the pgsql-jdbc
+mailing list archives for more information.
+
+***
+<a name="problems"></a>
+## 3. Problems
+<a name="executeBatch-hangs-without-error">
+### 3.1. executeBatch hangs without error Possible solutions
+
+This is related to batched queries and synchronous TCP.
+
+The thing to look at is setting the network buffer
+sizes to use to large values to avoid the deadlock. The default values
+are machine dependent which also explains it working or not on different
+machines (credit to Kris Jurka)
+
+<a name="upgradeTo80"></a>
+### 3.2. I upgraded from 7.x to 8.x. Why did my application break?
+
+By default, 8.x versions of the driver use protocol version 3 when
+communicating with servers 7.4 or higher. This protocol allows for
+more efficient query execution and enables true server-side
+prepared statements, but also places some additional restrictions on
+queries. Problems with upgrading the driver generally fall into one
+of two categories:
+
+__Parameter Typing.__ Previous versions of the driver
+sent all PreparedStatement parameters to the server as untyped
+strings, and allowed the server to infer their types as appropriate.
+When running protocol version 3 however, the driver specifies the
+type of each parameter as it is being sent. The upshot of this is
+that code which was previously able to call (for example):
+<span style="font-family: Courier New,Courier,monospace;">PreparedStatement.setObject(1, "5")</span>
+to set an integer parameter now breaks, because setting a String value
+for an integer parameter is not allowed.
+
+__Parameter Position.__ Previous versions of the driver
+emulated PreparedStatements by performing string replacements
+each time the query was executed. Newer drivers using protocol 3
+however actually use server-side prepared statements with
+placeholders for the positional parameters. The upshot of this is
+that '?' positional parameters are now only allowed where the
+PostgreSQL back-end allows parameters.
+
+In situations where it is difficult to modify the Java code and/or
+queries to work with the newer protocol version, it is possible to
+force the driver to use an older protocol version to restore the old
+behavior. Look in the documentation for the
+<span style="font-family: Courier New,Courier,monospace;">protocolVersion</span>
+connection parameter.
\ No newline at end of file
diff --git a/docs/documentation/head/arrays.md b/docs/documentation/head/arrays.md
new file mode 100644
index 0000000..b74356a
--- /dev/null
+++ b/docs/documentation/head/arrays.md
@@ -0,0 +1,29 @@
+---
+layout: default_docs
+title: Arrays
+header: Chapter 9. PostgreSQL™ Extensions to the JDBC API
+resource: media
+previoustitle: Physical and Logical replication API
+previous: replication.html
+nexttitle: Chapter 10. Using the Driver in a Multithreaded or a Servlet Environment
+next: thread.html
+---
+
+PostgreSQL™ provides robust support for array data types as column types, function arguments
+and criteria in where clauses. There are several ways to create arrays with pgjdbc.
+
+The [java.sql.Connection.createArrayOf(String, Object\[\])](https://docs.oracle.com/javase/8/docs/api/java/sql/Connection.html#createArrayOf-java.lang.String-java.lang.Object:A-) can be used to create an [java.sql.Array](https://docs.oracle.com/javase/8/docs/api/java/sql/Array.html) from `Object[]` instances (Note: this includes both primitive and object multi-dimensional arrays).
+A similar method `org.postgresql.PGConnection.createArrayOf(String, Object)` provides support for primitive array types.
+The `java.sql.Array` object returned from these methods can be used in other methods, such as [PreparedStatement.setArray(int, Array)](https://docs.oracle.com/javase/8/docs/api/java/sql/PreparedStatement.html#setArray-int-java.sql.Array-).
+
+Additionally, the following types of arrays can be used in `PreparedStatement.setObject` methods and will use the defined type mapping:
+
+Java Type | Default PostgreSQL™ Type
+--- | ---
+`short[]` | `int2[]`
+`int[]` | `int4[]`
+`long[]` | `int8[]`
+`float[]` | `float4[]`
+`double[]` | `float8[]`
+`boolean[]` | `bool[]`
+`String[]` | `varchar[]`
diff --git a/docs/documentation/head/binary-data.md b/docs/documentation/head/binary-data.md
new file mode 100644
index 0000000..bbd36f1
--- /dev/null
+++ b/docs/documentation/head/binary-data.md
@@ -0,0 +1,190 @@
+---
+layout: default_docs
+title: Chapter 7. Storing Binary Data
+header: Chapter 7. Storing Binary Data
+resource: media
+previoustitle: Chapter 6. Calling Stored Functions
+previous: callproc.html
+nexttitle: Chapter 8. JDBC escapes
+next: escapes.html
+---
+
+PostgreSQL™ provides two distinct ways to store binary data. Binary data can be
+stored in a table using the data type BYTEA or by using the Large Object feature
+which stores the binary data in a separate table in a special format and refers
+to that table by storing a value of type OID in your table.
+
+In order to determine which method is appropriate you need to understand the
+limitations of each method. The BYTEA data type is not well suited for storing
+very large amounts of binary data. While a column of type BYTEA can hold up to
+1 GB of binary data, it would require a huge amount of memory to process such a
+large value. The Large Object method for storing binary data is better suited to
+storing very large values, but it has its own limitations. Specifically deleting
+a row that contains a Large Object reference does not delete the Large Object.
+Deleting the Large Object is a separate operation that needs to be performed.
+Large Objects also have some security issues since anyone connected to the
+database can view and/or modify any Large Object, even if they don't have
+permissions to view/update the row containing the Large Object reference.
+
+Version 7.2 was the first release of the JDBC driver that supports the BYTEA
+data type. The introduction of this functionality in 7.2 has introduced a change
+in behavior as compared to previous releases. Since 7.2, the methods `getBytes()`,
+`setBytes()`, `getBinaryStream()`, and `setBinaryStream()` operate on the BYTEA
+data type. In 7.1 and earlier, these methods operated on the OID data type
+associated with Large Objects. It is possible to revert the driver back to the
+old 7.1 behavior by setting the property `compatible` on the `Connection` object
+to the value `7.1`. More details on connection properties are available in the
+section called [“Connection Parameters”](connect.html#connection-parameters).
+
+To use the BYTEA data type you should simply use the `getBytes()`, `setBytes()`,
+`getBinaryStream()`, or `setBinaryStream()` methods.
+
+To use the Large Object functionality you can use either the `LargeObject` class
+provided by the PostgreSQL™ JDBC driver, or by using the `getBLOB()` and `setBLOB()`
+methods.
+
+### Important
+
+> You must access Large Objects within an SQL transaction block. You can start a
+transaction block by calling `setAutoCommit(false)`.
+
+[Example 7.1, “Processing Binary Data in JDBC”](binary-data.html#binary-data-example)
+contains some examples on how to process binary data using the PostgreSQL™ JDBC
+driver.
+
+<a name="binary-data-example"></a>
+***Example 7.1. Processing Binary Data in JDBC***
+
+For example, suppose you have a table containing the file names of images and you
+also want to store the image in a BYTEA column:
+
+```sql
+CREATE TABLE images (imgname text, img bytea);
+```
+
+To insert an image, you would use:
+
+```java
+File file = new File("myimage.gif");
+FileInputStream fis = new FileInputStream(file);
+PreparedStatement ps = conn.prepareStatement("INSERT INTO images VALUES (?, ?)");
+ps.setString(1, file.getName());
+ps.setBinaryStream(2, fis, (int)file.length());
+ps.executeUpdate();
+ps.close();
+fis.close();
+```
+
+Here, `setBinaryStream()` transfers a set number of bytes from a stream into the
+column of type BYTEA. This also could have been done using the `setBytes()` method
+if the contents of the image was already in a `byte[]`.
+
+### Note
+
+> The length parameter to `setBinaryStream` must be correct. There is no way to
+indicate that the stream is of unknown length. If you are in this situation, you
+must read the stream yourself into temporary storage and determine the length.
+Now with the correct length you may send the data from temporary storage on to
+the driver.
+
+Retrieving an image is even easier. (We use `PreparedStatement` here, but the
+`Statement` class can equally be used.)
+
+```java
+PreparedStatement ps = conn.prepareStatement("SELECT img FROM images WHERE imgname = ?");
+ps.setString(1, "myimage.gif");
+ResultSet rs = ps.executeQuery();
+while (rs.next())
+{
+ byte[] imgBytes = rs.getBytes(1);
+ // use the data in some way here
+}
+rs.close();
+ps.close();
+```
+
+Here the binary data was retrieved as an `byte[]`. You could have used a
+`InputStream` object instead.
+
+Alternatively you could be storing a very large file and want to use the
+`LargeObject` API to store the file:
+
+```sql
+CREATE TABLE imageslo (imgname text, imgoid oid);
+```
+
+To insert an image, you would use:
+
+```java
+// All LargeObject API calls must be within a transaction block
+conn.setAutoCommit(false);
+
+// Get the Large Object Manager to perform operations with
+LargeObjectManager lobj = conn.unwrap(org.postgresql.PGConnection.class).getLargeObjectAPI();
+
+// Create a new large object
+long oid = lobj.createLO(LargeObjectManager.READ | LargeObjectManager.WRITE);
+
+// Open the large object for writing
+LargeObject obj = lobj.open(oid, LargeObjectManager.WRITE);
+
+// Now open the file
+File file = new File("myimage.gif");
+FileInputStream fis = new FileInputStream(file);
+
+// Copy the data from the file to the large object
+byte buf[] = new byte[2048];
+int s, tl = 0;
+while ((s = fis.read(buf, 0, 2048)) > 0)
+{
+ obj.write(buf, 0, s);
+ tl += s;
+}
+
+// Close the large object
+obj.close();
+
+// Now insert the row into imageslo
+PreparedStatement ps = conn.prepareStatement("INSERT INTO imageslo VALUES (?, ?)");
+ps.setString(1, file.getName());
+ps.setLong(2, oid);
+ps.executeUpdate();
+ps.close();
+fis.close();
+
+// Finally, commit the transaction.
+conn.commit();
+```
+
+Retrieving the image from the Large Object:
+
+```java
+// All LargeObject API calls must be within a transaction block
+conn.setAutoCommit(false);
+
+// Get the Large Object Manager to perform operations with
+LargeObjectManager lobj = conn.unwrap(org.postgresql.PGConnection.class).getLargeObjectAPI();
+
+PreparedStatement ps = conn.prepareStatement("SELECT imgoid FROM imageslo WHERE imgname = ?");
+ps.setString(1, "myimage.gif");
+ResultSet rs = ps.executeQuery();
+while (rs.next())
+{
+ // Open the large object for reading
+ long oid = rs.getLong(1);
+ LargeObject obj = lobj.open(oid, LargeObjectManager.READ);
+
+ // Read the data
+ byte buf[] = new byte[obj.size()];
+ obj.read(buf, 0, obj.size());
+ // Do something with the data read here
+
+ // Close the object
+ obj.close();
+}
+rs.close();
+ps.close();
+
+// Finally, commit the transaction.
+conn.commit();
+```
diff --git a/docs/documentation/head/callproc.md b/docs/documentation/head/callproc.md
new file mode 100644
index 0000000..bf5e14a
--- /dev/null
+++ b/docs/documentation/head/callproc.md
@@ -0,0 +1,124 @@
+---
+layout: default_docs
+title: Chapter 6. Calling Stored Functions
+header: Chapter 6. Calling Stored Functions
+resource: media
+previoustitle: Creating and Modifying Database Objects
+previous: ddl.html
+nexttitle: Chapter 7. Storing Binary Data
+next: binary-data.html
+---
+
+**Table of Contents**
+
+* [Obtaining a `ResultSet` from a stored function](callproc.html#callproc-resultset)
+ * [From a Function Returning `SETOF` type](callproc.html#callproc-resultset-setof)
+ * [From a Function Returning a refcursor](callproc.html#callproc-resultset-refcursor)
+
+<a name="call-function-example"></a>
+**Example 6.1. Calling a built in stored function**
+
+This example shows how to call a PostgreSQL™ built in function, `upper`, which
+simply converts the supplied string argument to uppercase.
+
+```java
+CallableStatement upperProc = conn.prepareCall("{? = call upper( ? ) }");
+upperProc.registerOutParameter(1, Types.VARCHAR);
+upperProc.setString(2, "lowercase to uppercase");
+upperProc.execute();
+String upperCased = upperProc.getString(1);
+upperProc.close();
+```
+
+<a name="callproc-resultset"></a>
+# Obtaining a `ResultSet` from a stored function
+
+PostgreSQL's™ stored functions can return results in two different ways. The
+function may return either a refcursor value or a `SETOF` some datatype. Depending
+on which of these return methods are used determines how the function should be
+called.
+
+<a name="callproc-resultset-setof"></a>
+## From a Function Returning `SETOF` type
+
+Functions that return data as a set should not be called via the `CallableStatement`
+interface, but instead should use the normal `Statement` or `PreparedStatement`
+interfaces.
+
+<a name="setof-resultset"></a>
+**Example 6.2. Getting `SETOF` type values from a function**
+
+```java
+Statement stmt = conn.createStatement();
+stmt.execute("CREATE OR REPLACE FUNCTION setoffunc() RETURNS SETOF int AS "
+ + "' SELECT 1 UNION SELECT 2;' LANGUAGE sql");
+ResultSet rs = stmt.executeQuery("SELECT * FROM setoffunc()");
+while (rs.next())
+{
+ // do something
+}
+rs.close();
+stmt.close();
+```
+
+<a name="callproc-resultset-refcursor"></a>
+## From a Function Returning a refcursor
+
+When calling a function that returns a refcursor you must cast the return type of
+`getObject` to a `ResultSet`
+
+### Note
+
+> One notable limitation of the current support for a `ResultSet` created from
+a refcursor is that even though it is a cursor backed `ResultSet`, all data will
+be retrieved and cached on the client. The `Statement` fetch size parameter
+described in the section called [“Getting results based on a cursor”](query.html#query-with-cursor)
+is ignored. This limitation is a deficiency of the JDBC driver, not the server,
+and it is technically possible to remove it, we just haven't found the time.
+
+<a name="get-refcursor-from-function-call"></a>
+**Example 6.3. Getting refcursor Value From a Function**
+
+```java
+// Setup function to call.
+Statement stmt = conn.createStatement();
+stmt.execute("CREATE OR REPLACE FUNCTION refcursorfunc() RETURNS refcursor AS '"
+ + " DECLARE "
+ + " mycurs refcursor; "
+ + " BEGIN "
+ + " OPEN mycurs FOR SELECT 1 UNION SELECT 2; "
+ + " RETURN mycurs; "
+ + " END;' language plpgsql");
+stmt.close();
+
+// We must be inside a transaction for cursors to work.
+conn.setAutoCommit(false);
+
+// Procedure call.
+CallableStatement proc = conn.prepareCall("{? = call refcursorfunc() }");
+proc.registerOutParameter(1, Types.OTHER);
+proc.execute();
+ResultSet results = (ResultSet) proc.getObject(1);
+while (results.next())
+{
+ // do something with the results.
+}
+results.close();
+proc.close();
+```
+
+It is also possible to treat the refcursor return value as a cursor name directly.
+To do this, use the `getString` of `ResultSet`. With the underlying cursor name,
+you are free to directly use cursor commands on it, such as `FETCH` and `MOVE`.
+
+<a name="refcursor-string-example"></a>
+**Example 6.4. Treating refcursor as a cursor name**
+
+```java
+conn.setAutoCommit(false);
+CallableStatement proc = conn.prepareCall("{? = call refcursorfunc() }");
+proc.registerOutParameter(1, Types.OTHER);
+proc.execute();
+String cursorName = proc.getString(1);
+proc.close();
+```
diff --git a/docs/documentation/head/classpath.md b/docs/documentation/head/classpath.md
new file mode 100644
index 0000000..88f5567
--- /dev/null
+++ b/docs/documentation/head/classpath.md
@@ -0,0 +1,28 @@
+---
+layout: default_docs
+title: Setting up the Class Path
+header: Chapter 2. Setting up the JDBC Driver
+resource: media
+previoustitle: Chapter 2. Setting up the JDBC Driver
+previous: setup.html
+nexttitle: Preparing the Database Server for JDBC
+next: prepare.html
+---
+
+To use the driver, the JAR archive named `postgresql.jar` if you built from source,
+otherwise it will likely be (named with the following convention: `postgresql-*[server version]*.*[build number]*.jdbc*[JDBC version]*.jar`,
+for example `postgresql-8.0-310.jdbc3.jar`) needs to be included in the class path,
+either by putting it in the `CLASSPATH` environment variable, or by using flags on
+the **java** command line.
+
+For instance, assume we have an application that uses the JDBC driver to access
+a database, and that application is installed as `/usr/local/lib/myapp.jar`. The
+PostgreSQL™ JDBC driver installed as `/usr/local/pgsql/share/java/postgresql.jar`.
+To run the application, we would use:
+
+```bash
+export CLASSPATH=/usr/local/lib/myapp.jar:/usr/local/pgsql/share/java/postgresql.jar:.
+java MyApp
+```
+
+Loading the driver from within the application is covered in [Chapter 3, Initializing the Driver](use.html).
diff --git a/docs/documentation/head/connect.md b/docs/documentation/head/connect.md
new file mode 100644
index 0000000..9763b76
--- /dev/null
+++ b/docs/documentation/head/connect.md
@@ -0,0 +1,459 @@
+---
+layout: default_docs
+title: Connecting to the Database
+header: Chapter 3. Initializing the Driver
+resource: media
+previoustitle: Loading the Driver
+previous: load.html
+nexttitle: Chapter 4. Using SSL
+next: ssl.html
+---
+
+With JDBC, a database is represented by a URL (Uniform Resource Locator). With
+PostgreSQL, this takes one of the following forms:
+
+* jdbc:postgresql:*`database`*
+* jdbc:postgresql:/
+* jdbc:postgresql://*`host/database`*
+* jdbc:postgresql://*`host/`*
+* jdbc:postgresql://*`host:port/database`*
+* jdbc:postgresql://*`host:port/`*
+
+The parameters have the following meanings:
+
+* *`host`*
+
+ The host name of the server. Defaults to `localhost`. To specify an IPv6
+ address your must enclose the `host` parameter with square brackets, for
+ example:
+
+ jdbc:postgresql://[::1]:5740/accounting
+
+* *`port`*
+
+ The port number the server is listening on. Defaults to the PostgreSQL™
+ standard port number (5432).
+
+* *`database`*
+
+ The database name. The default is to connect to a database with the same name
+ as the user name.
+
+To connect, you need to get a `Connection` instance from JDBC. To do this, you use
+the `DriverManager.getConnection()` method:
+
+`Connection db = DriverManager.getConnection(url, username, password)`;
+
+<a name="connection-parameters"></a>
+## Connection Parameters
+
+In addition to the standard connection parameters the driver supports a number
+of additional properties which can be used to specify additional driver behaviour
+specific to PostgreSQL™. These properties may be specified in either the connection
+URL or an additional `Properties` object parameter to `DriverManager.getConnection`.
+The following examples illustrate the use of both methods to establish a SSL
+connection.
+
+```java
+String url = "jdbc:postgresql://localhost/test";
+Properties props = new Properties();
+props.setProperty("user","fred");
+props.setProperty("password","secret");
+props.setProperty("ssl","true");
+Connection conn = DriverManager.getConnection(url, props);
+
+String url = "jdbc:postgresql://localhost/test?user=fred&password=secret&ssl=true";
+Connection conn = DriverManager.getConnection(url);
+```
+
+* **user** = String
+
+ The database user on whose behalf the connection is being made.
+
+* **password** = String
+
+ The database user's password.
+
+* **ssl** = boolean
+
+ Connect using SSL. The driver must have been compiled with SSL support.
+ This property does not need a value associated with it. The mere presence
+ of it specifies a SSL connection. However, for compatibility with future
+ versions, the value "true" is preferred. For more information see [Chapter
+ 4, *Using SSL*](ssl.html).
+
+* **sslfactory** = String
+
+ The provided value is a class name to use as the `SSLSocketFactory` when
+ establishing a SSL connection. For more information see the section
+ called [“Custom SSLSocketFactory”](ssl-factory.html).
+
+* **sslfactoryarg** = String
+
+ This value is an optional argument to the constructor of the sslfactory
+ class provided above. For more information see the section called [“Custom SSLSocketFactory”](ssl-factory.html).
+
+* **sslmode** = String
+
+ possible values include "disable", "require", "verify-ca" and "verify-full", "allow" and "prefer"
+ will throw an exception. "require" will default to a non validating SSL factory and not check the
+ validity of the certificates. "verify-ca" and "verify-full" use a validating SSL factory and will
+ check that the ca is correct and the host is correct. Setting these will necessitate storing the
+ server certificate on the client machine ["Configuring the client"](ssl-client.html).
+
+* **sslcert** = String
+
+ Provide the full path for the certificate file. Defaults to /defaultdir/postgresql.crt
+
+ *Note:* defaultdir is ${user.home}/.postgresql/ in *nix systems and %appdata%/postgresql/ on windows
+
+* **sslkey** = String
+
+ Provide the full path for the key file. Defaults to /defaultdir/postgresql.pk8
+
+* **sslrootcert** = String
+
+ File name of the SSL root certificate. Defaults to defaultdir/root.crt
+
+* **sslhostnameverifier** = String
+
+ Class name of hostname verifier. Defaults to using `org.postgresql.ssl.jdbc4.LibPQFactory.verify()`
+
+* **sslpasswordcallback** = String
+
+ Class name of the SSL password provider. Defaults to `org.postgresql.ssl.jdbc4.LibPQFactory.ConsoleCallbackHandler`
+
+* **sslpassword** = String
+
+ If provided will be used by ConsoleCallbackHandler
+
+* **sendBufferSize** = int
+
+ Sets SO_SNDBUF on the connection stream
+
+* **recvBufferSize** = int
+
+ Sets SO_RCVBUF on the connection stream
+
+* **protocolVersion** = int
+
+ The driver supports the V3 frontend/backend protocols. The V3 protocol was introduced in 7.4 and
+ the driver will by default try to connect using the V3 protocol.
+
+* **loggerLevel** = String
+
+ Logger level of the driver. Allowed values: <code>OFF</code>, <code>DEBUG</code> or <code>TRACE</code>.
+ This enable the <code>java.util.logging.Logger</code> Level of the driver based on the following mapping
+ of levels: DEBUG -> FINE, TRACE -> FINEST. This property is intended for debug the driver and
+ not for general SQL query debug.
+
+* **loggerFile** = String
+
+ File name output of the Logger. If set, the Logger will use a <code>java.util.logging.FileHandler</code>
+ to write to a specified file. If the parameter is not set or the file can’t be created the
+ <code>java.util.logging.ConsoleHandler</code> will be used instead. This parameter should be use
+ together with loggerLevel.
+
+* **allowEncodingChanges** = boolean
+
+ When using the V3 protocol the driver monitors changes in certain server
+ configuration parameters that should not be touched by end users. The
+ `client_encoding` setting is set by the driver and should not be altered.
+ If the driver detects a change it will abort the connection. There is
+ one legitimate exception to this behaviour though, using the `COPY` command
+ on a file residing on the server's filesystem. The only means of specifying
+ the encoding of this file is by altering the `client_encoding` setting.
+ The JDBC team considers this a failing of the `COPY` command and hopes to
+ provide an alternate means of specifying the encoding in the future, but
+ for now there is this URL parameter. Enable this only if you need to
+ override the client encoding when doing a copy.
+
+* **logUnclosedConnections** = boolean
+
+ Clients may leak `Connection` objects by failing to call its `close()`
+ method. Eventually these objects will be garbage collected and the
+ `finalize()` method will be called which will close the `Connection` if
+ caller has neglected to do this himself. The usage of a finalizer is just
+ a stopgap solution. To help developers detect and correct the source of
+ these leaks the `logUnclosedConnections` URL parameter has been added.
+ It captures a stacktrace at each `Connection` opening and if the `finalize()`
+ method is reached without having been closed the stacktrace is printed
+ to the log.
+
+* **autosave** = String
+
+ Specifies what the driver should do if a query fails. In `autosave=always` mode, JDBC driver sets a savepoint before each query,
+ and rolls back to that savepoint in case of failure. In `autosave=never` mode (default), no savepoint dance is made ever.
+ In `autosave=conservative` mode, savepoint is set for each query, however the rollback is done only for rare cases
+ like 'cached statement cannot change return type' or 'statement XXX is not valid' so JDBC driver rollsback and retries
+
+ The default is `never`
+
+* **binaryTransferEnable** = String
+
+ A comma separated list of types to enable binary transfer. Either OID numbers or names.
+
+* **binaryTransferDisable** = String
+
+ A comma separated list of types to disable binary transfer. Either OID numbers or names.
+ Overrides values in the driver default set and values set with binaryTransferEnable.
+
+* **prepareThreshold** = int
+
+ Determine the number of `PreparedStatement` executions required before
+ switching over to use server side prepared statements. The default is
+ five, meaning start using server side prepared statements on the fifth
+ execution of the same `PreparedStatement` object. More information on
+ server side prepared statements is available in the section called
+ [“Server Prepared Statements”](server-prepare.html).
+
+* **preparedStatementCacheQueries** = int
+
+ Determine the number of queries that are cached in each connection.
+ The default is 256, meaning if you use more than 256 different queries
+ in `prepareStatement()` calls, the least recently used ones
+ will be discarded. The cache allows application to benefit from
+ [“Server Prepared Statements”](server-prepare.html)
+ (see `prepareThreshold`) even if the prepared statement is
+ closed after each execution. The value of 0 disables the cache.
+
+ N.B.Each connection has its own statement cache.
+
+* **preparedStatementCacheSizeMiB** = int
+
+ Determine the maximum size (in mebibytes) of the prepared queries cache
+ (see `preparedStatementCacheQueries`).
+ The default is 5, meaning if you happen to cache more than 5 MiB of queries
+ the least recently used ones will be discarded.
+ The main aim of this setting is to prevent `OutOfMemoryError`.
+ The value of 0 disables the cache.
+
+* **preferQueryMode** = String
+
+ Specifies which mode is used to execute queries to database: simple means ('Q' execute, no parse, no bind, text mode only),
+ extended means always use bind/execute messages, extendedForPrepared means extended for prepared statements only,
+ extendedCacheEverything means use extended protocol and try cache every statement
+ (including Statement.execute(String sql)) in a query cache.
+ extended | extendedForPrepared | extendedCacheEverything | simple
+
+ The default is extended
+
+* **defaultRowFetchSize** = int
+
+ Determine the number of rows fetched in `ResultSet`
+ by one fetch with trip to the database. Limiting the number of rows are fetch with
+ each trip to the database allow avoids unnecessary memory consumption
+ and as a consequence `OutOfMemoryException`.
+
+ The default is zero, meaning that in `ResultSet` will be fetch all rows at once.
+ Negative number is not available.
+
+* **loginTimeout** = int
+
+ Specify how long to wait for establishment of a database connection. The
+ timeout is specified in seconds.
+
+* **connectTimeout** = int
+
+ The timeout value used for socket connect operations. If connecting to the server
+ takes longer than this value, the connection is broken.
+ The timeout is specified in seconds and a value of zero means that it is disabled.
+
+* **socketTimeout** = int
+
+ The timeout value used for socket read operations. If reading from the
+ server takes longer than this value, the connection is closed. This can
+ be used as both a brute force global query timeout and a method of
+ detecting network problems. The timeout is specified in seconds and a
+ value of zero means that it is disabled.
+
+* **cancelSignalTimeout** = int
+
+ Cancel command is sent out of band over its own connection, so cancel message can itself get
+ stuck. This property controls "connect timeout" and "socket timeout" used for cancel commands.
+ The timeout is specified in seconds. Default value is 10 seconds.
+
+
+* **tcpKeepAlive** = boolean
+
+ Enable or disable TCP keep-alive probe. The default is `false`.
+
+* **unknownLength** = int
+
+ Certain postgresql types such as `TEXT` do not have a well defined length.
+ When returning meta-data about these types through functions like
+ `ResultSetMetaData.getColumnDisplaySize` and `ResultSetMetaData.getPrecision`
+ we must provide a value and various client tools have different ideas
+ about what they would like to see. This parameter specifies the length
+ to return for types of unknown length.
+
+* **stringtype** = String
+
+ Specify the type to use when binding `PreparedStatement` parameters set
+ via `setString()`. If `stringtype` is set to `VARCHAR` (the default), such
+ parameters will be sent to the server as varchar parameters. If `stringtype`
+ is set to `unspecified`, parameters will be sent to the server as untyped
+ values, and the server will attempt to infer an appropriate type. This
+ is useful if you have an existing application that uses `setString()` to
+ set parameters that are actually some other type, such as integers, and
+ you are unable to change the application to use an appropriate method
+ such as `setInt()`.
+
+* **kerberosServerName** = String
+
+ The Kerberos service name to use when authenticating with GSSAPI. This
+ is equivalent to libpq's PGKRBSRVNAME environment variable and defaults
+ to "postgres".
+
+* **jaasApplicationName** = String
+
+ Specifies the name of the JAAS system or application login configuration.
+
+* **jaasLogin** = boolean
+
+ Specifies whether to perform a JAAS login before authenticating with GSSAPI.
+ If set to `true` (the default), the driver will attempt to obtain GSS credentials
+ using the configured JAAS login module(s) (e.g. `Krb5LoginModule`) before
+ authenticating. To skip the JAAS login, for example if the native GSS
+ implementation is being used to obtain credentials, set this to `false`.
+
+* **ApplicationName** = String
+
+ Specifies the name of the application that is using the connection.
+ This allows a database administrator to see what applications are
+ connected to the server and what resources they are using through views like pg_stat_activity.
+
+* **gsslib** = String
+
+ Force either SSPI (Windows transparent single-sign-on) or GSSAPI (Kerberos, via JSSE)
+ to be used when the server requests Kerberos or SSPI authentication.
+ Permissible values are auto (default, see below), sspi (force SSPI) or gssapi (force GSSAPI-JSSE).
+
+ If this parameter is auto, SSPI is attempted if the server requests SSPI authentication,
+ the JDBC client is running on Windows, and the Waffle libraries required
+ for SSPI are on the CLASSPATH. Otherwise Kerberos/GSSAPI via JSSE is used.
+ Note that this behaviour does not exactly match that of libpq, which uses
+ Windows' SSPI libraries for Kerberos (GSSAPI) requests by default when on Windows.
+
+ gssapi mode forces JSSE's GSSAPI to be used even if SSPI is available, matching the pre-9.4 behaviour.
+
+ On non-Windows platforms or where SSPI is unavailable, forcing sspi mode will fail with a PSQLException.
+
+ Since: 9.4
+
+* **sspiServiceClass** = String
+
+ Specifies the name of the Windows SSPI service class that forms the service
+ class part of the SPN. The default, POSTGRES, is almost always correct.
+
+ See: SSPI authentication (Pg docs) Service Principal Names (MSDN), DsMakeSpn (MSDN) Configuring SSPI (Pg wiki).
+
+ This parameter is ignored on non-Windows platforms.
+
+* **useSpnego** = boolean
+
+ Use SPNEGO in SSPI authentication requests
+
+* **sendBufferSize** = int
+
+ Sets SO_SNDBUF on the connection stream
+
+* **receiveBufferSize** = int
+
+ Sets SO_RCVBUF on the connection stream
+
+* **readOnly** = boolean
+
+ Put the connection in read-only mode
+
+* **disableColumnSanitiser** = boolean
+
+ Setting this to true disables column name sanitiser.
+ The sanitiser folds columns in the resultset to lowercase.
+ The default is to sanitise the columns (off).
+
+* **assumeMinServerVersion** = String
+
+ Assume that the server is at least the given version,
+ thus enabling to some optimization at connection time instead of trying to be version blind.
+
+* **currentSchema** = String
+
+ Specify the schema to be set in the search-path.
+ This schema will be used to resolve unqualified object names used in statements over this connection.
+
+* **targetServerType** = String
+
+ Allows opening connections to only servers with required state,
+ the allowed values are any, master, slave, secondary, preferSlave and preferSecondary.
+ The master/slave distinction is currently done by observing if the server allows writes.
+ The value preferSecondary tries to connect to secondary if any are available,
+ otherwise allows falls back to connecting also to master.
+
+* **hostRecheckSeconds** = int
+
+ Controls how long in seconds the knowledge about a host state
+ is cached in JVM wide global cache. The default value is 10 seconds.
+
+* **loadBalanceHosts** = boolean
+
+ In default mode (disabled) hosts are connected in the given order.
+ If enabled hosts are chosen randomly from the set of suitable candidates.
+
+* **socketFactory** = String
+
+ The provided value is a class name to use as the `SocketFactory` when establishing a socket connection.
+ This may be used to create unix sockets instead of normal sockets. The class name specified by `socketFactory`
+ must extend `javax.net.SocketFactory` and be available to the driver's classloader.
+ This class must have a zero argument constructor or a single argument constructor taking a String argument.
+ This argument may optionally be supplied by `socketFactoryArg`.
+
+* **socketFactoryArg** = String
+
+ This value is an optional argument to the constructor of the socket factory
+ class provided above.
+
+* **reWriteBatchedInserts** = boolean
+
+ This will change batch inserts from insert into foo (col1, col2, col3) values (1,2,3) into
+ insert into foo (col1, col2, col3) values (1,2,3), (4,5,6) this provides 2-3x performance improvement
+
+* **replication** = String
+
+ Connection parameter passed in the startup message. This parameter accepts two values; "true"
+ and `database`. Passing `true` tells the backend to go into walsender mode, wherein a small set
+ of replication commands can be issued instead of SQL statements. Only the simple query protocol
+ can be used in walsender mode. Passing "database" as the value instructs walsender to connect
+ to the database specified in the dbname parameter, which will allow the connection to be used
+ for logical replication from that database. <p>Parameter should be use together with
+ `assumeMinServerVersion` with parameter >= 9.4 (backend >= 9.4)</p>
+
+
+<a name="connection-failover"></a>
+## Connection Fail-over
+
+To support simple connection fail-over it is possible to define multiple endpoints
+(host and port pairs) in the connection url separated by commas.
+The driver will try to once connect to each of them in order until the connection succeeds.
+If none succeed, a normal connection exception is thrown.
+
+The syntax for the connection url is:
+
+`jdbc:postgresql://host1:port1,host2:port2/database`
+
+The simple connection fail-over is useful when running against a high availability
+postgres installation that has identical data on each node.
+For example streaming replication postgres or postgres-xc cluster.
+
+For example an application can create two connection pools.
+One data source is for writes, another for reads. The write pool limits connections only to master node:
+
+`jdbc:postgresql://node1,node2,node3/accounting?targetServerType=master`.
+
+And read pool balances connections between slaves nodes, but allows connections also to master if no slaves are available:
+
+`jdbc:postgresql://node1,node2,node3/accounting?targetServerType=preferSlave&loadBalanceHosts=true`
+
+If a slave fails, all slaves in the list will be tried first. If the case that there are no available slaves
+the master will be tried. If all of the servers are marked as "can't connect" in the cache then an attempt
+will be made to connect to all of the hosts in the URL in order.
\ No newline at end of file
diff --git a/docs/documentation/head/datasource.md b/docs/documentation/head/datasource.md
new file mode 100644
index 0000000..c67b1c4
--- /dev/null
+++ b/docs/documentation/head/datasource.md
@@ -0,0 +1,44 @@
+---
+layout: default_docs
+title: Chapter 11. Connection Pools and Data Sources
+header: Chapter 11. Connection Pools and Data Sources
+resource: media
+previoustitle: Chapter 10. Using the Driver in a Multithreaded or a Servlet Environment
+previous: thread.html
+nexttitle: Application Servers ConnectionPoolDataSource
+next: ds-cpds.html
+---
+
+**Table of Contents**
+
+* [Overview](datasource.html#ds-intro)
+* [Application Servers: `ConnectionPoolDataSource`](ds-cpds.html)
+* [Applications: `DataSource`](ds-ds.html)
+* [Tomcat setup](tomcat.html)
+* [Data Sources and JNDI](jndi.html)
+
+JDBC 2 introduced standard connection pooling features in an add-on API known as
+the JDBC 2.0 Optional Package (also known as the JDBC 2.0 Standard Extension).
+These features have since been included in the core JDBC 3 API.
+
+<a name="ds-intro"></a>
+# Overview
+
+The JDBC API provides a client and a server interface for connection pooling.
+The client interface is `javax.sql.DataSource`, which is what application code
+will typically use to acquire a pooled database connection. The server interface
+is `javax.sql.ConnectionPoolDataSource`, which is how most application servers
+will interface with the PostgreSQL™ JDBC driver.
+
+In an application server environment, the application server configuration will
+typically refer to the PostgreSQL™ `ConnectionPoolDataSource` implementation,
+while the application component code will typically acquire a `DataSource`
+implementation provided by the application server (not by PostgreSQL™).
+
+For an environment without an application server, PostgreSQL™ provides two
+implementations of `DataSource` which an application can use directly. One
+implementation performs connection pooling, while the other simply provides
+access to database connections through the `DataSource` interface without any
+pooling. Again, these implementations should not be used in an application server
+environment unless the application server does not support the `ConnectionPoolDataSource`
+interface.
\ No newline at end of file
diff --git a/docs/documentation/head/ddl.md b/docs/documentation/head/ddl.md
new file mode 100644
index 0000000..6564f76
--- /dev/null
+++ b/docs/documentation/head/ddl.md
@@ -0,0 +1,26 @@
+---
+layout: default_docs
+title: Creating and Modifying Database Objects
+header: Chapter 5. Issuing a Query and Processing the Result
+resource: media
+previoustitle: Performing Updates
+previous: update.html
+nexttitle: Using Java 8 Date and Time classes
+next: java8-date-time.html
+---
+
+To create, modify or drop a database object like a table or view you use the
+`execute()` method. This method is similar to the method `executeQuery()`, but
+it doesn't return a result. [Example 5.4, “Dropping a Table in JDBC](ddl.html#drop-table-example)
+illustrates the usage.
+
+<a name="drop-table-example"></a>
+**Example 5.4. Dropping a Table in JDBC**
+
+This example will drop a table.
+
+```java
+Statement st = conn.createStatement();
+st.execute("DROP TABLE mytable");
+st.close();
+```
diff --git a/docs/documentation/head/ds-cpds.md b/docs/documentation/head/ds-cpds.md
new file mode 100644
index 0000000..681170a
--- /dev/null
+++ b/docs/documentation/head/ds-cpds.md
@@ -0,0 +1,92 @@
+---
+layout: default_docs
+title: Application Servers ConnectionPoolDataSource
+header: Chapter 11. Connection Pools and Data Sources
+resource: media
+previoustitle: Chapter 11. Connection Pools and Data Sources
+previous: datasource.html
+nexttitle: Applications DataSource
+next: ds-ds.html
+---
+
+PostgreSQL™ includes one implementation of `ConnectionPoolDataSource` named
+`org.postgresql.ds.PGConnectionPoolDataSource`.
+
+JDBC requires that a `ConnectionPoolDataSource` be configured via JavaBean
+properties, shown in [Table 11.1, “`ConnectionPoolDataSource` Configuration Properties”](ds-cpds.html#ds-cpds-props),
+so there are get and set methods for each of these properties.
+
+<a name="ds-cpds-props"></a>
+**Table 11.1. `ConnectionPoolDataSource` Configuration Properties**
+
+<table summary="ConnectionPoolDataSource Configuration Properties" class="CALSTABLE" border="1">
+ <tr>
+ <th>Property</th>
+ <th>Type</th>
+ <th>Description</th>
+ </tr>
+ <tbody>
+ <tr>
+ <td>serverName</td>
+ <td>STRING</td>
+ <td>PostgreSQL™ database server
+host name</td>
+ </tr>
+ <tr>
+ <td>databaseName</td>
+ <td>STRING</td>
+ <td>PostgreSQL™ database name</td>
+ </tr>
+ <tr>
+ <td>portNumber</td>
+ <td>INT</td>
+ <td> TCP port which the PostgreSQL™
+
+database server is listening on (or 0 to use the default port) </td>
+ </tr>
+ <tr>
+ <td>user</td>
+ <td>STRING</td>
+ <td>User used to make database connections</td>
+ </tr>
+ <tr>
+ <td>password</td>
+ <td>STRING</td>
+ <td>Password used to make database connections</td>
+ </tr>
+ <tr>
+ <td>ssl</td>
+ <td>BOOLEAN</td>
+ <td> If `true`, use SSL encrypted
+connections (default `false`) </td>
+ </tr>
+ <tr>
+ <td>sslfactory</td>
+ <td>STRING</td>
+ <td> Custom `javax.net.ssl.SSLSocketFactory`
+class name (see the section called [“Custom
+SSLSocketFactory”](ssl-factory.html)) </td>
+ </tr>
+ <tr>
+ <td>defaultAutoCommit</td>
+ <td>BOOLEAN</td>
+ <td> Whether connections should have autocommit enabled or
+disabled when they are supplied to the caller. The default is `false`, to disable autocommit. </td>
+ </tr>
+ </tbody>
+</table>
+
+Many application servers use a properties-style syntax to configure these
+properties, so it would not be unusual to enter properties as a block of text.
+If the application server provides a single area to enter all the properties,
+they might be listed like this:
+
+`serverName=localhost`
+`databaseName=test`
+`user=testuser`
+`password=testpassword`
+
+Or, if semicolons are used as separators instead of newlines, it could look like
+this:
+
+`serverName=localhost;databaseName=test;user=testuser;password=testpassword`
\ No newline at end of file
diff --git a/docs/documentation/head/ds-ds.md b/docs/documentation/head/ds-ds.md
new file mode 100644
index 0000000..302529d
--- /dev/null
+++ b/docs/documentation/head/ds-ds.md
@@ -0,0 +1,180 @@
+---
+layout: default_docs
+title: Applications DataSource
+header: Chapter 11. Connection Pools and Data Sources
+resource: media
+previoustitle: Application Servers ConnectionPoolDataSource
+previous: ds-cpds.html
+nexttitle: Tomcat setup
+next: tomcat.html
+---
+
+PostgreSQL™ includes two implementations of `DataSource`, as shown in [Table 11.2, “`DataSource` Implementations”](ds-ds.html#ds-ds-imp).
+One that does pooling and the other that does not. The pooling implementation
+does not actually close connections when the client calls the `close` method,
+but instead returns the connections to a pool of available connections for other
+clients to use. This avoids any overhead of repeatedly opening and closing
+connections, and allows a large number of clients to share a small number of
+database connections.
+
+The pooling data-source implementation provided here is not the most feature-rich
+in the world. Among other things, connections are never closed until the pool
+itself is closed; there is no way to shrink the pool. As well, connections
+requested for users other than the default configured user are not pooled. Its
+error handling sometimes cannot remove a broken connection from the pool. In
+general it is not recommended to use the PostgreSQL™ provided connection pool.
+Check your application server or check out the excellent [jakarta commons DBCP](http://jakarta.apache.org/commons/dbcp/)
+project.
+
+<a name="ds-ds-imp"></a>
+**Table 11.2. `DataSource` Implementations**
+
+<table summary="DataSource Implementations" class="CALSTABLE" border="1">
+ <tr>
+ <th>Pooling</th>
+ <th>Implementation Class</th>
+ </tr>
+ <tbody>
+ <tr>
+ <td>No</td>
+ <td>`org.postgresql.ds.PGSimpleDataSource</td>
+ </tr>
+ <tr>
+ <td>Yes</td>
+ <td>`org.postgresql.ds.PGPoolingDataSource</td>
+ </tr>
+ </tbody>
+</table>
+
+Both implementations use the same configuration scheme. JDBC requires that a
+`DataSource` be configured via JavaBean properties, shown in [Table 11.3, “`DataSource` Configuration Properties”](ds-ds.html#ds-ds-props),
+so there are get and set methods for each of these properties.
+
+<a name="ds-ds-props"></a>
+**Table 11.3. `DataSource` Configuration Properties**
+
+<table summary="DataSource Configuration Properties" class="CALSTABLE" border="1">
+ <tr>
+ <th>Property</th>
+ <th>Type</th>
+ <th>Description</th>
+ </tr>
+ <tbody>
+ <tr>
+ <td>serverName</td>
+ <td>STRING</td>
+ <td>PostgreSQL™ database server host name</td>
+ </tr>
+ <tr>
+ <td>databaseName</td>
+ <td>STRING</td>
+ <td>PostgreSQL™ database name</td>
+ </tr>
+ <tr>
+ <td>portNumber</td>
+ <td>INT</td>
+ <td>TCP port which the PostgreSQL™
+database server is listening on (or 0 to use the default port)</td>
+ </tr>
+ <tr>
+ <td>user</td>
+ <td>STRING</td>
+ <td>User used to make database connections</td>
+ </tr>
+ <tr>
+ <td>password</td>
+ <td>STRING</td>
+ <td>Password used to make database connections</td>
+ </tr>
+ <tr>
+ <td>ssl</td>
+ <td>BOOLEAN</td>
+ <td> If true, use SSL encrypted
+connections (default false) </td>
+ </tr>
+ <tr>
+ <td>sslfactory</td>
+ <td>STRING</td>
+ <td> Custom javax.net.ssl.SSLSocketFactory
+class name (see the section called [“Custom
+SSLSocketFactory”](ssl-factory.html))</td>
+ </tr>
+ </tbody>
+</table>
+
+The pooling implementation requires some additional configuration properties,
+which are shown in [Table 11.4, “Additional Pooling `DataSource` Configuration Properties](ds-ds.html#ds-ds-xprops).
+
+<a name="ds-ds-xprops"></a>
+**Table 11.4. Additional Pooling `DataSource` Configuration Properties**
+
+<table summary="Additional Pooling DataSource Configuration Properties" class="CALSTABLE" border="1">
+ <tr>
+ <th>Property</th>
+ <th>Type</th>
+ <th>Description</th>
+ </tr>
+ <tbody>
+ <tr>
+ <td>dataSourceName</td>
+ <td>STRING</td>
+ <td>Every pooling DataSource must
+have a unique name.</td>
+ </tr>
+ <tr>
+ <td>initialConnections</td>
+ <td>INT</td>
+ <td>The number of database connections to be created when the
+pool is initialized.</td>
+ </tr>
+ <tr>
+ <td>maxConnections</td>
+ <td>INT</td>
+ <td>The maximum number of open database connections to allow.
+When more connections are requested, the caller will hang until a
+connection is returned to the pool.</td>
+ </tr>
+ </tbody>
+</table>
+
+[Example 11.1, “`DataSource` Code Example”](ds-ds.html#ds-example) shows an example
+of typical application code using a pooling `DataSource`.
+
+<a name="ds-example"></a>
+**Example 11.1. `DataSource` Code Example**
+
+Code to initialize a pooling `DataSource` might look like this:
+
+```java
+PGPoolingDataSource source = new PGPoolingDataSource();
+source.setDataSourceName("A Data Source");
+source.setServerName("localhost");
+source.setDatabaseName("test");
+source.setUser("testuser");
+source.setPassword("testpassword");
+source.setMaxConnections(10);
+```
+
+Then code to use a connection from the pool might look like this. Note that it
+is critical that the connections are eventually closed. Else the pool will
+“leak” connections and will eventually lock all the clients out.
+
+```java
+Connection conn = null;
+try
+{
+ conn = source.getConnection();
+ // use connection
+}
+catch (SQLException e)
+{
+ // log error
+}
+finally
+{
+ if (con != null)
+ {
+ try { conn.close(); } catch (SQLException e) {}
+ }
+}
+```
diff --git a/docs/documentation/head/escaped-functions.md b/docs/documentation/head/escaped-functions.md
new file mode 100644
index 0000000..34602b1
--- /dev/null
+++ b/docs/documentation/head/escaped-functions.md
@@ -0,0 +1,480 @@
+---
+layout: default_docs
+title: Escaped scalar functions
+header: Chapter 8. JDBC escapes
+resource: media
+previoustitle: Date-time escapes
+previous: escapes-datetime.html
+nexttitle: Chapter 9. PostgreSQL™ Extensions to the JDBC API
+next: ext.html
+---
+
+The JDBC specification defines functions with an escape call syntax : `{fn function_name(arguments)}`.
+The following tables show which functions are supported by the PostgresSQL™ driver.
+The driver supports the nesting and the mixing of escaped functions and escaped
+values. The appendix C of the JDBC specification describes the functions.
+
+Some functions in the following tables are translated but not reported as supported
+because they are duplicating or changing their order of the arguments. While this
+is harmless for literal values or columns, it will cause problems when using
+prepared statements. For example "`{fn right(?,?)}`" will be translated to "`substring(? from (length(?)+1-?))`".
+As you can see the translated SQL requires more parameters than before the
+translation but the driver will not automatically handle this.
+
+<a name="escape-numeric-functions-table"></a>
+**Table 8.1. Supported escaped numeric functions**
+
+<table summary="Supported escaped numeric functions" class="CALSTABLE" border="1">
+ <tr>
+ <th>function</th>
+ <th>reported as supported</th>
+ <th>translation</th>
+ <th>comments</th>
+ </tr>
+ <tbody>
+ <tr>
+ <td>abs(arg1)</td>
+ <td>yes</td>
+ <td>abs(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>acos(arg1)</td>
+ <td>yes</td>
+ <td>acos(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>asin(arg1)</td>
+ <td>yes</td>
+ <td>asin(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>atan(arg1)</td>
+ <td>yes</td>
+ <td>atan(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>atan2(arg1,arg2)</td>
+ <td>yes</td>
+ <td>atan2(arg1,arg2)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>ceiling(arg1)</td>
+ <td>yes</td>
+ <td>ceil(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>cos(arg1)</td>
+ <td>yes</td>
+ <td>cos(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>cot(arg1)</td>
+ <td>yes</td>
+ <td>cot(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>degrees(arg1)</td>
+ <td>yes</td>
+ <td>degrees(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>exp(arg1)</td>
+ <td>yes</td>
+ <td>exp(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>floor(arg1)</td>
+ <td>yes</td>
+ <td>floor(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>log(arg1)</td>
+ <td>yes</td>
+ <td>ln(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>log10(arg1)</td>
+ <td>yes</td>
+ <td>log(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>mod(arg1,arg2)</td>
+ <td>yes</td>
+ <td>mod(arg1,arg2)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>pi(arg1)</td>
+ <td>yes</td>
+ <td>pi(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>power(arg1,arg2)</td>
+ <td>yes</td>
+ <td>pow(arg1,arg2)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>radians(arg1)</td>
+ <td>yes</td>
+ <td>radians(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>rand()</td>
+ <td>yes</td>
+ <td>random()</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>rand(arg1)</td>
+ <td>yes</td>
+ <td>setseed(arg1)*0+random()</td>
+ <td>The seed is initialized with the given argument and a new randow value is returned.</td>
+ </tr>
+ <tr>
+ <td>round(arg1,arg2)</td>
+ <td>yes</td>
+ <td>round(arg1,arg2)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>sign(arg1)</td>
+ <td>yes</td>
+ <td>sign(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>sin(arg1)</td>
+ <td>yes</td>
+ <td>sin(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>sqrt(arg1)</td>
+ <td>yes</td>
+ <td>sqrt(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>tan(arg1)</td>
+ <td>yes</td>
+ <td>tan(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>truncate(arg1,arg2)</td>
+ <td>yes</td>
+ <td>trunc(arg1,arg2)</td>
+ <td> </td>
+ </tr>
+ </tbody>
+</table>
+
+<a name="escape-string-functions-table"></a>
+**Table 8.2. Supported escaped string functions**
+
+<table summary="Supported escaped string functions" class="CALSTABLE" border="1">
+ <tr>
+ <th>function</th>
+ <th>reported as supported</th>
+ <th>translation</th>
+ <th>comments</th>
+ </tr>
+ <tbody>
+ <tr>
+ <td>ascii(arg1)</td>
+ <td>yes</td>
+ <td>ascii(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>char(arg1)</td>
+ <td>yes</td>
+ <td>chr(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>concat(arg1,arg2...)</td>
+ <td>yes</td>
+ <td>(arg1||arg2...)</td>
+ <td>The JDBC specification
+only require the two arguments version, but supporting more arguments
+was so easy...</td>
+ </tr>
+ <tr>
+ <td>insert(arg1,arg2,arg3,arg4)</td>
+ <td>no</td>
+ <td>overlay(arg1 placing arg4 from arg2 for arg3)</td>
+ <td>This function is not reported as supported since it changes
+the order of the arguments which can be a problem (for prepared
+statements by example).</td>
+ </tr>
+ <tr>
+ <td>lcase(arg1)</td>
+ <td>yes</td>
+ <td>lower(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>left(arg1,arg2)</td>
+ <td>yes</td>
+ <td>substring(arg1 for arg2)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>length(arg1)</td>
+ <td>yes</td>
+ <td>length(trim(trailing from arg1))</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>locate(arg1,arg2)</td>
+ <td>no</td>
+ <td>position(arg1 in arg2)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>locate(arg1,arg2,arg3)</td>
+ <td>no</td>
+ <td>(arg2*sign(position(arg1 in substring(arg2 from
+arg3)+position(arg1 in substring(arg2 from arg3))</td>
+ <td>Not reported as supported since the three arguments version
+duplicate and change the order of the arguments.</td>
+ </tr>
+ <tr>
+ <td>ltrim(arg1)</td>
+ <td>yes</td>
+ <td>trim(leading from arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>repeat(arg1,arg2)</td>
+ <td>yes</td>
+ <td>repeat(arg1,arg2)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>replace(arg1,arg2,arg3)</td>
+ <td>yes</td>
+ <td>replace(arg1,arg2,arg3)</td>
+ <td>Only reported as supported by 7.3 and above servers.</td>
+ </tr>
+ <tr>
+ <td>right(arg1,arg2)</td>
+ <td>no</td>
+ <td>substring(arg1 from (length(arg1)+1-arg2))</td>
+ <td>Not reported as supported since arg2 is duplicated.</td>
+ </tr>
+ <tr>
+ <td>rtrim(arg1)</td>
+ <td>yes</td>
+ <td>trim(trailing from arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>space(arg1)</td>
+ <td>yes</td>
+ <td>repeat(' ',arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>substring(arg1,arg2)</td>
+ <td>yes</td>
+ <td>substr(arg1,arg2)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>substring(arg1,arg2,arg3)</td>
+ <td>yes</td>
+ <td>substr(arg1,arg2,arg3)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>ucase(arg1)</td>
+ <td>yes</td>
+ <td>upper(arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>soundex(arg1)</td>
+ <td>no</td>
+ <td>soundex(arg1)</td>
+ <td>Not reported as supported since it requires the fuzzystrmatch
+contrib module.</td>
+ </tr>
+ <tr>
+ <td>difference(arg1,arg2)</td>
+ <td>no</td>
+ <td>difference(arg1,arg2)</td>
+ <td>Not reported as supported since it requires the fuzzystrmatch
+contrib module.</td>
+ </tr>
+ </tbody>
+</table>
+
+<a name="escape-datetime-functions-table"></a>
+**Table 8.3. Supported escaped date/time functions**
+
+<table summary="Supported escaped date/time functions" class="CALSTABLE" border="1">
+ <tr>
+ <th>function</th>
+ <th>reported as supported</th>
+ <th>translation</th>
+ <th>comments</th>
+ </tr>
+ <tbody>
+ <tr>
+ <td>curdate()</td>
+ <td>yes</td>
+ <td>current_date</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>curtime()</td>
+ <td>yes</td>
+ <td>current_time</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>dayname(arg1)</td>
+ <td>yes</td>
+ <td>to_char(arg1,'Day')</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>dayofmonth(arg1)</td>
+ <td>yes</td>
+ <td>extract(day from arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>dayofweek(arg1)</td>
+ <td>yes</td>
+ <td>extract(dow from arg1)+1</td>
+ <td>We must add 1 to be in the expected 1-7 range.</td>
+ </tr>
+ <tr>
+ <td>dayofyear(arg1)</td>
+ <td>yes</td>
+ <td>extract(doy from arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>hour(arg1)</td>
+ <td>yes</td>
+ <td>extract(hour from arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>minute(arg1)</td>
+ <td>yes</td>
+ <td>extract(minute from arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>month(arg1)</td>
+ <td>yes</td>
+ <td>extract(month from arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>monthname(arg1)</td>
+ <td>yes</td>
+ <td>to_char(arg1,'Month')</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>now()</td>
+ <td>yes</td>
+ <td>now()</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>quarter(arg1)</td>
+ <td>yes</td>
+ <td>extract(quarter from arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>second(arg1)</td>
+ <td>yes</td>
+ <td>extract(second from arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>week(arg1)</td>
+ <td>yes</td>
+ <td>extract(week from arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>year(arg1)</td>
+ <td>yes</td>
+ <td>extract(year from arg1)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>timestampadd(argIntervalType,argCount,argTimeStamp)</td>
+ <td>yes</td>
+ <td>('(interval according to argIntervalType and
+argCount)'+argTimeStamp)</td>
+ <td>an argIntervalType value of SQL_TSI_FRAC_SECOND
+is not implemented since backend does not support it</td>
+ </tr>
+ <tr>
+ <td>timestampdiff(argIntervalType,argTimeStamp1,argTimeStamp2)</td>
+ <td>not</td>
+ <td>extract((interval according to argIntervalType) from
+argTimeStamp2-argTimeStamp1 )</td>
+ <td>only an argIntervalType value of SQL_TSI_FRAC_SECOND, SQL_TSI_FRAC_MINUTE, SQL_TSI_FRAC_HOUR
+or SQL_TSI_FRAC_DAY is supported </td>
+ </tr>
+ </tbody>
+</table>
+
+<a name="escape-misc-functions-table"></a>
+**Table 8.4. Supported escaped misc functions**
+
+<table summary="Supported escaped misc functions" class="CALSTABLE" border="1">
+ <tr>
+ <th>function</th>
+ <th>reported as supported</th>
+ <th>translation</th>
+ <th>comments</th>
+ </tr>
+ <tbody>
+ <tr>
+ <td>database()</td>
+ <td>yes</td>
+ <td>current_database()</td>
+ <td>Only reported as supported by 7.3 and above servers.</td>
+ </tr>
+ <tr>
+ <td>ifnull(arg1,arg2)</td>
+ <td>yes</td>
+ <td>coalesce(arg1,arg2)</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>user()</td>
+ <td>yes</td>
+ <td>user</td>
+ <td> </td>
+ </tr>
+ </tbody>
+</table>
diff --git a/docs/documentation/head/escapes-datetime.md b/docs/documentation/head/escapes-datetime.md
new file mode 100644
index 0000000..6d1e11d
--- /dev/null
+++ b/docs/documentation/head/escapes-datetime.md
@@ -0,0 +1,23 @@
+---
+layout: default_docs
+title: Date-time escapes
+header: Chapter 8. JDBC escapes
+resource: media
+previoustitle: Escape for outer joins
+previous: outer-joins-escape.html
+nexttitle: Escaped scalar functions
+next: escaped-functions.html
+---
+
+The JDBC specification defines escapes for specifying date, time and timestamp
+values which are supported by the driver.
+
+> date
+>> `{d 'yyyy-mm-dd'}` which is translated to `DATE 'yyyy-mm-dd'`
+
+> time
+>> `{t 'hh:mm:ss'}` which is translated to `TIME 'hh:mm:ss'`
+
+> timestamp
+>> `{ts 'yyyy-mm-dd hh:mm:ss.f...'}` which is translated to `TIMESTAMP 'yyyy-mm-dd hh:mm:ss.f'`<br /><br />
+>> The fractional seconds (.f...) portion of the TIMESTAMP can be omitted.
\ No newline at end of file
diff --git a/docs/documentation/head/escapes.md b/docs/documentation/head/escapes.md
new file mode 100644
index 0000000..48d600d
--- /dev/null
+++ b/docs/documentation/head/escapes.md
@@ -0,0 +1,61 @@
+---
+layout: default_docs
+title: Chapter 8. JDBC escapes
+header: Chapter 8. JDBC escapes
+resource: media
+previoustitle: Chapter 7. Storing Binary Data
+previous: binary-data.html
+nexttitle: Escape for outer joins
+next: outer-joins-escape.html
+---
+
+**Table of Contents**
+
+* [Escape for like escape character](escapes.html#like-escape)
+* [Escape for outer joins](outer-joins-escape.html)
+* [Date-time escapes](escapes-datetime.html)
+* [Escaped scalar functions](escaped-functions.html)
+
+The JDBC specification (like the ODBC specification) acknowledges the fact that
+some vendor specific SQL may be required for certain RDBMS features. To aid
+developers in writing portable JDBC applications across multiple database products,
+a special escape syntax is used to specify the generic commands the developer
+wants to be run. The JDBC driver translates these escape sequences into native
+syntax for its specific database. For more information consult the
+[Java DB Technical Documentation](http://docs.oracle.com/javadb/10.10.1.2/ref/rrefjdbc1020262.html).
+
+The parsing of the sql statements for these escapes can be disabled using
+`Statement.setEscapeProcessing(false)`.
+
+`Connection.nativeSQL(String sql)` provides another way to have escapes processed.
+It translates the given SQL to a SQL suitable for the PostgreSQL™ backend.
+
+<a name="escape-use-example"></a>
+**Example 8.1. Using JDBC escapes**
+
+To use the JDBC escapes, you simply write your SQL replacing date/time literal
+values, outer join and functions by the JDBC escape syntax. For example :
+
+```java
+ResultSet rs = st.executeQuery("SELECT {fn week({d '2005-01-24'})}");
+```
+
+is the portable version for
+
+```java
+ResultSet rs = st.executeQuery("SELECT extract(week from DATE '2005-01-24')");
+```
+
+<a name="like-escape"></a>
+# Escape for like escape character
+
+You can specify which escape character to use in strings comparison (with `LIKE`)
+to protect wildcards characters ('%' and '_') by adding the following escape :
+`{escape 'escape-character'}`. The driver supports this only at the end of the
+comparison expression.
+
+For example, you can compare string values using '|' as escape character to protect '_' :
+
+```java
+rs = stmt.executeQuery("select str2 from comparisontest where str1 like '|_abcd' {escape '|'} ");
+```
diff --git a/docs/documentation/head/ext.md b/docs/documentation/head/ext.md
new file mode 100644
index 0000000..ea7cee9
--- /dev/null
+++ b/docs/documentation/head/ext.md
@@ -0,0 +1,40 @@
+---
+layout: default_docs
+title: Chapter 9. PostgreSQL™ Extensions to the JDBC API
+header: Chapter 9. PostgreSQL™ Extensions to the JDBC API
+resource: media
+previoustitle: Escaped scalar functions
+previous: escaped-functions.html
+nexttitle: Geometric Data Types
+next: geometric.html
+---
+
+**Table of Contents**
+
+* [Accessing the Extensions](ext.html#extensions)
+* [Geometric Data Types](geometric.html)
+* [Large Objects](largeobjects.html)
+* [Listen / Notify](listennotify.html)
+* [Server Prepared Statements](server-prepare.html)
+* [Physical and Logical replication API](replication.html)
+* [Arrays](arrays.html)
+
+PostgreSQL™ is an extensible database system. You can add your own functions to
+the server, which can then be called from queries, or even add your own data types.
+As these are facilities unique to PostgreSQL™, we support them from Java, with a
+set of extension APIs. Some features within the core of the standard driver
+actually use these extensions to implement Large Objects, etc.
+
+<a name="extensions"></a>
+# Accessing the Extensions
+
+To access some of the extensions, you need to use some extra methods in the
+`org.postgresql.PGConnection` class. In this case, you would need to case the
+return value of `Driver.getConnection()`. For example:
+
+```java
+Connection db = Driver.getConnection(url, username, password);
+// ...
+// later on
+Fastpath fp = db.unwrap(org.postgresql.PGConnection.class).getFastpathAPI();
+```
diff --git a/docs/documentation/head/geometric.md b/docs/documentation/head/geometric.md
new file mode 100644
index 0000000..f6a6dc6
--- /dev/null
+++ b/docs/documentation/head/geometric.md
@@ -0,0 +1,64 @@
+---
+layout: default_docs
+title: Geometric Data Types
+header: Chapter 9. PostgreSQL™ Extensions to the JDBC API
+resource: media
+previoustitle: Chapter 9. PostgreSQL™ Extensions to the JDBC API
+previous: ext.html
+nexttitle: Large Objects
+next: largeobjects.html
+---
+
+PostgreSQL™ has a set of data types that can store geometric features into a
+table. These include single points, lines, and polygons. We support these types
+in Java with the org.postgresql.geometric package. Please consult the Javadoc
+mentioned in [Chapter 13, *Further Reading*](reading.html) for details of
+available classes and features.
+
+<a name="geometric-circle-example"></a>
+**Example 9.1. Using the CIRCLE datatype JDBC**
+
+```java
+import java.sql.*;
+
+import org.postgresql.geometric.PGpoint;
+import org.postgresql.geometric.PGcircle;
+
+public class GeometricTest {
+ public static void main(String args[]) throws Exception {
+ String url = "jdbc:postgresql://localhost:5432/test";
+ try (Connection conn = DriverManager.getConnection(url, "test", "")) {
+ try (Statement stmt = conn.createStatement()) {
+ stmt.execute("CREATE TEMP TABLE geomtest(mycirc circle)");
+ }
+ insertCircle(conn);
+ retrieveCircle(conn);
+ }
+ }
+
+ private static void insertCircle(Connection conn) throws SQLException {
+ PGpoint center = new PGpoint(1, 2.5);
+ double radius = 4;
+ PGcircle circle = new PGcircle(center, radius);
+ try (PreparedStatement ps = conn.prepareStatement("INSERT INTO geomtest(mycirc) VALUES (?)")) {
+ ps.setObject(1, circle);
+ ps.executeUpdate();
+ }
+ }
+
+ private static void retrieveCircle(Connection conn) throws SQLException {
+ try (Statement stmt = conn.createStatement()) {
+ try (ResultSet rs = stmt.executeQuery("SELECT mycirc, area(mycirc) FROM geomtest")) {
+ while (rs.next()) {
+ PGcircle circle = (PGcircle)rs.getObject(1);
+ double area = rs.getDouble(2);
+
+ System.out.println("Center (X, Y) = (" + circle.center.x + ", " + circle.center.y + ")");
+ System.out.println("Radius = " + circle.radius);
+ System.out.println("Area = " + area);
+ }
+ }
+ }
+ }
+}
+```
diff --git a/docs/documentation/head/index.html b/docs/documentation/head/index.html
new file mode 100644
index 0000000..70ef62f
--- /dev/null
+++ b/docs/documentation/head/index.html
@@ -0,0 +1,258 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <title>The PostgreSQL JDBC Interface</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+ <meta name="description" content="The official documentation for the PostgreSQL JDBC Driver" />
+ <meta name="copyright" content="The PostgreSQL Global Development Group" />
+
+ <style type="text/css" media="screen" title="Normal Text">@import url("media/css/docs.css");</style>
+ <link rel="stylesheet" type="text/css" href="media/css/syntax.css">
+
+ <link rel="shortcut icon" href="media/favicon.ico" />
+</head>
+
+<body>
+ <div id="docHeader">
+ <div id="docHeaderLogo">
+ <a href="http://www.postgresql.org/" title="PostgreSQL"><img src="media/img/layout/hdr_left3a.png" alt="PostgreSQL" height="80" width="390" /></a>
+ </div>
+ </div>
+
+ <div id="docContainerWrap">
+ <div id="docContainer">
+ <div id="docContent">
+ <div class="BOOK">
+ <a name="POSTGRES" id="POSTGRES"></a>
+ <div class="TITLEPAGE">
+ <h1 class="TITLE">The PostgreSQL JDBC Interface</h1>
+ <hr />
+ </div>
+
+ <div class="TOC">
+ <h3 class="c2">Table of Contents</h3>
+ <dl>
+ <!-- <dt class="c1">Table of Contents</dt> -->
+
+ <dt>1. <a href="intro.html">Introduction</a></dt>
+
+ <dt>2. <a href="setup.html">Setting up the JDBC Driver</a></dt>
+ <dd>
+ <dl>
+ <dt><a href="setup.html#build">Getting the Driver</a></dt>
+ <dt><a href="classpath.html">Setting up the Class Path</a></dt>
+ <dt><a href="prepare.html">Preparing the Database Server for <acronym class="ACRONYM">JDBC</acronym></a></dt>
+ <dt><a href="your-database.html">Creating a Database</a></dt>
+ </dl>
+ </dd>
+
+ <dt>3. <a href="use.html">Initializing the Driver</a></dt>
+ <dd>
+ <dl>
+ <dt><a href="use.html#import">Importing <acronym class="ACRONYM">JDBC</acronym></a></dt>
+ <dt><a href="load.html">Loading the Driver</a></dt>
+ <dt><a href="connect.html">Connecting to the Database</a></dt>
+ <dd>
+ <dl>
+ <dt><a href="connect.html#connection-parameters">Connection Parameters</a></dt>
+ </dl>
+ </dd>
+ </dl>
+ </dd>
+
+ <dt>4. <a href="ssl.html">Using <acronym class="ACRONYM">SSL</acronym></a></dt>
+ <dd>
+ <dl>
+ <dt><a href="ssl.html#ssl-server">Configuring the Server</a></dt>
+ <dt><a href="ssl-client.html">Configuring the Client</a></dt>
+ <dd>
+ <dl>
+ <dt><a href="ssl-client.html#nonvalidating">Using SSL without Certificate Validation</a></dt>
+ </dl>
+ </dd>
+ <dt><a href="ssl-factory.html">Custom SSLSocketFactory</a></dt>
+ </dl>
+ </dd>
+
+ <dt>5. <a href="query.html">Issuing a Query and Processing the Result</a></dt>
+ <dd>
+ <dl>
+ <dt><a href="query.html#query-with-cursor">Getting results based on a cursor</a></dt>
+ <dt><a href="statement.html">Using the Statement or PreparedStatement Interface</a></dt>
+ <dt><a href="resultset.html">Using the ResultSet Interface</a></dt>
+ <dt><a href="update.html">Performing Updates</a></dt>
+ <dt><a href="ddl.html">Creating and Modifying Database Objects</a></dt>
+ <dt><a href="java8-date-time.html">Using Java 8 Date and Time classes</a></dt>
+ </dl>
+ </dd>
+
+ <dt>6. <a href="callproc.html">Calling Stored Functions</a></dt>
+ <dd>
+ <dl>
+ <dt><a href="callproc.html#callproc-resultset">Obtaining a ResultSet from a stored function</a></dt>
+ <dd>
+ <dl>
+ <dt><a href="callproc.html#callproc-resultset-setof">From a Function Returning SETOF type</a></dt>
+ <dt><a href="callproc.html#callproc-resultset-refcursor">From a Function Returning a <span class="type">refcursor</span></a></dt>
+ </dl>
+ </dd>
+ </dl>
+ </dd>
+
+ <dt>7. <a href="binary-data.html">Storing Binary Data</a></dt>
+
+ <dt>8. <a href="escapes.html"><acronym class="ACRONYM">JDBC</acronym> escapes</a></dt>
+ <dd>
+ <dl>
+ <dt><a href="escapes.html#like-escape">Escape for like escape character</a></dt>
+ <dt><a href="outer-joins-escape.html">Escape for outer joins</a></dt>
+ <dt><a href="escapes-datetime.html">Date-time escapes</a></dt>
+ <dt><a href="escaped-functions.html">Escaped scalar functions</a></dt>
+ </dl>
+ </dd>
+
+ <dt>9. <a href="ext.html">PostgreSQL™ Extensions to the <acronym class="ACRONYM">JDBC</acronym> <acronym class="ACRONYM">API</acronym></a></dt>
+ <dd>
+ <dl>
+ <dt><a href="ext.html#extensions">Accessing the Extensions</a></dt>
+ <dt><a href="geometric.html">Geometric Data Types</a></dt>
+ <dt><a href="largeobjects.html">Large Objects</a></dt>
+ <dt><a href="listennotify.html">Listen / Notify</a></dt>
+ <dt><a href="server-prepare.html">Server Prepared Statements</a></dt>
+ <dt><a href="replication.html">Physical and Logical replication API</a></dt>
+ <dt><a href="arrays.html">Arrays</a></dt>
+ </dl>
+ </dd>
+
+ <dt>10. <a href="thread.html">Using the Driver in a Multithreaded or a Servlet Environment</a></dt>
+
+ <dt>11. <a href="datasource.html">Connection Pools and Data Sources</a></dt>
+ <dd>
+ <dl>
+ <dt><a href="datasource.html#ds-intro">Overview</a></dt>
+ <dt><a href="ds-cpds.html">Application Servers: ConnectionPoolDataSource</a></dt>
+ <dt><a href="ds-ds.html">Applications: DataSource</a></dt>
+ <dt><a href="tomcat.html">Tomcat setup</a></dt>
+ <dt><a href="jndi.html">Data Sources and <acronym class="ACRONYM">JNDI</acronym></a></dt>
+ </dl>
+ </dd>
+
+ <dt>12. <a href="logging.html">Logging with java.util.logging</a></dt>
+
+ <dt>13. <a href="reading.html">Further Reading</a></dt>
+ </dl>
+ </div>
+
+ <div class="LOT">
+ <h3 class="c2">List of Tables</h3>
+ <dl class="LOT">
+ <!-- <dt class="c1">List of Tables</dt> -->
+ <dt>
+ 8.1. <a href="escaped-functions.html#escape-numeric-functions-table">Supported escaped numeric functions</a>
+ </dt>
+ <dt>
+ 8.2. <a href="escaped-functions.html#escape-string-functions-table">Supported escaped string functions</a>
+ </dt>
+ <dt>
+ 8.3. <a href="escaped-functions.html#escape-datetime-functions-table">Supported escaped date/time functions</a>
+ </dt>
+ <dt>
+ 8.4. <a href="escaped-functions.html#escape-misc-functions-table">Supported escaped misc functions</a>
+ </dt>
+ <dt>
+ 11.1. <a href="ds-cpds.html#ds-cpds-props">ConnectionPoolDataSource Configuration Properties</a>
+ </dt>
+ <dt>
+ 11.2. <a href="ds-ds.html#ds-ds-imp">DataSource Implementations</a>
+ </dt>
+ <dt>
+ 11.3. <a href="ds-ds.html#ds-ds-props">DataSource Configuration Properties</a>
+ </dt>
+ <dt>
+ 11.4. <a href="ds-ds.html#ds-ds-xprops">Additional Pooling DataSource Configuration Properties</a>
+ </dt>
+ </dl>
+ </div>
+
+ <div class="LOT">
+ <h3 class="c2">List of Examples</h3>
+ <dl class="LOT">
+ <!-- <dt class="c1">List of Examples</dt> -->
+ <dt>
+ 5.1. <a href="query.html#query-example">Processing a Simple Query in <acronym class="ACRONYM">JDBC</acronym></a>
+ </dt>
+ <dt>
+ 5.2. <a href="query.html#fetchsize-example">Setting fetch size to turn cursors on and off.</a>
+ </dt>
+ <dt>
+ 5.3. <a href="update.html#delete-example">Deleting Rows in <acronym class="ACRONYM">JDBC</acronym></a>
+ </dt>
+ <dt>
+ 5.4. <a href="ddl.html#drop-table-example">Dropping a Table in <acronym class="ACRONYM">JDBC</acronym></a>
+ </dt>
+ <dt>
+ 6.1. <a href="callproc.html#call-function-example">Calling a built in stored function</a>
+ </dt>
+ <dt>
+ 6.2. <a href="callproc.html#setof-resultset"> Getting SETOF type values from a function</a>
+ </dt>
+ <dt>
+ 6.3. <a href="callproc.html#get-refcursor-from-function-call"> Getting <span class="type">refcursor</span> Value From a Function</a>
+ </dt>
+ <dt>
+ 6.4. <a href="callproc.html#refcursor-string-example">Treating <span class="type">refcursor</span> as a cursor name</a>
+ </dt>
+ <dt>
+ 7.1. <a href="binary-data.html#binary-data-example">Processing Binary Data in <acronym class="ACRONYM">JDBC</acronym></a>
+ </dt>
+ <dt>
+ 8.1. <a href="escapes.html#escape-use-example">Using jdbc escapes</a>
+ </dt>
+ <dt>
+ 9.1. <a href="geometric.html#geometric-circle-example">Using the CIRCLE datatype from <acronym class="ACRONYM">JDBC</acronym></a>
+ </dt>
+ <dt>
+ 9.2. <a href="listennotify.html#listen-notify-example">Receiving Notifications</a>
+ </dt>
+ <dt>
+ 9.3. <a href="server-prepare.html#server-prepared-statement-example">Using server side prepared statements</a>
+ </dt>
+ <dt>
+ 11.1. <a href="ds-ds.html#ds-example">DataSource Code Example</a>
+ </dt>
+ <dt>
+ 11.2. <a href="jndi.html#ds-jndi">DataSource <acronym class="ACRONYM">JNDI</acronym> Code Example</a>
+ </dt>
+ </dl>
+ </div>
+ </div> <!-- BOOK -->
+
+ <div class="NAVFOOTER">
+ <hr class="c2" width="100%" />
+ <table summary="Footer navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
+ <tbody>
+ <tr>
+ <td valign="top" width="33%" align="left"> </td>
+ <td valign="top" width="34%" align="center"> </td>
+ <td valign="top" width="33%" align="right"><a href="intro.html" accesskey="N">Next</a></td>
+ </tr>
+ <tr>
+ <td valign="top" width="33%" align="left"> </td>
+ <td valign="top" width="34%" align="center"> </td>
+ <td valign="top" width="33%" align="right">Chapter 1. Introduction</td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </div> <!--docContent -->
+
+ <div id="docComments"></div>
+
+ <div id="docFooter">
+ <a class="navFooter" href="http://www.postgresql.org/about/privacypolicy">Privacy Policy</a> |
+ <a class="navFooter" href="http://www.postgresql.org/about/">About PostgreSQL</a><br/>
+ Copyright © 1996-2017 The PostgreSQL Global Development Group
+ </div> <!-- pgFooter -->
+ </div> <!-- docContainer -->
+ </div> <!-- docContainerWrap -->
+</body>
diff --git a/docs/documentation/head/intro.md b/docs/documentation/head/intro.md
new file mode 100644
index 0000000..556f3cc
--- /dev/null
+++ b/docs/documentation/head/intro.md
@@ -0,0 +1,29 @@
+---
+layout: default_docs
+title: Chapter 1. Introduction
+header: Chapter 1. Introduction
+resource: media
+previoustitle: The PostgreSQL™ JDBC Interface
+previous: index.html
+nexttitle: Chapter 2. Setting up the JDBC Driver
+next: setup.html
+---
+
+Java Database Connectivity (JDBC) is an application programming interface (API) for
+the programming language Java, which defines how a client may access a database.
+It is part of the Java Standard Edition platform and provides methods to query and
+update data in a database, and is oriented towards relational databases.
+
+PostgreSQL JDBC Driver (PgJDBC for short) allows Java programs to connect to a PostgreSQL
+database using standard, database independent Java code. Is an open source JDBC driver
+written in Pure Java (Type 4), and communicates in the PostgreSQL native network protocol.
+Because of this, the driver is platform independent; once compiled, the driver
+can be used on any system.
+
+The current version of the driver should be compatible with PostgreSQL 8.2 and higher
+using the version 3.0 of the PostgreSQL protocol, and it's compatible with Java 6 (JDBC 4.0),
+Java 7 (JDBC 4.1) and Java 8 (JDBC 4.2).
+
+This manual is not intended as a complete guide to JDBC programming, but should
+help to get you started. For more information refer to the standard JDBC API
+documentation. Also, take a look at the examples included with the source.
\ No newline at end of file
diff --git a/docs/documentation/head/java8-date-time.md b/docs/documentation/head/java8-date-time.md
new file mode 100644
index 0000000..f4eb7f5
--- /dev/null
+++ b/docs/documentation/head/java8-date-time.md
@@ -0,0 +1,80 @@
+---
+layout: default_docs
+title: Using Java 8 Date and Time classes
+header: Chapter 5. Using Java 8 Date and Time classes
+resource: media
+previoustitle: Creating and Modifying Database Objects
+previous: ddl.html
+nexttitle: Chapter 6. Calling Stored Functions
+next: callproc.html
+---
+
+The PostgreSQL™ JDBC driver implements native support for the
+[Java 8 Date and Time API](http://www.oracle.com/technetwork/articles/java/jf14-date-time-2125367.html)
+(JSR-310) using JDBC 4.2.
+
+<a name="8-date-time-supported-data-types"></a>
+**Table 5.1. Supported escaped numeric functions**
+
+<table summary="Supported data type" class="CALSTABLE" border="1">
+ <tr>
+ <th>PostgreSQL™</th>
+ <th>Java SE 8</th>
+ </tr>
+ <tbody>
+ <tr>
+ <td>DATE</td>
+ <td>LocalDate</td>
+ </tr>
+ <tr>
+ <td>TIME [ WITHOUT TIME ZONE ]</td>
+ <td>LocalTime</td>
+ </tr>
+ <tr>
+ <td>TIMESTAMP [ WITHOUT TIME ZONE ]</td>
+ <td>LocalDateTime</td>
+ </tr>
+ <tr>
+ <td>TIMESTAMP WITH TIME ZONE</td>
+ <td>OffsetDateTime</td>
+ </tr>
+ </tbody>
+</table>
+
+This is closely aligned with tables B-4 and B-5 of the JDBC 4.2 specification.
+Note that `ZonedDateTime`, `Instant` and
+`OffsetTime / TIME [ WITHOUT TIME ZONE ]` are not supported. Also note
+that all `OffsetDateTime` will instances will have be in UTC (have offset 0).
+This is because the backend stores them as UTC.
+
+<a name="reading-example"></a>
+**Example 5.5. Reading Java 8 Date and Time values using JDBC**
+
+```java
+Statement st = conn.createStatement();
+ResultSet rs = st.executeQuery("SELECT * FROM mytable WHERE columnfoo = 500");
+while (rs.next())
+{
+ System.out.print("Column 1 returned ");
+ LocalDate localDate = rs.getObject(1, LocalDate.class));
+ System.out.println(localDate);
+}
+rs.close();
+st.close();
+```
+
+For other data types simply pass other classes to `#getObject`.
+Note that the Java data types needs to match the SQL data types in table 7.1.
+
+
+<a name="writing-example"></a>
+**Example 5.5. Writing Java 8 Date and Time values using JDBC**
+
+```java
+LocalDate localDate = LocalDate.now();
+PreparedStatement st = conn.prepareStatement("INSERT INTO mytable (columnfoo) VALUES (?)");
+st.setObject(1, localDate);
+st.executeUpdate();
+st.close();
+```
+
diff --git a/docs/documentation/head/jndi.md b/docs/documentation/head/jndi.md
new file mode 100644
index 0000000..e5f2ce8
--- /dev/null
+++ b/docs/documentation/head/jndi.md
@@ -0,0 +1,70 @@
+---
+layout: default_docs
+title: Data Sources and JNDI
+header: Chapter 11. Connection Pools and Data Sources
+resource: media
+previoustitle: Tomcat setup
+previous: tomcat.html
+nexttitle: Chapter 12. Logging with java.util.logging
+next: logging.html
+---
+
+All the `ConnectionPoolDataSource` and `DataSource` implementations can be stored
+in JNDI. In the case of the nonpooling implementations, a new instance will be
+created every time the object is retrieved from JNDI, with the same settings as
+the instance that was stored. For the pooling implementations, the same instance
+will be retrieved as long as it is available (e.g., not a different JVM retrieving
+the pool from JNDI), or a new instance with the same settings created otherwise.
+
+In the application server environment, typically the application server's
+`DataSource` instance will be stored in JNDI, instead of the PostgreSQL™
+`ConnectionPoolDataSource` implementation.
+
+In an application environment, the application may store the `DataSource` in JNDI
+so that it doesn't have to make a reference to the `DataSource` available to all
+application components that may need to use it. An example of this is shown in
+[Example 11.2, “`DataSource` JNDI Code Example”](jndi.html#ds-jndi).
+
+<a name="ds-jndi"></a>
+**Example 11.2. `DataSource` JNDI Code Example**
+
+Application code to initialize a pooling `DataSource` and add it to JNDI might
+look like this:
+
+```java
+PGPoolingDataSource source = new PGPoolingDataSource();
+source.setDataSourceName("A Data Source");
+source.setServerName("localhost");
+source.setDatabaseName("test");
+source.setUser("testuser");
+source.setPassword("testpassword");
+source.setMaxConnections(10);
+new InitialContext().rebind("DataSource", source);
+```
+
+Then code to use a connection from the pool might look like this:
+
+```java
+Connection conn = null;
+try
+{
+ DataSource source = (DataSource)new InitialContext().lookup("DataSource");
+ conn = source.getConnection();
+ // use connection
+}
+catch (SQLException e)
+{
+ // log error
+}
+catch (NamingException e)
+{
+ // DataSource wasn't found in JNDI
+}
+finally
+{
+ if (con != null)
+ {
+ try { conn.close(); } catch (SQLException e) {}
+ }
+}
+```
diff --git a/docs/documentation/head/largeobjects.md b/docs/documentation/head/largeobjects.md
new file mode 100644
index 0000000..cbcdbad
--- /dev/null
+++ b/docs/documentation/head/largeobjects.md
@@ -0,0 +1,20 @@
+---
+layout: default_docs
+title: Large Objects
+header: Chapter 9. PostgreSQL™ Extensions to the JDBC API
+resource: media
+previoustitle: Geometric Data Types
+previous: geometric.html
+nexttitle: Listen / Notify
+next: listennotify.html
+---
+
+Large objects are supported in the standard JDBC specification. However, that
+interface is limited, and the API provided by PostgreSQL™ allows for random
+access to the objects contents, as if it was a local file.
+
+The org.postgresql.largeobject package provides to Java the libpq C interface's
+large object API. It consists of two classes, `LargeObjectManager`, which deals
+with creating, opening and deleting large objects, and `LargeObject` which deals
+with an individual object. For an example usage of this API, please see
+[Example 7.1, “Processing Binary Data in JDBC”](binary-data.html#binary-data-example).
\ No newline at end of file
diff --git a/docs/documentation/head/listennotify.md b/docs/documentation/head/listennotify.md
new file mode 100644
index 0000000..49b8958
--- /dev/null
+++ b/docs/documentation/head/listennotify.md
@@ -0,0 +1,142 @@
+---
+layout: default_docs
+title: Listen / Notify
+header: Chapter 9. PostgreSQL™ Extensions to the JDBC API
+resource: media
+previoustitle: Large Objects
+previous: largeobjects.html
+nexttitle: Server Prepared Statements
+next: server-prepare.html
+---
+
+Listen and Notify provide a simple form of signal or interprocess communication
+mechanism for a collection of processes accessing the same PostgreSQL™ database.
+For more information on notifications consult the main server documentation. This
+section only deals with the JDBC specific aspects of notifications.
+
+Standard `LISTEN`, `NOTIFY`, and `UNLISTEN` commands are issued via the standard
+`Statement` interface. To retrieve and process retrieved notifications the
+`Connection` must be cast to the PostgreSQL™ specific extension interface
+`PGConnection`. From there the `getNotifications()` method can be used to retrieve
+any outstanding notifications.
+
+### Note
+
+> A key limitation of the JDBC driver is that it cannot receive asynchronous
+notifications and must poll the backend to check if any notifications were issued.
+A timeout can be given to the poll function, but then the execution of statements
+from other threads will block.
+
+<a name="listen-notify-example"></a>
+**Example 9.2. Receiving Notifications**
+
+```java
+import java.sql.*;
+
+public class NotificationTest
+{
+ public static void main(String args[]) throws Exception
+ {
+ Class.forName("org.postgresql.Driver");
+ String url = "jdbc:postgresql://localhost:5432/test";
+
+ // Create two distinct connections, one for the notifier
+ // and another for the listener to show the communication
+ // works across connections although this example would
+ // work fine with just one connection.
+
+ Connection lConn = DriverManager.getConnection(url,"test","");
+ Connection nConn = DriverManager.getConnection(url,"test","");
+
+ // Create two threads, one to issue notifications and
+ // the other to receive them.
+
+ Listener listener = new Listener(lConn);
+ Notifier notifier = new Notifier(nConn);
+ listener.start();
+ notifier.start();
+ }
+}
+
+class Listener extends Thread
+{
+ private Connection conn;
+ private org.postgresql.PGConnection pgconn;
+
+ Listener(Connection conn) throws SQLException
+ {
+ this.conn = conn;
+ this.pgconn = conn.unwrap(org.postgresql.PGConnection.class);
+ Statement stmt = conn.createStatement();
+ stmt.execute("LISTEN mymessage");
+ stmt.close();
+ }
+
+ public void run()
+ {
+ try
+ {
+ while (true)
+ {
+ org.postgresql.PGNotification notifications[] = pgconn.getNotifications();
+
+ // If this thread is the only one that uses the connection, a timeout can be used to
+ // receive notifications immediately:
+ // org.postgresql.PGNotification notifications[] = pgconn.getNotifications(10000);
+
+ if (notifications != null)
+ {
+ for (int i=0; i < notifications.length; i++)
+ System.out.println("Got notification: " + notifications[i].getName());
+ }
+
+ // wait a while before checking again for new
+ // notifications
+
+ Thread.sleep(500);
+ }
+ }
+ catch (SQLException sqle)
+ {
+ sqle.printStackTrace();
+ }
+ catch (InterruptedException ie)
+ {
+ ie.printStackTrace();
+ }
+ }
+}
+
+class Notifier extends Thread
+{
+ private Connection conn;
+
+ public Notifier(Connection conn)
+ {
+ this.conn = conn;
+ }
+
+ public void run()
+ {
+ while (true)
+ {
+ try
+ {
+ Statement stmt = conn.createStatement();
+ stmt.execute("NOTIFY mymessage");
+ stmt.close();
+ Thread.sleep(2000);
+ }
+ catch (SQLException sqle)
+ {
+ sqle.printStackTrace();
+ }
+ catch (InterruptedException ie)
+ {
+ ie.printStackTrace();
+ }
+ }
+ }
+
+}
+```
diff --git a/docs/documentation/head/load.md b/docs/documentation/head/load.md
new file mode 100644
index 0000000..5a3646f
--- /dev/null
+++ b/docs/documentation/head/load.md
@@ -0,0 +1,30 @@
+---
+layout: default_docs
+title: Loading the Driver
+header: Chapter 3. Initializing the Driver
+resource: media
+previoustitle: Chapter 3. Initializing the Driver
+previous: use.html
+nexttitle: Connecting to the Database
+next: connect.html
+---
+
+Applications do not need to explicitly load the org.postgresql.Driver
+class because the pgjdbc driver jar supports the Java Service Provider
+mechanism. The driver will be loaded by the JVM when the application
+connects to PostgreSQL™ (as long as the driver's jar file is on the
+classpath).
+
+
+### Note
+
+Prior to Java 1.6, the driver had to be loaded by the application - either by calling
+
+```java
+Class.forName("org.postgresql.Driver");
+```
+or by passing the driver class name as a JVM parameter.
+
+`java -Djdbc.drivers=org.postgresql.Driver example.ImageViewer`
+
+These older methods of loading the driver are still supported but they are no longer necessary.
diff --git a/docs/documentation/head/logging.md b/docs/documentation/head/logging.md
new file mode 100644
index 0000000..00f384a
--- /dev/null
+++ b/docs/documentation/head/logging.md
@@ -0,0 +1,140 @@
+---
+layout: default_docs
+title: Chapter 12. Logging using java.util.logging
+header: Chapter 12. Logging using java.util.logging
+resource: media
+previoustitle: Data Sources and JNDI
+previous: jndi.html
+nexttitle: Further Reading
+next: reading.html
+---
+
+**Table of Contents**
+
+* [Overview](logging.html#overview)
+* [Configuration](logging.html#configuration)
+ * [Enable logging by using connection properties](logging.html#conprop)
+ * [Enable logging by using logging.properties file](logging.html#fileprop)
+
+<a name="overview"></a>
+# Overview
+
+The PostgreSQL JDBC Driver supports the use of logging (or tracing) to help resolve issues with the
+PgJDBC Driver when is used in your application.
+
+The PgJDBC Driver uses the logging APIs of `java.util.logging` that is part of Java since JDK 1.4,
+which makes it a good choice for the driver since it don't add any external dependency for a logging
+framework. `java.util.logging` is a very rich and powerful tool, it's beyond the scope of this docs
+to explain or use it full potential, for that please refer to
+[Java Logging Overview](https://docs.oracle.com/javase/8/docs/technotes/guides/logging/overview.html).
+
+This logging support was added since version 42.0.0 of the PgJDBC Driver, and previous
+versions uses a custom mechanism to enable logging that it is replaced by the use of
+`java.util.logging` in current versions, the old mechanism is no longer available.
+
+Please note that while most people asked the use of a Logging Framework for a long time, this
+support is mainly to debug the driver itself and not for general sql query debug.
+
+<a name="configuration"></a>
+# Configuration
+
+The Logging APIs offer both static and dynamic configuration control. Static control enables field
+service staff to set up a particular configuration and then re-launch the application with the new
+logging settings. Dynamic control allows for updates to the logging configuration within a currently
+running program.
+
+As part of the support of a logging framework in the PgJDBC Driver, there was a need to facilitate
+the enabling of the Logger using [connection properties](logging.html#conprop), which uses a static
+control to enable the tracing in the driver. Keep in mind that if you use an Application Server
+(Tomcat, JBoss, WildFly, etc.) you should use the facilities provided by them to enable the logging,
+as most Application Servers use dynamic configuration control which makes easy to enable/disable
+logging at runtime.
+
+The root logger used by the PgJDBC driver is `org.postgresql`.
+
+<a name="conprop"></a>
+## Enable logging by using connection properties
+
+The driver provides a facility to enable logging using connection properties, it's not as feature rich
+as using a `logging.properties` file, so it should be used when you are really debugging the driver.
+
+The properties are `loggerLevel` and `loggerFile`:
+
+**loggerLevel**: Logger level of the driver. Allowed values: `OFF`, `DEBUG` or `TRACE`.
+
+This option enable the `java.util.logging.Logger` Level of the driver based on the following mapping:
+
+<table summary="Logger Level mapping" class="CALSTABLE" border="1">
+ <tr>
+ <th>loggerLevel</th>
+ <th>java.util.logging</th>
+ </tr>
+ <tbody>
+ <tr>
+ <td>OFF</td>
+ <td>OFF</td>
+ </tr>
+ <tr>
+ <td>DEBUG</td>
+ <td>FINE</td>
+ </tr>
+ <tr>
+ <td>TRACE</td>
+ <td>FINEST</td>
+ </tr>
+ </tbody>
+</table>
+
+As noted, there are no other levels supported using this method, and internally the driver Logger levels
+should not (for the most part) use others levels as the intention is to debug the driver and don't
+interfere with higher levels when some applications enable them globally.
+
+**loggerFile**: File name output of the Logger.
+
+If set, the Logger will use a `java.util.logging.FileHandler` to write to a specified file.
+If the parameter is not set or the file can't be created the `java.util.logging.ConsoleHandler`
+will be used instead.
+
+This parameter should be use together with `loggerLevel`.
+
+The following is an example of how to use connection properties to enable logging:
+
+```
+jdbc:postgresql://localhost:5432/mydb?loggerLevel=DEBUG
+jdbc:postgresql://localhost:5432/mydb?loggerLevel=TRACE&loggerFile=pgjdbc.log
+```
+
+<a name="fileprop"></a>
+## Enable logging by using logging.properties file
+
+The default Java logging framework stores its configuration in a file called `logging.properties`.
+Settings are stored per line using a dot notation format. Java installs a global configuration file
+in the `lib` folder of the Java installation directory, although you can use a separate configuration
+file by specifying the `java.util.logging.config.file` property when starting a Java program.
+`logging.properties` files can also be created and stored with individual projects.
+
+The following is an example of setting that you can make in the `logging.properties`:
+
+```properties
+# Specify the handler, the handlers will be installed during VM startup.
+handlers= java.util.logging.FileHandler
+
+# Default global logging level.
+.level= OFF
+
+# default file output is in user's home directory.
+java.util.logging.FileHandler.pattern = %h/pgjdbc%u.log
+java.util.logging.FileHandler.limit = 5000000
+java.util.logging.FileHandler.count = 20
+java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter
+java.util.logging.FileHandler.level = FINEST
+
+java.util.logging.SimpleFormatter.format=%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS %4$s %2$s %5$s%6$s%n
+
+# Facility specific properties.
+org.postgresql.level=FINEST
+```
+
+And when you run your application you pass the system property:
+`java -jar -Djava.util.logging.config.file=logging.properties run.jar`
+
diff --git a/docs/documentation/head/media/css/docs.css b/docs/documentation/head/media/css/docs.css
new file mode 100644
index 0000000..b168780
--- /dev/null
+++ b/docs/documentation/head/media/css/docs.css
@@ -0,0 +1,450 @@
+/* PostgreSQL.org Documentation Style */
+
+ at import url("global.css");
+ at import url("table.css");
+ at import url("text.css");
+
+body {
+ font-size: 76%;
+}
+
+div.NAVHEADER table {
+ margin-left: 0;
+}
+
+/* Container Definitions */
+
+#docContainerWrap {
+ text-align: center; /* Win IE5 */
+}
+
+#docContainer {
+ margin: 0 auto;
+ width: 90%;
+ padding-bottom: 2em;
+ display: block;
+ text-align: left; /* Win IE5 */
+}
+
+#docHeader {
+ background-image: url("../img/docs/bg_hdr.png");
+ height: 83px;
+ margin: 0px;
+ padding: 0px;
+ display: block;
+}
+
+#docHeaderLogo {
+ position: relative;
+ width: 206px;
+ height: 83px;
+ border: 0px;
+ padding: 0px;
+ margin: 0 0 0 20px;
+}
+
+#docHeaderLogo img {
+ border: 0px;
+}
+
+#docNavSearchContainer {
+ padding-bottom: 2px;
+}
+
+#docNav, #docVersions {
+ position: relative;
+ text-align: left;
+ margin-left: 10px;
+ margin-top: 5px;
+ color: #666;
+ font-size: 0.95em;
+}
+
+#docSearch {
+ position: relative;
+ text-align: right;
+ padding: 0;
+ margin: 0;
+ color: #666;
+}
+
+#docTextSize {
+ text-align: right;
+ white-space: nowrap;
+ margin-top: 7px;
+ font-size: 0.95em;
+}
+
+#docSearch form {
+ position: relative;
+ top: 5px;
+ right: 0;
+ margin: 0; /* need for IE 5.5 OSX */
+ text-align: right; /* need for IE 5.5 OSX */
+ white-space: nowrap; /* for Opera */
+}
+
+#docSearch form label {
+ color: #666;
+ font-size: 0.95em;
+}
+
+#docSearch form input {
+ font-size: 0.95em;
+}
+
+#docSearch form #submit {
+ font-size: 0.95em;
+ background: #7A7A7A;
+ color: #fff;
+ border: 1px solid #7A7A7A;
+ padding: 1px 4px;
+}
+
+#docSearch form #q {
+ width: 170px;
+ font-size: 0.95em;
+ border: 1px solid #7A7A7A;
+ background: #E1E1E1;
+ color: #000000;
+ padding: 2px;
+}
+
+.frmDocSearch {
+ padding: 0;
+ margin: 0;
+ display: inline;
+}
+
+.inpDocSearch {
+ padding: 0;
+ margin: 0;
+ color: #000;
+}
+
+#docContent {
+ position: relative;
+ margin-left: 10px;
+ margin-right: 10px;
+ margin-top: 40px;
+}
+
+#docFooter {
+ position: relative;
+ font-size: 0.9em;
+ color: #666;
+ line-height: 1.3em;
+ margin-left: 10px;
+ margin-right: 10px;
+}
+
+#docComments {
+ margin-top: 10px;
+}
+
+#docClear {
+ clear: both;
+ margin: 0;
+ padding: 0;
+}
+
+/* Heading Definitions */
+
+h1, h2, h3 {
+ font-weight: bold;
+ margin-top: 2ex;
+}
+
+h1 {
+ font-size: 1.4em;
+}
+
+h2 {
+ font-size: 1.2em !important;
+}
+
+h3 {
+ font-size: 1.1em;
+}
+
+h1 a:hover {
+ color: #EC5800;
+ text-decoration: none;
+}
+
+h2 a:hover,
+h3 a:hover,
+h4 a:hover {
+ color: #666666;
+ text-decoration: none;
+}
+
+/* Text Styles */
+
+div.SECT2 {
+ margin-top: 4ex;
+}
+
+div.SECT3 {
+ margin-top: 3ex;
+ margin-left: 3ex;
+}
+
+.txtCurrentLocation {
+ font-weight: bold;
+}
+
+p, ol, ul, li {
+ line-height: 1.5em;
+}
+
+.txtCommentsWrap {
+ border: 2px solid #F5F5F5;
+ width: 100%;
+}
+
+.txtCommentsContent {
+ background: #F5F5F5;
+ padding: 3px;
+}
+
+.txtCommentsPoster {
+ float: left;
+}
+
+.txtCommentsDate {
+ float: right;
+}
+
+.txtCommentsComment {
+ padding: 3px;
+}
+
+#docContainer p code,
+#docContainer ul code,
+#docContainer pre code,
+#docContainer pre tt,
+#docContainer pre pre,
+#docContainer tt tt,
+#docContainer tt code,
+#docContainer tt pre {
+ font-size: 1.5em;
+}
+
+pre.LITERALLAYOUT,
+.SCREEN,
+.SYNOPSIS,
+.PROGRAMLISTING,
+.REFSYNOPSISDIV p,
+table.CAUTION,
+table.WARNING,
+blockquote.NOTE,
+blockquote.TIP,
+table.CALSTABLE {
+ -moz-box-shadow: 3px 3px 5px #DFDFDF;
+ -webkit-box-shadow: 3px 3px 5px #DFDFDF;
+ -khtml-box-shadow: 3px 3px 5px #DFDFDF;
+ -o-box-shadow: 3px 3px 5px #DFDFDF;
+ box-shadow: 3px 3px 5px #DFDFDF;
+}
+
+pre.LITERALLAYOUT,
+.SCREEN,
+.SYNOPSIS,
+.PROGRAMLISTING,
+.REFSYNOPSISDIV p,
+table.CAUTION,
+table.WARNING,
+blockquote.NOTE,
+blockquote.TIP {
+ color: black;
+ border-width: 1px;
+ border-style: solid;
+ padding: 2ex;
+ margin: 2ex 0 2ex 2ex;
+ overflow: auto;
+ -moz-border-radius: 8px;
+ -webkit-border-radius: 8px;
+ -khtml-border-radius: 8px;
+ border-radius: 8px;
+}
+
+pre.LITERALLAYOUT,
+pre.SYNOPSIS,
+pre.PROGRAMLISTING,
+.REFSYNOPSISDIV p,
+.SCREEN {
+ border-color: #CFCFCF;
+ background-color: #F7F7F7;
+}
+
+blockquote.NOTE,
+blockquote.TIP {
+ border-color: #DBDBCC;
+ background-color: #EEEEDD;
+ padding: 14px;
+ width: 572px;
+}
+
+blockquote.NOTE,
+blockquote.TIP,
+table.CAUTION,
+table.WARNING {
+ margin: 4ex auto;
+}
+
+blockquote.NOTE p,
+blockquote.TIP p {
+ margin: 0;
+}
+
+blockquote.NOTE pre,
+blockquote.NOTE code,
+blockquote.TIP pre,
+blockquote.TIP code {
+ margin-left: 0;
+ margin-right: 0;
+ -moz-box-shadow: none;
+ -webkit-box-shadow: none;
+ -khtml-box-shadow: none;
+ -o-box-shadow: none;
+ box-shadow: none;
+}
+
+.emphasis,
+.c2 {
+ font-weight: bold;
+}
+
+.REPLACEABLE {
+ font-style: italic;
+}
+
+/* Table Styles */
+
+table {
+ margin-left: 2ex;
+}
+
+table.CALSTABLE td,
+table.CALSTABLE th,
+table.CAUTION td,
+table.CAUTION th,
+table.WARNING td,
+table.WARNING th {
+ border-style: solid;
+}
+
+table.CALSTABLE,
+table.CAUTION,
+table.WARNING {
+ border-spacing: 0;
+ border-collapse: collapse;
+}
+
+table.CALSTABLE
+{
+ margin: 2ex 0 2ex 2ex;
+ background-color: #E0ECEF;
+ border: 2px solid #A7C6DF;
+}
+
+table.CALSTABLE tr:hover td
+{
+ background-color: #EFEFEF;
+}
+
+table.CALSTABLE td {
+ background-color: #FFF;
+}
+
+table.CALSTABLE td,
+table.CALSTABLE th {
+ border: 1px solid #A7C6DF;
+ padding: 0.5ex 0.5ex;
+}
+
+table.CAUTION,
+table.WARNING {
+ border-collapse: separate;
+ display: block;
+ padding: 0;
+ max-width: 600px;
+}
+
+table.CAUTION {
+ background-color: #F5F5DC;
+ border-color: #DEDFA7;
+}
+
+table.WARNING {
+ background-color: #FFD7D7;
+ border-color: #DF421E;
+}
+
+table.CAUTION td,
+table.CAUTION th,
+table.WARNING td,
+table.WARNING th {
+ border-width: 0;
+ padding-left: 2ex;
+ padding-right: 2ex;
+}
+
+table.CAUTION td,
+table.CAUTION th {
+ border-color: #F3E4D5
+}
+
+table.WARNING td,
+table.WARNING th {
+ border-color: #FFD7D7;
+}
+
+td.c1,
+td.c2,
+td.c3,
+td.c4,
+td.c5,
+td.c6 {
+ font-size: 1.1em;
+ font-weight: bold;
+ border-bottom: 0px solid #FFEFEF;
+ padding: 1ex 2ex 0;
+}
+
+/* Link Styles */
+
+#docNav a {
+ font-weight: bold;
+}
+
+a:link,
+a:visited,
+a:active,
+a:hover {
+ text-decoration: underline;
+}
+
+a:link,
+a:active {
+ color:#0066A2;
+}
+
+a:visited {
+ color:#004E66;
+}
+
+a:hover {
+ color:#000000;
+}
+
+#docFooter a:link,
+#docFooter a:visited,
+#docFooter a:active {
+ color:#666;
+}
+
+#docContainer code.FUNCTION tt {
+ font-size: 1em;
+}
diff --git a/docs/documentation/head/media/css/global.css b/docs/documentation/head/media/css/global.css
new file mode 100644
index 0000000..1706e11
--- /dev/null
+++ b/docs/documentation/head/media/css/global.css
@@ -0,0 +1,98 @@
+/*
+ PostgreSQL.org - Global Styles
+*/
+
+body {
+ margin: 0;
+ padding: 0;
+ font-family: verdana, sans-serif;
+ font-size: 69%;
+ color: #000;
+ background-color: #fff;
+}
+
+h1 {
+ font-size: 1.4em;
+ font-weight: bold;
+ margin-top: 0em;
+ margin-bottom: 0em;
+}
+
+h2 {
+ font-size: 1.2em;
+ margin: 1.2em 0em 1.2em 0em;
+ font-weight: bold;
+}
+
+h3 {
+ font-size: 1.0em;
+ margin: 1.2em 0em 1.2em 0em;
+ font-weight: bold;
+}
+
+h4 {
+ font-size: 0.95em;
+ margin: 1.2em 0em 1.2em 0em;
+ font-weight: normal;
+}
+
+h5 {
+ font-size: 0.9em;
+ margin: 1.2em 0em 1.2em 0em;
+ font-weight: normal;
+}
+
+h6 {
+ font-size: 0.85em;
+ margin: 1.2em 0em 1.2em 0em;
+ font-weight: normal;
+}
+
+img {
+ border: 0;
+}
+
+ol, ul, li {/*
+ list-style: none;*/
+ font-size: 1.0em;
+ line-height: 1.2em;
+ margin-top: 0.2em;
+ margin-bottom: 0.1em;
+}
+
+p {
+ font-size: 1.0em;
+ line-height: 1.2em;
+ margin: 1.2em 0em;
+}
+
+td p {
+ margin: 0em 0em 1.2em;
+}
+
+li > p {
+ margin-top: 0.2em;
+}
+
+pre {
+ font-family: monospace;
+ font-size: 1.0em;
+}
+
+div#pgContentWrap code {
+ font-size: 1.2em;
+ padding: 1em;
+ margin: 2ex 0 2ex 2ex;
+ background: #F7F7F7;
+ border: 1px solid #CFCFCF;
+ -moz-border-radius: 8px;
+ -webkit-border-radius: 8px;
+ -khtml-border-radius: 8px;
+ border-radius: 8px;
+ display: block;
+ overflow: auto;
+}
+
+strong, b {
+ font-weight: bold;
+}
diff --git a/docs/documentation/head/media/css/syntax.css b/docs/documentation/head/media/css/syntax.css
new file mode 100644
index 0000000..e434e28
--- /dev/null
+++ b/docs/documentation/head/media/css/syntax.css
@@ -0,0 +1,80 @@
+.highlight {
+ border-color: #CFCFCF;
+ background-color: #F7F7F7;
+ color: black;
+ border-width: 1px;
+ border-style: solid;
+ padding: 2ex;
+ margin: 2ex 0 2ex 2ex;
+ overflow: auto;
+ -moz-border-radius: 8px;
+ -webkit-border-radius: 8px;
+ -khtml-border-radius: 8px;
+ border-radius: 8px;
+ -moz-box-shadow: 3px 3px 5px #DFDFDF;
+ -webkit-box-shadow: 3px 3px 5px #DFDFDF;
+ -khtml-box-shadow: 3px 3px 5px #DFDFDF;
+ -o-box-shadow: 3px 3px 5px #DFDFDF;
+ box-shadow: 3px 3px 5px #DFDFDF;
+}
+.highlight .py { color: #545454; }
+.highlight .n { color: #3A3A3A; }
+.highlight .c { color: #999988; font-style: italic } /* Comment */
+.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
+.highlight .k { font-weight: bold; } /* Keyword */
+.highlight .o { font-weight: bold; } /* Operator */
+.highlight .cm { color: #999988; font-style: italic } /* Comment.Multiline */
+.highlight .cp { color: #999999; font-weight: bold } /* Comment.Preproc */
+.highlight .c1 { color: #999988; font-style: italic } /* Comment.Single */
+.highlight .cs { color: #999999; font-weight: bold; font-style: italic } /* Comment.Special */
+.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
+.highlight .gd .x { color: #000000; background-color: #ffaaaa } /* Generic.Deleted.Specific */
+.highlight .ge { font-style: italic } /* Generic.Emph */
+.highlight .gr { color: #aa0000 } /* Generic.Error */
+.highlight .gh { color: #999999 } /* Generic.Heading */
+.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
+.highlight .gi .x { color: #000000; background-color: #aaffaa } /* Generic.Inserted.Specific */
+.highlight .go { color: #888888 } /* Generic.Output */
+.highlight .gp { color: #555555 } /* Generic.Prompt */
+.highlight .gs { font-weight: bold } /* Generic.Strong */
+.highlight .gu { color: #aaaaaa } /* Generic.Subheading */
+.highlight .gt { color: #aa0000 } /* Generic.Traceback */
+.highlight .kc { font-weight: bold } /* Keyword.Constant */
+.highlight .kd { font-weight: bold } /* Keyword.Declaration */
+.highlight .kp { font-weight: bold } /* Keyword.Pseudo */
+.highlight .kr { font-weight: bold } /* Keyword.Reserved */
+.highlight .kt { color: #445588; font-weight: bold } /* Keyword.Type */
+.highlight .m { color: #009999 } /* Literal.Number */
+.highlight .s { color: #d14 } /* Literal.String */
+.highlight .na { color: #008080 } /* Name.Attribute */
+.highlight .nb { color: #0086B3 } /* Name.Builtin */
+.highlight .nc { color: #445588; font-weight: bold } /* Name.Class */
+.highlight .no { color: #008080 } /* Name.Constant */
+.highlight .ni { color: #800080 } /* Name.Entity */
+.highlight .ne { color: #990000; font-weight: bold } /* Name.Exception */
+.highlight .nf { color: #990000; font-weight: bold } /* Name.Function */
+.highlight .nn { color: #555555 } /* Name.Namespace */
+.highlight .nt { color: #000080 } /* Name.Tag */
+.highlight .nv { color: #008080 } /* Name.Variable */
+.highlight .ow { font-weight: bold } /* Operator.Word */
+.highlight .w { color: #bbbbbb } /* Text.Whitespace */
+.highlight .mf { color: #009999 } /* Literal.Number.Float */
+.highlight .mh { color: #009999 } /* Literal.Number.Hex */
+.highlight .mi { color: #009999 } /* Literal.Number.Integer */
+.highlight .mo { color: #009999 } /* Literal.Number.Oct */
+.highlight .sb { color: #d14 } /* Literal.String.Backtick */
+.highlight .sc { color: #d14 } /* Literal.String.Char */
+.highlight .sd { color: #d14 } /* Literal.String.Doc */
+.highlight .s2 { color: #d14 } /* Literal.String.Double */
+.highlight .se { color: #d14 } /* Literal.String.Escape */
+.highlight .sh { color: #d14 } /* Literal.String.Heredoc */
+.highlight .si { color: #d14 } /* Literal.String.Interpol */
+.highlight .sx { color: #d14 } /* Literal.String.Other */
+.highlight .sr { color: #009926 } /* Literal.String.Regex */
+.highlight .s1 { color: #d14 } /* Literal.String.Single */
+.highlight .ss { color: #990073 } /* Literal.String.Symbol */
+.highlight .bp { color: #999999 } /* Name.Builtin.Pseudo */
+.highlight .vc { color: #008080 } /* Name.Variable.Class */
+.highlight .vg { color: #008080 } /* Name.Variable.Global */
+.highlight .vi { color: #008080 } /* Name.Variable.Instance */
+.highlight .il { color: #009999 } /* Literal.Number.Integer.Long */
diff --git a/docs/documentation/head/media/css/table.css b/docs/documentation/head/media/css/table.css
new file mode 100644
index 0000000..cf2fd7d
--- /dev/null
+++ b/docs/documentation/head/media/css/table.css
@@ -0,0 +1,101 @@
+/*
+ PostgreSQL.org - Table Styles
+*/
+
+div.tblBasic h2 {
+ margin: 25px 0 .5em 0;
+}
+
+div.tblBasic table {
+ background: #F5F5F5 url(../img/layout/nav_tbl_top_lft.png) top left no-repeat;
+ margin-left: 2ex;
+ margin-bottom: 15px;
+}
+
+div.tblBasic table th {
+ padding-top: 20px;
+ border-bottom: 1px solid #EFEFEF;
+ vertical-align: bottom;
+}
+
+div.tblBasic table td {
+ border-bottom: 1px solid #EFEFEF;
+}
+
+div.tblBasic table th,
+div.tblBasic table td {
+ padding: 8px 11px;
+ color: #555555;
+}
+
+div.tblBasic table td.indented {
+ text-indent: 30px;
+}
+
+div.tblBasic table.tblCompact td {
+ padding: 3px 3px;
+}
+
+div.tblBasic table tr.lastrow td {
+ border-bottom: none;
+ padding-bottom: 13px;
+}
+
+div.tblBasic table.tblCompact tr.lastrow td {
+ padding-bottom: 3px;
+}
+
+div.tblBasic table tr.lastrow td.colFirstT,
+div.tblBasic table tr.lastrow td.colFirst {
+ background: url(../img/layout/nav_tbl_btm_lft.png) bottom left no-repeat;
+}
+
+div.tblBasic table.tblBasicGrey th.colLast,
+div.tblBasic table.tblCompact th.colLast {
+ background: #F5F5F5 url(../img/layout/nav_tbl_top_rgt.png) top right no-repeat;
+}
+
+div.tblBasic table.tblBasicGrey tr.lastrow td.colLastT,
+div.tblBasic table.tblBasicGrey tr.lastrow td.colLast,
+div.tblBasic table.tblCompact tr.lastrow td.colLast,
+div.tblBasic table.tblCompact tr.lastrow td.colLastT{
+ background: #F5F5F5 url(../img/layout/nav_tbl_btm_rgt.png) bottom right no-repeat;
+}
+
+div.tblBasic table.tblBasicGrey tr.firstrow td.colLastT,
+div.tblBasic table.tblBasicGrey tr.firstrow td.colLast,
+div tblBasic table.tblCompact tr.firstrow td.colLast {
+ background: #F5F5F5 url(../img/layout/nav_tbl_top_rgt.png) top right no-repeat;
+}
+
+div.tblBasic table th.colMid,
+div.tblBasic table td.colMid,
+div.tblBasic table th.colLast,
+div.tblBasic table td.colLast {
+ background-color: #F5F5F5 ;
+}
+
+div.tblBasic table th.colLastC,
+div.tblBasic table td.colFirstC,
+div.tblBasic table td.colLastC {
+ text-align: center;
+}
+
+div.tblBasic table th.colLastR,
+div.tblBasic table td.colFirstR,
+div.tblBasic table td.colLastR {
+ text-align: right;
+}
+
+div.tblBasic table td.colFirstT,
+div.tblBasic table td.colMidT,
+div.tblBasic table td.colLastT {
+ vertical-align: top;
+}
+
+div.tblBasic table th.colLastRT,
+div.tblBasic table td.colFirstRT,
+div.tblBasic table td.colLastRT {
+ text-align: right;
+ vertical-align: top;
+}
diff --git a/docs/documentation/head/media/css/text.css b/docs/documentation/head/media/css/text.css
new file mode 100644
index 0000000..902a118
--- /dev/null
+++ b/docs/documentation/head/media/css/text.css
@@ -0,0 +1,162 @@
+/*
+ PostgreSQL.org - Text Styles
+*/
+
+/* Heading Definitions */
+
+h1 {
+ color: #EC5800;
+}
+
+h2 {
+ color: #666;
+}
+
+h3 {
+ color: #666;
+}
+
+h4 {
+ color: #666;
+}
+
+/* Text Styles */
+
+.txtColumn1 {
+ width: 50%;
+ line-height: 1.3em;
+}
+
+.txtColumn2 {
+ width: 50%;
+ line-height: 1.5em;
+}
+
+.txtCurrentLocation {
+ font-weight: bold;
+}
+
+.txtDivider {
+ font-size: 0.8em;
+ color: #E1E1E1;
+ padding-left: 4px;
+ padding-right: 4px;
+}
+
+.txtNewsEvent {
+ font-size: 0.9em;
+ color: #0094C7;
+}
+
+.txtDate {
+ font-size: 0.9em;
+ color: #666;
+}
+
+.txtMediumGrey {
+ color: #666;
+}
+
+.txtFormLabel {
+ color: #666;
+ font-weight: bold;
+ text-align: right;
+ vertical-align: top;
+}
+
+.txtRequiredField {
+ color: #EC5800;
+}
+
+.txtImportant {
+ color: #EC5800;
+}
+
+.txtOffScreen {
+ position: absolute;
+ left: -1999px;
+ width: 1990px;
+}
+
+#txtFrontFeatureHeading {
+ padding-bottom: 1.1em;
+}
+
+#txtFrontFeatureLink a {
+ font-size: 1.2em;
+ font-weight: bold;
+ padding-left: 5px;
+}
+
+#txtFrontUserText {
+ font-size: 1.0em;
+ color: #666;
+ margin-top: 12px;
+}
+
+#txtFrontUserName {
+ font-size: 0.9em;
+ color: #666;
+ margin-top: 9px;
+ font-weight: bold;
+}
+
+#txtFrontUserLink {
+ font-size: 0.9em;
+ color: #666;
+ margin-top: 11px;
+ margin-left: 1px;
+}
+
+#txtFrontUserLink img {
+ padding-right: 5px;
+}
+
+#txtFrontSupportUsText {
+ font-size: 1.0em;
+ margin-top: 9px;
+}
+
+#txtFrontSupportUsLink {
+ font-size: 0.9em;
+ margin-top: 6px;
+}
+
+#txtFrontSupportUsLink img {
+ padding-right: 7px;
+}
+
+/* Link Styles */
+
+a:link { color:#0085B0; text-decoration: underline; }
+a:visited { color:#004E66; text-decoration: underline; }
+a:active { color:#0085B0; text-decoration: underline; }
+a:hover { color:#000000; text-decoration: underline; }
+
+#pgFooter a:link { color:#666; text-decoration: underline; }
+#pgFooter a:visited { color:#666; text-decoration: underline; }
+#pgFooter a:active { color:#666; text-decoration: underline; }
+#pgFooter a:hover { color:#000000; text-decoration: underline; }
+
+#txtFrontUserName a:link { color:#666; text-decoration: underline; }
+#txtFrontUserName a:visited { color:#666; text-decoration: underline; }
+#txtFrontUserName a:active { color:#666; text-decoration: underline; }
+#txtFrontUserName a:hover { color:#000; text-decoration: underline; }
+
+#txtArchives a:visited { color:#00536E; text-decoration: underline; }
+#txtArchives pre { word-wrap: break-word; font-size: 150%; }
+#txtArchives tt { word-wrap: break-word; font-size: 150%; }
+
+#pgFrontUSSContainer h2, #pgFrontUSSContainer h3 {
+ margin: 0;
+ padding: 0;
+}
+
+#pgFrontNewsEventsContainer h2, #pgFrontNewsEventsContainer h3 {
+ margin: 0;
+ padding: 0;
+}
+
+#pgFrontNewsEventsContainer h3 img {
+ margin-bottom: 10px;
+}
diff --git a/docs/documentation/head/media/favicon.ico b/docs/documentation/head/media/favicon.ico
new file mode 100644
index 0000000..a1cc036
Binary files /dev/null and b/docs/documentation/head/media/favicon.ico differ
diff --git a/docs/documentation/head/media/img/docs/bg_hdr.png b/docs/documentation/head/media/img/docs/bg_hdr.png
new file mode 100644
index 0000000..07c3b65
Binary files /dev/null and b/docs/documentation/head/media/img/docs/bg_hdr.png differ
diff --git a/docs/documentation/head/media/img/layout/hdr_left3a.png b/docs/documentation/head/media/img/layout/hdr_left3a.png
new file mode 100644
index 0000000..fb1f70d
Binary files /dev/null and b/docs/documentation/head/media/img/layout/hdr_left3a.png differ
diff --git a/docs/documentation/head/media/img/layout/nav_tbl_btm.png b/docs/documentation/head/media/img/layout/nav_tbl_btm.png
new file mode 100644
index 0000000..ec897af
Binary files /dev/null and b/docs/documentation/head/media/img/layout/nav_tbl_btm.png differ
diff --git a/docs/documentation/head/media/img/layout/nav_tbl_top.png b/docs/documentation/head/media/img/layout/nav_tbl_top.png
new file mode 100644
index 0000000..3a22368
Binary files /dev/null and b/docs/documentation/head/media/img/layout/nav_tbl_top.png differ
diff --git a/docs/documentation/head/outer-joins-escape.md b/docs/documentation/head/outer-joins-escape.md
new file mode 100644
index 0000000..b8eebb4
--- /dev/null
+++ b/docs/documentation/head/outer-joins-escape.md
@@ -0,0 +1,19 @@
+---
+layout: default_docs
+title: Escape for outer joins
+header: Chapter 8. JDBC escapes
+resource: media
+previoustitle: Chapter 8. JDBC escapes
+previous: escapes.html
+nexttitle: Date-time escapes
+next: escapes-datetime.html
+---
+
+You can specify outer joins using the following syntax: `{oj table (LEFT|RIGHT|FULL) OUTER JOIN (table | outer-join)
+ON search-condition }`
+
+For example :
+
+```java
+rs = stmt.executeQuery( "select * from {oj a left outer join b on (a.i=b.i)} ");
+```
diff --git a/docs/documentation/head/prepare.md b/docs/documentation/head/prepare.md
new file mode 100644
index 0000000..d57b525
--- /dev/null
+++ b/docs/documentation/head/prepare.md
@@ -0,0 +1,25 @@
+---
+layout: default_docs
+title: Preparing the Database Server for JDBC
+header: Chapter 2. Setting up the JDBC Driver
+resource: media
+previoustitle: Setting up the Class Path
+previous: classpath.html
+nexttitle: Creating a Database
+next: your-database.html
+---
+
+Because Java does not support using unix sockets the PostgreSQL™ server must be
+configured to allow TCP/IP connections. Starting with server version 8.0 TCP/IP
+connections are allowed from `localhost`. To allow connections to other interfaces
+than the loopback interface, you must modify the `postgresql.conf` file's `listen_addresses`
+setting.
+
+For server versions prior to 8.0 the server does not listen on any interface by
+default, and you must set `tcpip_socket = true` in the `postgresql.conf` file.
+
+Once you have made sure the server is correctly listening for TCP/IP connections
+the next step is to verify that users are allowed to connect to the server. Client
+authentication is setup in `pg_hba.conf`. Refer to the main PostgreSQL™ documentation
+for details. The JDBC driver supports the `trust`, `ident`, `password`, `md5`, and
+`crypt` authentication methods.
\ No newline at end of file
diff --git a/docs/documentation/head/query.md b/docs/documentation/head/query.md
new file mode 100644
index 0000000..d6fde7f
--- /dev/null
+++ b/docs/documentation/head/query.md
@@ -0,0 +1,123 @@
+---
+layout: default_docs
+title: Chapter 5. Issuing a Query and Processing the Result
+header: Chapter 5. Issuing a Query and Processing the Result
+resource: media
+previoustitle: Custom SSLSocketFactory
+previous: ssl-factory.html
+nexttitle: Using the Statement or PreparedStatement Interface
+next: statement.html
+---
+
+**Table of Contents**
+
+* [Getting results based on a cursor](query.html#query-with-cursor)
+* [Using the `Statement` or `PreparedStatement` Interface](statement.html)
+* [Using the `ResultSet` Interface](resultset.html)
+* [Performing Updates](update.html)
+* [Creating and Modifying Database Objects](ddl.html)
+* [Using Java 8 Date and Time classes](java8-date-time.html)
+
+Any time you want to issue SQL statements to the database, you require a `Statement`
+or `PreparedStatement` instance. Once you have a `Statement` or `PreparedStatement`,
+you can use issue a query. This will return a `ResultSet` instance, which contains
+the entire result (see the section called [“Getting results based on a cursor”](query.html#query-with-cursor)
+here for how to alter this behaviour). [Example 5.1, “Processing a Simple Query in JDBC”](query.html#query-example)
+illustrates this process.
+
+<a name="query-example"></a>
+**Example 5.1. Processing a Simple Query in JDBC**
+
+This example will issue a simple query and print out the first column of each
+row using a `Statement`.
+
+```java
+Statement st = conn.createStatement();
+ResultSet rs = st.executeQuery("SELECT * FROM mytable WHERE columnfoo = 500");
+while (rs.next())
+{
+ System.out.print("Column 1 returned ");
+ System.out.println(rs.getString(1));
+}
+rs.close();
+st.close();
+```
+
+This example issues the same query as before but uses a `PreparedStatement` and
+a bind value in the query.
+
+```java
+int foovalue = 500;
+PreparedStatement st = conn.prepareStatement("SELECT * FROM mytable WHERE columnfoo = ?");
+st.setInt(1, foovalue);
+ResultSet rs = st.executeQuery();
+while (rs.next())
+{
+ System.out.print("Column 1 returned ");
+ System.out.println(rs.getString(1));
+}
+rs.close();
+st.close();
+```
+
+<a name="query-with-cursor"></a>
+# Getting results based on a cursor
+
+By default the driver collects all the results for the query at once. This can
+be inconvenient for large data sets so the JDBC driver provides a means of basing
+a `ResultSet` on a database cursor and only fetching a small number of rows.
+
+A small number of rows are cached on the client side of the connection and when
+exhausted the next block of rows is retrieved by repositioning the cursor.
+
+### Note
+
+> Cursor based `ResultSets` cannot be used in all situations. There a number of
+ restrictions which will make the driver silently fall back to fetching the
+ whole `ResultSet` at once.
+
+* The connection to the server must be using the V3 protocol. This is the default
+ for (and is only supported by) server versions 7.4 and later.
+* The `Connection` must not be in autocommit mode. The backend closes cursors at
+ the end of transactions, so in autocommit mode the backend will have
+ closed the cursor before anything can be fetched from it.
+*The `Statement` must be created with a `ResultSet` type of `ResultSet.TYPE_FORWARD_ONLY`.
+ This is the default, so no code will need to be rewritten to take advantage
+ of this, but it also means that you cannot scroll backwards or otherwise
+ jump around in the `ResultSet`.
+* The query given must be a single statement, not multiple statements strung
+ together with semicolons.
+
+<a name="fetchsize-example"></a>
+**Example 5.2. Setting fetch size to turn cursors on and off.**
+
+Changing code to cursor mode is as simple as setting the fetch size of the
+`Statement` to the appropriate size. Setting the fetch size back to 0 will cause
+all rows to be cached (the default behaviour).
+
+```java
+// make sure autocommit is off
+conn.setAutoCommit(false);
+Statement st = conn.createStatement();
+
+// Turn use of the cursor on.
+st.setFetchSize(50);
+ResultSet rs = st.executeQuery("SELECT * FROM mytable");
+while (rs.next())
+{
+ System.out.print("a row was returned.");
+}
+rs.close();
+
+// Turn the cursor off.
+st.setFetchSize(0);
+rs = st.executeQuery("SELECT * FROM mytable");
+while (rs.next())
+{
+ System.out.print("many rows were returned.");
+}
+rs.close();
+
+// Close the statement.
+st.close();
+```
diff --git a/docs/documentation/head/reading.md b/docs/documentation/head/reading.md
new file mode 100644
index 0000000..1f6a8eb
--- /dev/null
+++ b/docs/documentation/head/reading.md
@@ -0,0 +1,18 @@
+---
+layout: default_docs
+title: Chapter 13. Further Reading
+header: Chapter 13. Further Reading
+resource: media
+previoustitle: Chapter 12. Logging with java.util.logging
+previous: logging.html
+nexttitle: The PostgreSQL™ JDBC Interface
+next: index.html
+---
+
+If you have not yet read it, you are advised you read the JDBC API Documentation
+(supplied with Oracle's JDK) and the JDBC Specification. Both are available from
+[http://www.oracle.com/technetwork/java/javase/jdbc/index.html](http://www.oracle.com/technetwork/java/javase/jdbc/index.html).
+
+[http://jdbc.postgresql.org/index.html](http://jdbc.postgresql.org/index.html)
+contains updated information not included in this manual including Javadoc class
+documentation and a FAQ. Additionally it offers precompiled drivers.
diff --git a/docs/documentation/head/replication.md b/docs/documentation/head/replication.md
new file mode 100644
index 0000000..5d821fb
--- /dev/null
+++ b/docs/documentation/head/replication.md
@@ -0,0 +1,363 @@
+---
+layout: default_docs
+title: Physical and Logical replication API
+header: Chapter 9. PostgreSQL™ Extensions to the JDBC API
+resource: media
+previoustitle: Server Prepared Statements
+previous: server-prepare.html
+nexttitle: Arrays
+next: arrays.html
+---
+
+**Table of Contents**
+
+* [Overview](replication.html#overview)
+* [Logical replication](replication.html#logical-replication)
+* [Physical replication](replication.html#physical-replication)
+
+<a name="overview"></a>
+# Overview
+
+Postgres 9.4 (released in December 2014) introduced a new feature called logical replication. Logical replication allows
+changes from a database to be streamed in real-time to an external system. The difference between physical replication and
+logical replication is that logical replication sends data over in a logical format whereas physical replication sends data over in a binary format. Additionally logical replication can send over a single table, or database. Binary replication replicates the entire cluster in an all or nothing fashion; which is to say there is no way to get a specific table or database using binary replication
+
+Prior to logical replication keeping an external system synchronized in real time was problematic. The application would have to update/invalidate the appropriate cache entries, reindex the data in your search engine, send it to your analytics system, and so on.
+This suffers from race conditions and reliability problems. For example if slightly different data gets written to two different datastores (perhaps due to a bug or a race condition),the contents of the datastores will gradually drift apart — they will become more and more inconsistent over time. Recovering from such gradual data corruption is difficult.
+
+Logical decoding takes the database’s write-ahead log (WAL), and gives us access to row-level change events:
+every time a row in a table is inserted, updated or deleted, that’s an event. Those events are grouped by transaction,
+and appear in the order in which they were committed to the database. Aborted/rolled-back transactions
+do not appear in the stream. Thus, if you apply the change events in the same order, you end up with an exact,
+transactionally consistent copy of the database. It's looks like the Event Sourcing pattern that you previously implemented
+in your application, but now it's available out of the box from the PostgreSQL database.
+
+For access to real-time changes PostgreSQL provides the streaming replication protocol. Replication protocol can be physical or logical. Physical replication protocol is used for Master/Secondary replication. Logical replication protocol can be used
+to stream changes to an external system.
+
+
+Since the JDBC API does not include replication `PGConnection` implements the PostgreSQL API
+
+## Configure database
+
+Your database should be configured to enable logical or physical replication
+
+### postgresql.conf
+
+* Property `max_wal_senders` should be at least equal to the number of replication consumers
+* Property `wal_keep_segments` should contain count wal segments that can't be removed from database.
+* Property `wal_level` for logical replication should be equal to `logical`.
+* Property `max_replication_slots` should be greater than zero for logical replication, because logical replication can't
+ work without replication slot.
+
+### pg_hba.conf
+
+Enable connect user with replication privileges to replication stream.
+
+```
+local replication all trust
+host replication all 127.0.0.1/32 md5
+host replication all ::1/128 md5
+```
+
+### Configuration for examples
+
+*postgresql.conf*
+
+```ini
+max_wal_senders = 4 # max number of walsender processes
+wal_keep_segments = 4 # in logfile segments, 16MB each; 0 disables
+wal_level = logical # minimal, replica, or logical
+max_replication_slots = 4 # max number of replication slots
+```
+
+*pg_hba.conf*
+
+```
+# Allow replication connections from localhost, by a user with the
+# replication privilege.
+local replication all trust
+host replication all 127.0.0.1/32 md5
+host replication all ::1/128 md5
+```
+
+<a name="logical-replication"></a>
+# Logical replication
+
+Logical replication uses a replication slot to reserve WAL logs on the server and also defines which decoding plugin to use to decode the WAL logs to the required format, for example you can decode changes as json, protobuf, etc. To demonstrate how to use the pgjdbc replication API we will use the `test_decoding` plugin that is include in the `postgresql-contrib` package, but you can use your own decoding plugin. There are a few on github which can be used as examples.
+
+In order to use the replication API, the Connection has to be created in replication mode, in this mode the connection is not available to
+execute SQL commands, and can only be used with replication API. This is a restriction imposed by PostgreSQL.
+
+**Example 9.4. Create replication connection.**
+
+```java
+ String url = "jdbc:postgresql://localhost:5432/postgres";
+ Properties props = new Properties();
+ PGProperty.USER.set(props, "postgres");
+ PGProperty.PASSWORD.set(props, "postgres");
+ PGProperty.ASSUME_MIN_SERVER_VERSION.set(props, "9.4");
+ PGProperty.REPLICATION.set(props, "database");
+ PGProperty.PREFER_QUERY_MODE.set(props, "simple");
+
+ Connection con = DriverManager.getConnection(url, props);
+ PGConnection replConnection = con.unwrap(PGConnection.class);
+```
+
+The entire replication API is grouped in `org.postgresql.replication.PGReplicationConnection` and is available
+via `org.postgresql.PGConnection#getReplicationAPI`.
+
+Before you can start replication protocol, you need to have replication slot, which can be also created via pgjdbc API.
+
+**Example 9.5. Create replication slot via pgjdbc API**
+
+```java
+ replConnection.getReplicationAPI()
+ .createReplicationSlot()
+ .logical()
+ .withSlotName("demo_logical_slot")
+ .withOutputPlugin("test_decoding")
+ .make();
+```
+
+Once we have the replication slot, we can create a ReplicationStream.
+
+**Example 9.6. Create logical replication stream.**
+
+```java
+ PGReplicationStream stream =
+ replConnection.getReplicationAPI()
+ .replicationStream()
+ .logical()
+ .withSlotName("demo_logical_slot")
+ .withSlotOption("include-xids", false)
+ .withSlotOption("skip-empty-xacts", true)
+ .start();
+```
+
+The replication stream will send all changes since the creation of the replication slot or from replication slot
+restart LSN if the slot was already used for replication. You can also start streaming changes from a particular LSN position,in that case LSN position should be specified when you create the replication stream.
+
+**Example 9.7. Create logical replication stream from particular position.**
+
+```java
+ LogSequenceNumber waitLSN = LogSequenceNumber.valueOf("6F/E3C53568");
+
+ PGReplicationStream stream =
+ replConnection.getReplicationAPI()
+ .replicationStream()
+ .logical()
+ .withSlotName("demo_logical_slot")
+ .withSlotOption("include-xids", false)
+ .withSlotOption("skip-empty-xacts", true)
+ .withStartPosition(waitLSN)
+ .start();
+```
+
+Via `withSlotOption` we also can specify options that will be sent to our output plugin, this allows customize decoding.
+For example I have my own output plugin that has a property `sensitive=true` which will include changes by sensitive columns to change
+event.
+
+**Example 9.8. Example output with include-xids=true**
+
+```
+BEGIN 105779
+table public.test_logic_table: INSERT: pk[integer]:1 name[character varying]:'previous value'
+COMMIT 105779
+```
+
+**Example 9.9. Example output with include-xids=false**
+
+```
+BEGIN
+table public.test_logic_table: INSERT: pk[integer]:1 name[character varying]:'previous value'
+COMMIT
+```
+
+During replication the database and consumer periodically exchange ping messages. When the database or client do not receive
+ping message within the configured timeout, replication has been deemed to have stopped and an exception will be thrown and the database will free resources. In PostgreSQL the ping timeout is configured by the property `wal_sender_timeout` (default = 60 seconds).
+Replication stream in pgjdc can be configured to send feedback(ping) when required or by time interval.
+It is recommended to send feedback(ping) to the database more often than configured `wal_sender_timeout`. In production I use value equal to `wal_sender_timeout / 3`. It's avoids a potential problems with networks and changes to be streamed without disconnects by timeout. To specify the feedback interval use `withStatusInterval` method.
+
+**Example 9.10. Replication stream with configured feedback interval equal to 20 sec**
+
+```java
+ PGReplicationStream stream =
+ replConnection.getReplicationAPI()
+ .replicationStream()
+ .logical()
+ .withSlotName("demo_logical_slot")
+ .withSlotOption("include-xids", false)
+ .withSlotOption("skip-empty-xacts", true)
+ .withStatusInterval(20, TimeUnit.SECONDS)
+ .start();
+```
+
+After create `PGReplicationStream`, it's time to start receive changes in real-time. Changes can be received from
+stream as blocking(`org.postgresql.replication.PGReplicationStream#read`)
+or as non-blocking(`org.postgresql.replication.PGReplicationStream#readPending`).
+Both methods receive changes as a `java.nio.ByteBuffer` with the payload from the send output plugin. We can't receive
+part of message, only the full message that was sent by the output plugin. ByteBuffer contains message in format that is defined by the decoding output plugin, it can be simple String, json, or whatever the plugin determines. That why pgjdbc returns the raw ByteBuffer instead of making assumptions.
+
+**Example 9.11. Example send message from output plugin.**
+
+```
+OutputPluginPrepareWrite(ctx, true);
+appendStringInfo(ctx->out, "BEGIN %u", txn->xid);
+OutputPluginWrite(ctx, true);
+```
+
+**Example 9.12. Receive changes via replication stream.**
+
+```java
+ while (true) {
+ //non blocking receive message
+ ByteBuffer msg = stream.readPending();
+
+ if (msg == null) {
+ TimeUnit.MILLISECONDS.sleep(10L);
+ continue;
+ }
+
+ int offset = msg.arrayOffset();
+ byte[] source = msg.array();
+ int length = source.length - offset;
+ System.out.println(new String(source, offset, length));
+ }
+```
+
+As mentioned previously, replication stream should periodically send feedback to the database to prevent disconnect via
+timeout. Feedback is automatically sent when `read` or `readPending` are called if it's time to send feedback. Feedback can also be sent via `org.postgresql.replication.PGReplicationStream#forceUpdateStatus()` regardless of the timeout. Another important duty of feedback is to provide the server with the Logial Sequence Number (LSN) that has been successfully received and applied to consumer, it is necessary for monitoring and to truncate/archive WAL's that that are no longer needed. In [...]
+
+The API provides the following feedback mechanism to indicate the successfully applied LSN by the current consumer. LSN's before this can be truncated or archived.
+`org.postgresql.replication.PGReplicationStream#setFlushedLSN` and
+`org.postgresql.replication.PGReplicationStream#setAppliedLSN`. You always can get last receive LSN via
+`org.postgresql.replication.PGReplicationStream#getLastReceiveLSN`.
+
+**Example 9.13. Add feedback indicating a successfully process LSN**
+
+```java
+ while (true) {
+ //Receive last successfully send to queue message. LSN ordered.
+ LogSequenceNumber successfullySendToQueue = getQueueFeedback();
+ if (successfullySendToQueue != null) {
+ stream.setAppliedLSN(successfullySendToQueue);
+ stream.setFlushedLSN(successfullySendToQueue);
+ }
+
+ //non blocking receive message
+ ByteBuffer msg = stream.readPending();
+
+ if (msg == null) {
+ TimeUnit.MILLISECONDS.sleep(10L);
+ continue;
+ }
+
+ asyncSendToQueue(msg, stream.getLastReceiveLSN());
+ }
+```
+
+**Example 9.14. Full example of logical replication**
+
+```java
+ String url = "jdbc:postgresql://localhost:5432/test";
+ Properties props = new Properties();
+ PGProperty.USER.set(props, "postgres");
+ PGProperty.PASSWORD.set(props, "postgres");
+ PGProperty.ASSUME_MIN_SERVER_VERSION.set(props, "9.4");
+ PGProperty.REPLICATION.set(props, "database");
+ PGProperty.PREFER_QUERY_MODE.set(props, "simple");
+
+ Connection con = DriverManager.getConnection(url, props);
+ PGConnection replConnection = con.unwrap(PGConnection.class);
+
+ replConnection.getReplicationAPI()
+ .createReplicationSlot()
+ .logical()
+ .withSlotName("demo_logical_slot")
+ .withOutputPlugin("test_decoding")
+ .make();
+
+ //some changes after create replication slot to demonstrate receive it
+ sqlConnection.setAutoCommit(true);
+ Statement st = sqlConnection.createStatement();
+ st.execute("insert into test_logic_table(name) values('first tx changes')");
+ st.close();
+
+ st = sqlConnection.createStatement();
+ st.execute("update test_logic_table set name = 'second tx change' where pk = 1");
+ st.close();
+
+ st = sqlConnection.createStatement();
+ st.execute("delete from test_logic_table where pk = 1");
+ st.close();
+
+ PGReplicationStream stream =
+ replConnection.getReplicationAPI()
+ .replicationStream()
+ .logical()
+ .withSlotName("demo_logical_slot")
+ .withSlotOption("include-xids", false)
+ .withSlotOption("skip-empty-xacts", true)
+ .withStatusInterval(20, TimeUnit.SECONDS)
+ .start();
+
+ while (true) {
+ //non blocking receive message
+ ByteBuffer msg = stream.readPending();
+
+ if (msg == null) {
+ TimeUnit.MILLISECONDS.sleep(10L);
+ continue;
+ }
+
+ int offset = msg.arrayOffset();
+ byte[] source = msg.array();
+ int length = source.length - offset;
+ System.out.println(new String(source, offset, length));
+
+ //feedback
+ stream.setAppliedLSN(stream.getLastReceiveLSN());
+ stream.setFlushedLSN(stream.getLastReceiveLSN());
+ }
+```
+
+Where output looks like this, where each line is a separate message.
+
+```
+BEGIN
+table public.test_logic_table: INSERT: pk[integer]:1 name[character varying]:'first tx changes'
+COMMIT
+BEGIN
+table public.test_logic_table: UPDATE: pk[integer]:1 name[character varying]:'second tx change'
+COMMIT
+BEGIN
+table public.test_logic_table: DELETE: pk[integer]:1
+COMMIT
+```
+
+<a name="physical-replication"></a>
+# Physical replication
+
+API for physical replication looks like the API for logical replication. Physical replication does not require a replication
+slot. And ByteBuffer will contain the binary form of WAL logs. The binary WAL format is a very low level API, and can change from version to version. That is why replication between different major PostgreSQL versions is not possible. But physical replication can contain many important data, that is not available via logical replication. That is why pgjdc contains an implementation for both.
+
+**Example 9.15. Use physical replication**
+
+```java
+ LogSequenceNumber lsn = getCurrentLSN();
+
+ Statement st = sqlConnection.createStatement();
+ st.execute("insert into test_physic_table(name) values('previous value')");
+ st.close();
+
+ PGReplicationStream stream =
+ pgConnection
+ .getReplicationAPI()
+ .replicationStream()
+ .physical()
+ .withStartPosition(lsn)
+ .start();
+
+ ByteBuffer read = stream.read();
+```
diff --git a/docs/documentation/head/resultset.md b/docs/documentation/head/resultset.md
new file mode 100644
index 0000000..58c5f5a
--- /dev/null
+++ b/docs/documentation/head/resultset.md
@@ -0,0 +1,19 @@
+---
+layout: default_docs
+title: Using the ResultSet Interface
+header: Chapter 5. Issuing a Query and Processing the Result
+resource: media
+previoustitle: Using the Statement or PreparedStatement Interface
+previous: statement.html
+nexttitle: Performing Updates
+next: update.html
+---
+
+The following must be considered when using the `ResultSet` interface:
+
+* Before reading any values, you must call `next()`. This returns true if there
+ is a result, but more importantly, it prepares the row for processing.
+* You must close a `ResultSet` by calling `close()` once you have finished using
+ it.
+* Once you make another query with the `Statement` used to create a `ResultSet`,
+ the currently open `ResultSet` instance is closed automatically.
\ No newline at end of file
diff --git a/docs/documentation/head/server-prepare.md b/docs/documentation/head/server-prepare.md
new file mode 100644
index 0000000..5c94942
--- /dev/null
+++ b/docs/documentation/head/server-prepare.md
@@ -0,0 +1,303 @@
+---
+layout: default_docs
+title: Server Prepared Statements
+header: Chapter 9. PostgreSQL™ Extensions to the JDBC API
+resource: media
+previoustitle: Listen / Notify
+previous: listennotify.html
+nexttitle: Physical and Logical replication API
+next: replication.html
+---
+
+### Motivation
+
+The PostgreSQL™ server allows clients to compile sql statements that are expected
+to be reused to avoid the overhead of parsing and planning the statement for every
+execution. This functionality is available at the SQL level via PREPARE and EXECUTE
+beginning with server version 7.3, and at the protocol level beginning with server
+version 7.4, but as Java developers we really just want to use the standard
+`PreparedStatement` interface.
+
+> PostgreSQL 9.2 release notes: prepared statements used to be optimized once, without any knowledge
+of the parameters' values. With 9.2, the planner will use specific plans regarding to the parameters
+sent (the query will be planned at execution), except if the query is executed several times and
+the planner decides that the generic plan is not too much more expensive than the specific plans.
+
+Server side prepared statements can improve execution speed as
+1. It sends just statement handle (e.g. `S_1`) instead of full SQL text
+1. It enables use of binary transfer (e.g. binary int4, binary timestamps, etc); the parameters and results are much faster to parse
+1. It enables the reuse server-side execution plan
+1. The client can reuse result set column definition, so it does not have to receive and parse metadata on each execution
+
+### Activation
+
+> Previous versions of the driver used PREPARE and EXECUTE to implement
+server-prepared statements. This is supported on all server versions beginning
+with 7.3, but produced application-visible changes in query results, such as
+missing ResultSet metadata and row update counts. The current driver uses the V3
+protocol-level equivalents which avoid these changes in query results.
+
+The driver uses server side prepared statements **by default** when `PreparedStatement` API is used.
+In order to get to server-side prepare, you need to execute the query 5 times (that can be
+configured via `prepareThreshold` connection property).
+An internal counter keeps track of how many times the statement has been executed and when it
+reaches the threshold it will start to use server side prepared statements.
+
+It is generally a good idea to reuse the same `PreparedStatement` object for performance reasons,
+however the driver is able to server-prepare statements automatically across `connection.prepareStatement(...)` calls.
+
+For instance:
+
+ PreparedStatement ps = con.prepareStatement("select /*test*/ ?::int4");
+ ps.setInt(1, 42);
+ ps.executeQuery().close();
+ ps.close();
+
+ PreparedStatement ps = con.prepareStatement("select /*test*/ ?::int4");
+ ps.setInt(1, 43);
+ ps.executeQuery().close();
+ ps.close();
+
+is less efficient than
+
+ PreparedStatement ps = con.prepareStatement("select /*test*/ ?::int4");
+ ps.setInt(1, 42);
+ ps.executeQuery().close();
+
+ ps.setInt(1, 43);
+ ps.executeQuery().close();
+
+however pgjdbc can use server side prepared statements in both cases.
+
+Note: the `Statement` object is bound to a `Connection`, and it is not a good idea to access the same
+`Statement` and/or `Connection` from multiple concurrent threads (except `cancel()`, `close()`, and alike cases). It might be safer to just `close()` the statement rather than trying to cache it somehow.
+
+Server-prepared statements consume memory both on the client and the server, so pgjdbc limits the number
+of server-prepared statements per connection. It can be configured via `preparedStatementCacheQueries`
+(default `256`, the number of queries known to pgjdbc), and `preparedStatementCacheSizeMiB` (default `5`,
+that is the client side cache size in megabytes per connection). Only a subset of `statement cache` is
+server-prepared as some of the statements might fail to reach `prepareThreshold`.
+
+### Deactivation
+
+There might be cases when you would want to disable use of server-prepared statements.
+For instance, if you route connections through a balancer that is incompatible with server-prepared statements,
+you have little choice.
+
+You can disable usage of server side prepared statements by setting `prepareThreshold=0`
+
+### Corner cases
+
+#### DDL
+
+V3 protocol avoids sending column metadata on each execution, and BIND message specifies output column format.
+That creates a problem for cases like
+
+ SELECT * FROM mytable;
+ ALTER mytable ADD column ...;
+ SELECT * FROM mytable;
+
+That results in `cached plan must not change result type` error, and it causes the transaction to fail.
+
+The recommendation is:
+1. Use explicit column names in the SELECT list
+1. Avoid column type alters
+
+#### DEALLOCATE ALL, DISCARD ALL
+
+There are explicit commands to deallocate all server side prepared statements. It would result in
+the following server-side error message: `prepared statement name is invalid`.
+Of course it could defeat pgjdbc, however there are cases when you need to discard statements (e.g. after lots of DDLs)
+
+The recommendation is:
+1. Use simple `DEALLOCATE ALL` and/or `DISCARD ALL` commands, avoid nesting the commands into pl/pgsql or alike. The driver does understand top-level DEALLOCATE/DISCARD commands, and it invalidates client-side cache as well
+1. Reconnect. The cache is per connection, so it would get invalidated if you reconnect
+
+#### set search_path=...
+
+PostgreSQL allows to customize `search_path`, and it provides great power to the developer.
+With great power the following case could happen:
+
+ set search_path='app_v1';
+ SELECT * FROM mytable;
+ set search_path='app_v2';
+ SELECT * FROM mytable; -- Does mytable mean app_v1.mytable or app_v2.mytable here?
+
+Server side prepared statements are linked to database object IDs, so it could fetch data from "old"
+`app_v1.mytable` table. It is hard to tell which behaviour is expected, however pgjdbc tries to track
+`search_path` changes, and it invalidates prepare cache accordingly.
+
+The recommendation is:
+1. Avoid changing `search_path` often, as it invalidates server side prepared statements
+1. Use simple `set search_path...` commands, avoid nesting the comands into pl/pgsql or alike, otherwise
+pgjdbc won't be able to identify `search_path` change
+
+#### Re-execution of failed statements
+
+It is a pity that a single `cached plan must not change result type` could cause the whole transaction to fail.
+The driver could re-execute the statement automatically in certain cases.
+
+1. In case the transaction has not failed (e.g. the transaction did not exist before execution of
+the statement that caused `cached plan...` error), then pgjdbc re-executes the statement automatically.
+This makes the application happy, and avoids unnecessary errors.
+1. In case the transaction is in a failed state, there's nothing to do but rollback it. pgjdbc does have
+"automatic savepoint" feature, and it could automatically rollback and retry the statement. The behaviour
+is controlled via `autosave` property (default `never`). The value of `conservative` would auto-rollback
+for the errors related to invalid server-prepared statements.
+Note: `autosave` might result in **severe** performance issues for long transactions, as PostgreSQL backend
+is not optimized for the case of long transactions and lots of savepoints.
+
+#### Replication connection
+
+PostgreSQL replication connection does not allow to use server side prepared statements, so pgjdbc
+uses simple queries in the case where `replication` connection property is activated.
+
+#### Use of server-prepared statements for con.createStatement()
+
+By default, pgjdbc uses server-prepard statements for `PreparedStatement` only, however you might want
+to activate server side prepared statements for regular `Statement` as well. For instance, if you
+execute the same statement through `con.createStatement().executeQuery(...)`, then you might improve
+performance by caching the statement. Of course it is better to use `PreparedStatements` explicitly,
+however the driver has an option to cache simple statements as well.
+
+You can do that by setting `preferQueryMode` to `extendedCacheEverything`.
+Note: the option is more of a diagnostinc/debugging sort, so be careful how you use it .
+
+#### Bind placeholder datatypes
+
+The database optimizes the execution plan for given parameter types.
+Consider the below case:
+
+ -- create table rooms (id int4, name varchar);
+ -- create index name__rooms on rooms(name);
+ PreparedStatement ps = con.prepareStatement("select id from rooms where name=?");
+ ps.setString(1, "42");
+
+It works as expected, however what would happen if one uses `setInt` instead?
+
+ ps.setInt(1, 42);
+
+Even though the result would be identical, the first variation (`setString` case) enables the database
+to use index `name__rooms`, and the latter does not.
+In case the database gets `42` as integer, it uses the plan like `where cast(name as int4) = ?`.
+
+The plan has to be specific for the (`SQL text`; `parameter types`) combination, so the driver
+has to invalidate server side prepared statements in case the statement is used with different
+parameter types.
+
+This gets especially painful for batch operations as you don't want to interrupt the batch
+by using alternating datatypes.
+
+The most typical case is as follows (don't ever use this in production):
+
+ PreparedStatement ps = con.prepareStatement("select id from rooms where ...");
+ if (param instanceof String) {
+ ps.setString(1, param);
+ } else if (param instanceof Integer) {
+ ps.setInt(1, ((Integer) param).intValue());
+ } else {
+ // Does it really matter which type of NULL to use?
+ // In fact, it does since data types specify which server-procedure to call
+ ps.setNull(1, Types.INTEGER);
+ }
+
+As you might guess, `setString` vs `setNull(..., Types.INTEGER)` result in alternating datatypes,
+and it forces the driver to invalidate and re-prepare server side statement.
+
+Recommendation is to use the consistent datatype for each bind placeholder, and use the same type
+for `setNull`.
+Check out `org.postgresql.test.jdbc2.PreparedStatementTest.testAlternatingBindType` example for more details.
+
+#### Debugging
+
+In case you run into `cached plan must not change result type` or `prepared statement \"S_2\" does not exist`
+the following might be helpful to debug the case.
+
+1. Client logging. If you add `loggerLevel=TRACE&loggerFile=pgjdbc-trace.log`, you would get trace
+of the messages send between the driver and the backend
+1. You might check `org.postgresql.test.jdbc2.AutoRollbackTestSuite` as it verifies lots of combinations
+
+<a name="server-prepared-statement-example"></a>
+**Example 9.3. Using server side prepared statements**
+
+```java
+import java.sql.*;
+
+public class ServerSidePreparedStatement
+{
+
+ public static void main(String args[]) throws Exception
+ {
+ Class.forName("org.postgresql.Driver");
+ String url = "jdbc:postgresql://localhost:5432/test";
+ Connection conn = DriverManager.getConnection(url,"test","");
+
+ PreparedStatement pstmt = conn.prepareStatement("SELECT ?");
+
+ // cast to the pg extension interface
+ org.postgresql.PGStatement pgstmt = pstmt.unwrap(org.postgresql.PGStatement.class);
+
+ // on the third execution start using server side statements
+ pgstmt.setPrepareThreshold(3);
+
+ for (int i=1; i<=5; i++)
+ {
+ pstmt.setInt(1,i);
+ boolean usingServerPrepare = pgstmt.isUseServerPrepare();
+ ResultSet rs = pstmt.executeQuery();
+ rs.next();
+ System.out.println("Execution: "+i+", Used server side: " + usingServerPrepare + ", Result: "+rs.getInt(1));
+ rs.close();
+ }
+
+ pstmt.close();
+ conn.close();
+ }
+}
+```
+
+Which produces the expected result of using server side prepared statements upon
+the third execution.
+
+```
+Execution: 1, Used server side: false, Result: 1
+Execution: 2, Used server side: false, Result: 2
+Execution: 3, Used server side: true, Result: 3
+Execution: 4, Used server side: true, Result: 4
+Execution: 5, Used server side: true, Result: 5
+```
+
+The example shown above requires the programmer to use PostgreSQL™ specific code
+in a supposedly portable API which is not ideal. Also it sets the threshold only
+for that particular statement which is some extra typing if we wanted to use that
+threshold for every statement. Let's take a look at the other ways to set the
+threshold to enable server side prepared statements. There is already a hierarchy
+in place above a `PreparedStatement`, the `Connection` it was created from, and
+above that the source of the connection be it a `Datasource` or a URL. The server
+side prepared statement threshold can be set at any of these levels such that
+the value will be the default for all of it's children.
+
+```java
+// pg extension interfaces
+org.postgresql.PGConnection pgconn;
+org.postgresql.PGStatement pgstmt;
+
+// set a prepared statement threshold for connections created from this url
+String url = "jdbc:postgresql://localhost:5432/test?prepareThreshold=3";
+
+// see that the connection has picked up the correct threshold from the url
+Connection conn = DriverManager.getConnection(url,"test","");
+pgconn = conn.unwrap(org.postgresql.PGConnection.class);
+System.out.println(pgconn.getPrepareThreshold()); // Should be 3
+
+// see that the statement has picked up the correct threshold from the connection
+PreparedStatement pstmt = conn.prepareStatement("SELECT ?");
+pgstmt = pstmt.unwrap(org.postgresql.PGStatement.class);
+System.out.println(pgstmt.getPrepareThreshold()); // Should be 3
+
+// change the connection's threshold and ensure that new statements pick it up
+pgconn.setPrepareThreshold(5);
+PreparedStatement pstmt = conn.prepareStatement("SELECT ?");
+pgstmt = pstmt.unwrap(org.postgresql.PGStatement.class);
+System.out.println(pgstmt.getPrepareThreshold()); // Should be 5
+```
diff --git a/docs/documentation/head/setup.md b/docs/documentation/head/setup.md
new file mode 100644
index 0000000..4668660
--- /dev/null
+++ b/docs/documentation/head/setup.md
@@ -0,0 +1,44 @@
+---
+layout: default_docs
+title: Chapter 2. Setting up the JDBC Driver
+header: Chapter 2. Setting up the JDBC Driver
+resource: media
+previoustitle: Chapter 1. Introduction
+previous: intro.html
+nexttitle: Setting up the Class Path
+next: classpath.html
+---
+
+**Table of Contents**
+
+* [Getting the Driver](setup.html#build)
+* [Setting up the Class Path](classpath.html)
+* [Preparing the Database Server for JDBC](prepare.html)
+* [Creating a Database](your-database.html)
+
+This section describes the steps you need to take before you can write or run
+programs that use the JDBC interface.
+
+<a name="build"></a>
+# Getting the Driver
+
+Precompiled versions of the driver can be downloaded from the [PostgreSQL™ JDBC web site](http://jdbc.postgresql.org).
+
+Alternatively you can build the driver from source, but you should only need to
+do this if you are making changes to the source code. To build the JDBC driver,
+you need Ant 1.5 or higher and a JDK. Ant is a special tool for building Java-based
+packages. It can be downloaded from the [Ant web site](http://ant.apache.org/index.html).
+
+If you have several Java compilers installed, it depends on the Ant configuration
+which one gets used. Precompiled Ant distributions are typically set up to read
+a file `.antrc` in the current user's home directory for configuration. For example,
+to use a different JDK than the default, this may work:
+
+`JAVA_HOME=/usr/local/jdk1.6.0_07`
+`JAVACMD=$JAVA_HOME/bin/java`
+
+To compile the driver simply run **ant** in the top level directory. The compiled
+driver will be placed in `jars/postgresql.jar`. The resulting driver will be built
+for the version of Java you are running. If you build with a 1.4 or 1.5 JDK you
+will build a version that supports the JDBC 3 specification and if you build with
+a 1.6 or higher JDK you will build a version that supports the JDBC 4 specification.
\ No newline at end of file
diff --git a/docs/documentation/head/ssl-client.md b/docs/documentation/head/ssl-client.md
new file mode 100644
index 0000000..a03001d
--- /dev/null
+++ b/docs/documentation/head/ssl-client.md
@@ -0,0 +1,70 @@
+---
+layout: default_docs
+title: Configuring the Client
+header: Chapter 4. Using SSL
+resource: media
+previoustitle: Chapter 4. Using SSL
+previous: ssl.html
+nexttitle: Custom SSLSocketFactory
+next: ssl-factory.html
+---
+
+Unlike psql and other libpq based programs the JDBC driver does server certificate
+validation by default. This means that when establishing a SSL connection the
+JDBC driver will validate the server's identity preventing "man in the middle"
+attacks. It does this by checking that the server certificate is signed by a
+trusted authority. If you have a certificate signed by a global certificate
+authority (CA), there is nothing further to do because Java comes with copies of
+the most common CA's certificates. If you are dealing with a self-signed certificate
+though, you need to make this available to the Java client to enable it to validate
+the server's certificate.
+
+> ### Note
+
+> Only the JDBC driver version 3 and greater supports SSL. The 1.4 JDK was the
+first version to come bundled with SSL support. Previous JDK versions that wanted
+to use SSL could make use of the additional JSSE library, but it does not support
+the full range of features utilized by the PostgreSQL™ JDBC driver.
+
+To make the server certificate available to Java, the first step is to convert
+it to a form Java understands.
+
+`openssl x509 -in server.crt -out server.crt.der -outform der`
+
+From here the easiest thing to do is import this certificate into Java's system
+truststore.
+
+`keytool -keystore $JAVA_HOME/lib/security/cacerts -alias postgresql -import -file server.crt.der`
+
+The default password for the cacerts keystore is `changeit`. The alias to postgresql
+is not important and you may select any name you desire.
+
+If you do not have access to the system cacerts truststore you can create your
+own truststore.
+
+`keytool -keystore mystore -alias postgresql -import -file server.crt.der`
+
+When starting your Java application you must specify this keystore and password
+to use.
+
+`java -Djavax.net.ssl.trustStore=mystore -Djavax.net.ssl.trustStorePassword=mypassword com.mycompany.MyApp`
+
+In the event of problems extra debugging information is available by adding
+`-Djavax.net.debug=ssl` to your command line.
+
+To instruct the JDBC driver to try and establish a SSL connection you must add
+the connection URL parameter `ssl=true`. See [SSL Connection parameters](connect.html#ssl)
+
+<a name="nonvalidating"></a>
+## Using SSL without Certificate Validation
+
+In some situations it may not be possible to configure your Java environment to
+make the server certificate available, for example in an applet. For a large
+scale deployment it would be best to get a certificate signed by recognized
+certificate authority, but that is not always an option. The JDBC driver provides
+an option to establish a SSL connection without doing any validation, but please
+understand the risk involved before enabling this option.
+
+A non-validating connection is established via a custom `SSLSocketFactory` class
+that is provided with the driver. Setting the connection URL parameter `sslfactory=org.postgresql.ssl.NonValidatingFactory`
+will turn off all SSL validation.
\ No newline at end of file
diff --git a/docs/documentation/head/ssl-factory.md b/docs/documentation/head/ssl-factory.md
new file mode 100644
index 0000000..a7e31ee
--- /dev/null
+++ b/docs/documentation/head/ssl-factory.md
@@ -0,0 +1,29 @@
+---
+layout: default_docs
+title: Custom SSLSocketFactory
+header: Chapter 4. Using SSL
+resource: media
+previoustitle: Configuring the Client
+previous: ssl-client.html
+nexttitle: Chapter 5. Issuing a Query and Processing the Result
+next: query.html
+---
+
+PostgreSQL™ provides a way for developers to customize how a SSL connection is
+established. This may be used to provide a custom certificate source or other
+extensions by allowing the developer to create their own `SSLContext` instance.
+The connection URL parameters `sslfactory` and `sslfactoryarg` allow the user
+to specify which custom class to use for creating the `SSLSocketFactory`. The
+class name specified by `sslfactory` must extend `javax.net.ssl.SSLSocketFactory`
+and be available to the driver's classloader. This class must have a zero argument
+constructor or a single argument constructor taking a String argument. This
+argument may optionally be supplied by `sslfactoryarg`.
+
+Information on how to actually implement such a class is beyond the scope of this
+documentation. Places to look for help are the [JSSE Reference Guide](https://docs.oracle.com/javase/8/docs/technotes/guides/security/jsse/JSSERefGuide.html)
+and the source to the `NonValidatingFactory` provided by the JDBC driver.
+
+The Java SSL API is not very well known to the JDBC driver developers and we
+would be interested in any interesting and generally useful extensions that you
+have implemented using this mechanism. Specifically it would be nice to be able
+to provide client certificates to be validated by the server.
diff --git a/docs/documentation/head/ssl.md b/docs/documentation/head/ssl.md
new file mode 100644
index 0000000..041306d
--- /dev/null
+++ b/docs/documentation/head/ssl.md
@@ -0,0 +1,35 @@
+---
+layout: default_docs
+title: Chapter 4. Using SSL
+header: Chapter 4. Using SSL
+resource: media
+previoustitle: Connecting to the Database
+previous: connect.html
+nexttitle: Configuring the Client
+next: ssl-client.html
+---
+
+**Table of Contents**
+
+* [Configuring the Server](ssl.html#ssl-server)
+* [Configuring the Client](ssl-client.html)
+ * [Using SSL without Certificate Validation](ssl-client.html#nonvalidating)
+* [Custom SSLSocketFactory](ssl-factory.html)
+
+<a name="ssl-server"></a>
+# Configuring the Server
+
+Configuring the PostgreSQL™ server for SSL is covered in the [main
+documentation](http://www.postgresql.org/docs/current/static/ssl-tcp.html),
+so it will not be repeated here. Before trying to access your SSL enabled
+server from Java, make sure you can get to it via **psql**. You should
+see output like the following if you have established a SSL connnection.
+
+```
+$ ./bin/psql -h localhost -U postgres
+psql (9.6.2)
+SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
+Type "help" for help.
+
+postgres=#
+```
diff --git a/docs/documentation/head/statement.md b/docs/documentation/head/statement.md
new file mode 100644
index 0000000..fc89495
--- /dev/null
+++ b/docs/documentation/head/statement.md
@@ -0,0 +1,31 @@
+---
+layout: default_docs
+title: Using the Statement or PreparedStatement Interface
+header: Chapter 5. Issuing a Query and Processing the Result
+resource: media
+previoustitle: Chapter 5. Issuing a Query and Processing the Result
+previous: query.html
+nexttitle: Using the ResultSet Interface
+next: resultset.html
+---
+
+The following must be considered when using the `Statement` or `PreparedStatement`
+interface:
+
+* You can use a single `Statement` instance as many times as you want. You could
+ create one as soon as you open the connection and use it for the connection's
+ lifetime. But you have to remember that only one `ResultSet` can exist
+ per `Statement` or `PreparedStatement` at a given time.
+* If you need to perform a query while processing a `ResultSet`, you can simply
+ create and use another `Statement`.
+* If you are using threads, and several are using the database, you must use a
+ separate `Statement` for each thread. Refer to [Chapter 10, *Using the Driver in a Multithreaded or a Servlet Environment*](thread.html)
+ if you are thinking of using threads, as it covers some important points.
+* When you are done using the `Statement` or `PreparedStatement` you should close
+ it.
+* In JDBC, the question mark (`?`) is the placeholder for the positional parameters of a `PreparedStatement`.
+ There are, however, a number of PostgreSQL operators that contain a question mark.
+ To keep such question marks in a SQL statement from being interpreted as positional parameters,
+ use two question marks (`??`) as escape sequence.
+ You can also use this escape sequence in a `Statement`, but that is not required.
+ Specifically only in a `Statement` a single (`?`) can be used as an operator.
diff --git a/docs/documentation/head/thread.md b/docs/documentation/head/thread.md
new file mode 100644
index 0000000..b1f7b7f
--- /dev/null
+++ b/docs/documentation/head/thread.md
@@ -0,0 +1,20 @@
+---
+layout: default_docs
+title: Chapter 10. Using the Driver in a Multithreaded or a Servlet Environment
+header: Chapter 10. Using the Driver in a Multithreaded or a Servlet Environment
+resource: media
+previoustitle: Server Prepared Statements
+previous: server-prepare.html
+nexttitle: Chapter 11. Connection Pools and Data Sources
+next: datasource.html
+---
+
+
+The PostgreSQL™ JDBC driver is not thread safe.
+The PostgreSQL server is not threaded. Each connection creates a new process on the server;
+as such any concurrent requests to the process would have to be serialized.
+The driver makes no guarantees that methods on connections are synchronized.
+It will be up to the caller to synchronize calls to the driver.
+
+A noteable exception is org/postgresql/jdbc/TimestampUtils.java which is threadsafe.
+
\ No newline at end of file
diff --git a/docs/documentation/head/tomcat.md b/docs/documentation/head/tomcat.md
new file mode 100644
index 0000000..18c6ab1
--- /dev/null
+++ b/docs/documentation/head/tomcat.md
@@ -0,0 +1,121 @@
+---
+layout: default_docs
+title: Tomcat setup
+header: Chapter 11. Connection Pools and Data Sources
+resource: media
+previoustitle: Applications DataSource
+previous: ds-ds.html
+nexttitle: Data Sources and JNDI
+next: jndi.html
+---
+
+### Note
+
+The postgresql.jar file must be placed in $CATALINA_HOME/common/lib in both
+Tomcat 4 and 5.
+
+The absolute easiest way to set this up in either tomcat instance is to use the
+admin web application that comes with Tomcat, simply add the datasource to the
+context you want to use it in.
+
+Setup for Tomcat 4 place the following inside the <Context> tag inside
+conf/server.xml
+
+```xml
+<Resource name="jdbc/postgres" scope="Shareable" type="javax.sql.DataSource"/>
+<ResourceParams name="jdbc/postgres">
+ <parameter>
+ <name>validationQuery</name>
+ <value>select version();</value>
+ </parameter>
+ <parameter>
+ <name>url</name>
+ <value>jdbc:postgresql://localhost/davec</value>
+ </parameter>
+ <parameter>
+ <name>password</name>
+ <value>davec</value>
+ </parameter>
+ <parameter>
+ <name>maxActive</name>
+ <value>4</value>
+ </parameter>
+ <parameter>
+ <name>maxWait</name>
+ <value>5000</value>
+ </parameter>
+ <parameter>
+ <name>driverClassName</name>
+ <value>org.postgresql.Driver</value>
+ </parameter>
+ <parameter>
+ <name>username</name>
+ <value>davec</value>
+ </parameter>
+ <parameter>
+ <name>maxIdle</name>
+ <value>2</value>
+ </parameter>
+</ResourceParams>
+```
+
+Setup for Tomcat 5, you can use the above method, except that it goes inside the
+<DefaultContext> tag inside the <Host> tag. eg. <Host> ... <DefaultContext> ...
+
+Alternatively there is a conf/Catalina/hostname/context.xml file. For example
+http://localhost:8080/servlet-example has a directory $CATALINA_HOME/conf/Catalina/localhost/servlet-example.xml file.
+Inside this file place the above xml inside the <Context> tag
+
+Then you can use the following code to access the connection.
+
+```java
+import javax.naming.*;
+import javax.sql.*;
+import java.sql.*;
+public class DBTest
+{
+
+ String foo = "Not Connected";
+ int bar = -1;
+
+ public void init()
+ {
+ try
+ {
+ Context ctx = new InitialContext();
+ if(ctx == null )
+ throw new Exception("Boom - No Context");
+
+ // /jdbc/postgres is the name of the resource above
+ DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/postgres");
+
+ if (ds != null)
+ {
+ Connection conn = ds.getConnection();
+
+ if(conn != null)
+ {
+ foo = "Got Connection "+conn.toString();
+ Statement stmt = conn.createStatement();
+ ResultSet rst = stmt.executeQuery("select id, foo, bar from testdata");
+
+ if(rst.next())
+ {
+ foo=rst.getString(2);
+ bar=rst.getInt(3);
+ }
+ conn.close();
+ }
+ }
+ }
+ catch(Exception e)
+ {
+ e.printStackTrace();
+ }
+ }
+
+ public String getFoo() { return foo; }
+
+ public int getBar() { return bar;}
+}
+```
diff --git a/docs/documentation/head/update.md b/docs/documentation/head/update.md
new file mode 100644
index 0000000..a1ee107
--- /dev/null
+++ b/docs/documentation/head/update.md
@@ -0,0 +1,32 @@
+---
+layout: default_docs
+title: Performing Updates
+header: Chapter 5. Issuing a Query and Processing the Result
+resource: media
+previoustitle: Using the ResultSet Interface
+previous: resultset.html
+nexttitle: Creating and Modifying Database Objects
+next: ddl.html
+---
+
+To change data (perform an `INSERT`, `UPDATE`, or `DELETE`) you use the
+`executeUpdate()` method. This method is similar to the method `executeQuery()`
+used to issue a `SELECT` statement, but it doesn't return a `ResultSet`; instead
+it returns the number of rows affected by the `INSERT`, `UPDATE`, or `DELETE`
+statement. [Example 5.3, “Deleting Rows in JDBC”](update.html#delete-example)
+illustrates the usage.
+
+<a name="delete-example"></a>
+**Example 5.3. Deleting Rows in JDBC**
+
+This example will issue a simple `DELETE` statement and print out the number of
+rows deleted.
+
+```java
+int foovalue = 500;
+PreparedStatement st = conn.prepareStatement("DELETE FROM mytable WHERE columnfoo = ?");
+st.setInt(1, foovalue);
+int rowsDeleted = st.executeUpdate();
+System.out.println(rowsDeleted + " rows deleted");
+st.close();
+```
diff --git a/docs/documentation/head/use.md b/docs/documentation/head/use.md
new file mode 100644
index 0000000..3d33376
--- /dev/null
+++ b/docs/documentation/head/use.md
@@ -0,0 +1,34 @@
+---
+layout: default_docs
+title: Chapter 3. Initializing the Driver
+header: Chapter 3. Initializing the Driver
+resource: media
+previoustitle: Creating a Database
+previous: your-database.html
+nexttitle: Chapter 3. Loading the Driver
+next: load.html
+---
+
+**Table of Contents**
+
+
+* [Importing JDBC](use.html#import)
+* [Loading the Driver](load.html)
+* [Connecting to the Databas](connect.html)
+ * [Connection Parameters](connect.html#connection-parameters)
+
+This section describes how to load and initialize the JDBC driver in your programs.
+
+<a name="import"></a>
+# Importing JDBC
+
+Any source that uses JDBC needs to import the `java.sql` package, using:
+
+```java
+import java.sql.*;
+```
+
+### Note
+
+You should not import the `org.postgresql` package unless you are not using standard
+PostgreSQL™ extensions to the JDBC API.
diff --git a/docs/documentation/head/your-database.md b/docs/documentation/head/your-database.md
new file mode 100644
index 0000000..e809e74
--- /dev/null
+++ b/docs/documentation/head/your-database.md
@@ -0,0 +1,20 @@
+---
+layout: default_docs
+title: Creating a Database
+header: Chapter 2. Setting up the JDBC Driver
+resource: media
+previoustitle: Preparing the Database Server for JDBC
+previous: prepare.html
+nexttitle: Chapter 3. Initializing the Driver
+next: use.html
+---
+
+When creating a database to be accessed via JDBC it is important to select an
+appropriate encoding for your data. Many other client interfaces do not care
+what data you send back and forth, and will allow you to do inappropriate things,
+but Java makes sure that your data is correctly encoded. Do not use a database
+that uses the `SQL_ASCII` encoding. This is not a real encoding and you will
+have problems the moment you store data in it that does not fit in the seven
+bit ASCII character set. If you do not know what your encoding will be or are
+otherwise unsure about what you will be storing the `UNICODE` encoding is a
+reasonable default to use.
\ No newline at end of file
diff --git a/docs/documentation/pgjdbc_changelog-8.0-8.4.tar.gz b/docs/documentation/pgjdbc_changelog-8.0-8.4.tar.gz
new file mode 100644
index 0000000..15b7e8f
Binary files /dev/null and b/docs/documentation/pgjdbc_changelog-8.0-8.4.tar.gz differ
diff --git a/docs/download.md b/docs/download.md
new file mode 100644
index 0000000..7c26bb7
--- /dev/null
+++ b/docs/download.md
@@ -0,0 +1,404 @@
+---
+layout: downloads
+title: PostgreSQL JDBC Download
+resource: media
+nav:
+---
+
+# Download
+***
+* [About](#about)
+* [Current Version](#current)
+* [Supported Versions](#supported)
+* [Other Versions](#others)
+* [Archived Versions](#archived)
+
+***
+<a name="about"></a>
+## About
+
+Binary JAR file downloads of the JDBC driver are available here
+and the current version with [Maven Repository](http://search.maven.org/#search%7Cga%7C1%7Cg%3A%22org.postgresql%22%20AND%20a%3A%22postgresql%22).
+Because Java is platform neutral, it is a simple process of just
+downloading the appropriate JAR file and dropping it into your
+classpath. Source versions are also available here for recent
+driver versions.
+
+{% for post in site.categories.new_release limit:1 %}
+{% capture current_version %}{{ post.version }}{% endcapture %}
+{% endfor %}
+
+***
+<a name="current"></a>
+## Current Version *{{ current_version }}*
+
+This is the current version of the driver. Unless you have unusual
+requirements (running old applications or JVMs), this is the driver
+you should be using. It supports PostgreSQL 8.2 or newer and
+requires Java 6 or newer. It contains support for SSL and the
+javax.sql package.
+
+* If you are using Java 8 or newer then you should use the JDBC 4.2 version.
+* If you are using Java 7 then you should use the JDBC 4.1 version.
+* If you are using Java 6 then you should use the JDBC 4.0 version.
+* If you are using a Java version older than 6 then
+you will need to use a JDBC3 version of the driver, which will by
+necessity not be current, found in [Other Versions](#others).
+
+[PostgreSQL JDBC 4.2 Driver, {{ current_version }}](download/postgresql-{{ current_version }}.jar)
+
+[PostgreSQL JDBC 4.1 Driver, {{ current_version }}.jre7](download/postgresql-{{ current_version }}.jre7.jar)
+
+[PostgreSQL JDBC 4.0 Driver, {{ current_version }}.jre6](download/postgresql-{{ current_version }}.jre6.jar)
+
+
+***
+<a name="others"></a>
+## Other Versions
+
+Many other versions of the JDBC driver are available. This includes
+development versions, compatibility with older JDKs, and previous
+versions of the driver.
+
+To determine JDK/JVM compatibility this following list matches up
+versions of the JVM with the JDBC specification implemented.
+
+* JDK 1.1 - JDBC 1. Note that with the 8.0
+ release JDBC 1 support has been removed, so look to update your
+ JDK when you update your server.
+* JDK 1.2, 1.3 - JDBC 2.
+* JDK 1.3 + J2EE - JDBC 2 EE. This contains additional support
+ for javax.sql classes.
+* JDK 1.4, 1.5 - JDBC 3. This contains support
+ for SSL and javax.sql, but does not require J2EE as it has been
+ added to the J2SE release.
+* JDK 6 - JDBC 4.0 Support for JDBC4 methods is not complete,
+ but the majority of methods are implemented.
+* JDK 7 - JDBC 4.1 Support for JDBC4 methods is not complete,
+ but the majority of methods are implemented.
+* JDK 8 - JDBC 4.2 Support for JDBC4 methods is not complete,
+ but the majority of methods are implemented.
+
+<br/>
+<div class="tblBasic">
+<table class="tblBasicGrey" style="width: 100%;" summary="Other Versions" border="1" cellspacing="0" cellpadding="0">
+<tr>
+ <th>Version</th>
+ <th>JDBC 4.0</th>
+ <th>JDBC 4.1</th>
+ <th>JDBC 4.2</th>
+ <th>Source</th>
+</tr>
+
+{% for post in site.categories.new_release %}
+{% capture ver %}{{ post.version }}{% endcapture %}
+<tr>
+ <td>{{ ver }}</td>
+ <td><a href="download/postgresql-{{ ver }}.jre6.jar">{{ ver }} JDBC 4</a></td>
+ <td><a href="download/postgresql-{{ ver }}.jre7.jar">{{ ver }} JDBC 41</a></td>
+ <td><a href="download/postgresql-{{ ver }}.jar">{{ ver }} JDBC 42</a></td>
+ <td><a href="download/postgresql-jdbc-{{ ver }}.src.tar.gz">{{ ver }} JDBC Source</a></td>
+</tr>
+{% endfor %}
+
+<tr>
+ <td>9.4.1212</td>
+ <td><a href="download/postgresql-9.4.1212.jre6.jar">9.4.1212 JDBC 4</a></td>
+ <td><a href="download/postgresql-9.4.1212.jre7.jar">9.4.1212 JDBC 41</a></td>
+ <td><a href="download/postgresql-9.4.1212.jar">9.4.1212 JDBC 42</a></td>
+ <td><a href="download/postgresql-jdbc-9.4.1212.src.tar.gz">9.4.1212 JDBC Source</a></td>
+</tr>
+
+<tr>
+ <td>9.4.1211</td>
+ <td><a href="download/postgresql-9.4.1211.jre6.jar">9.4.1211 JDBC 4</a></td>
+ <td><a href="download/postgresql-9.4.1211.jre7.jar">9.4.1211 JDBC 41</a></td>
+ <td><a href="download/postgresql-9.4.1211.jar">9.4.1211 JDBC 42</a></td>
+ <td><a href="download/postgresql-jdbc-9.4.1211.src.tar.gz">9.4.1211 JDBC Source</a></td>
+</tr>
+
+<tr>
+ <td>9.4.1210</td>
+ <td><a href="download/postgresql-9.4.1210.jre6.jar">9.4.1210 JDBC 4</a></td>
+ <td><a href="download/postgresql-9.4.1210.jre7.jar">9.4.1210 JDBC 41</a></td>
+ <td><a href="download/postgresql-9.4.1210.jar">9.4.1210 JDBC 42</a></td>
+ <td><a href="download/postgresql-jdbc-9.4.1210.src.tar.gz">9.4.1210 JDBC Source</a></td>
+</tr>
+
+<tr>
+ <td>9.4.1209</td>
+ <td><a href="download/postgresql-9.4.1209.jre6.jar">9.4.1209 JDBC 4</a></td>
+ <td><a href="download/postgresql-9.4.1209.jre7.jar">9.4.1209 JDBC 41</a></td>
+ <td><a href="download/postgresql-9.4.1209.jar">9.4.1209 JDBC 42</a></td>
+ <td><a href="download/postgresql-jdbc-9.4.1209.src.tar.gz">9.4.1209 JDBC Source</a></td>
+</tr>
+
+<tr>
+ <td>9.4.1208</td>
+ <td><a href="download/postgresql-9.4.1208.jre6.jar">9.4.1208 JDBC 4</a></td>
+ <td><a href="download/postgresql-9.4.1208.jre7.jar">9.4.1208 JDBC 41</a></td>
+ <td><a href="download/postgresql-9.4.1208.jar">9.4.1208 JDBC 42</a></td>
+ <td><a href="download/postgresql-jdbc-9.4-1208.src.tar.gz">9.4.1208 JDBC Source</a></td>
+</tr>
+
+<tr>
+ <td>9.4.1207</td>
+ <td><a href="download/postgresql-9.4.1207.jre6.jar">9.4.1207 JDBC 4</a></td>
+ <td><a href="download/postgresql-9.4.1207.jre7.jar">9.4.1207 JDBC 41</a></td>
+ <td><a href="download/postgresql-9.4.1207.jar">9.4.1207 JDBC 42</a></td>
+ <td><a href="download/postgresql-jdbc-9.4-1207.src.tar.gz">9.4.1207 JDBC Source</a></td>
+</tr>
+<tr>
+ <td>9.4 Build 1206</td>
+ <td><a href="download/postgresql-9.4-1206-jdbc4.jar">9.4-1206 JDBC 4</a></td>
+ <td><a href="download/postgresql-9.4-1206-jdbc41.jar">9.4-1206 JDBC 41</a></td>
+ <td><a href="download/postgresql-9.4-1206-jdbc42.jar">9.4-1206 JDBC 42</a></td>
+ <td><a href="download/postgresql-jdbc-9.4-1206.src.tar.gz">9.4-1206 JDBC Source</a></td>
+</tr>
+<tr>
+ <td>9.4 Build 1205</td>
+ <td><a href="download/postgresql-9.4-1205.jdbc4.jar">9.4-1205 JDBC 4</a></td>
+ <td><a href="download/postgresql-9.4-1205.jdbc41.jar">9.4-1205 JDBC 41</a></td>
+ <td><a href="download/postgresql-9.4-1205.jdbc42.jar">9.4-1205 JDBC 42</a></td>
+ <td><a href="download/postgresql-jdbc-9.4-1205.src.tar.gz">9.4-1205 JDBC Source</a></td>
+</tr>
+<tr>
+ <td>9.4 Build 1204</td>
+ <td><a href="download/postgresql-9.4-1204.jdbc4.jar">9.4-1204 JDBC 4</a></td>
+ <td><a href="download/postgresql-9.4-1204.jdbc41.jar">9.4-1204 JDBC 41</a></td>
+ <td><a href="download/postgresql-9.4-1204.jdbc42.jar">9.4-1204 JDBC 42</a></td>
+ <td><a href="download/postgresql-jdbc-9.4-1204.src.tar.gz">9.4-1204 JDBC Source</a></td>
+</tr>
+<tr>
+ <td>9.4 Build 1203</td>
+ <td><a href="download/postgresql-9.4-1203.jdbc4.jar">9.4-1203 JDBC 4</a></td>
+ <td><a href="download/postgresql-9.4-1203.jdbc41.jar">9.4-1203 JDBC 41</a></td>
+ <td><a href="download/postgresql-9.4-1203.jdbc42.jar">9.4-1203 JDBC 42</a></td>
+ <td><a href="download/postgresql-jdbc-9.4-1203.src.tar.gz">9.4-1203 JDBC Source</a></td>
+</tr>
+<tr>
+ <td>9.4 Build 1202</td>
+ <td><a href="download/postgresql-9.4-1202.jdbc4.jar">9.4-1202 JDBC 4</a></td>
+ <td><a href="download/postgresql-9.4-1202.jdbc41.jar">9.4-1202 JDBC 41</a></td>
+ <td><a href="download/postgresql-9.4-1202.jdbc42.jar">9.4-1202 JDBC 42</a></td>
+ <td><a href="download/postgresql-jdbc-9.4-1202.src.tar.gz">9.4-1202 JDBC Source</a></td>
+</tr>
+</table>
+</div>
+
+***
+<a name="archived"></a>
+## Archived Versions
+
+<div class="tblBasic">
+<table class="tblBasicGrey" style="width: 100%;" summary="Archived Versions" border="1" cellspacing="0" cellpadding="0">
+<tr>
+ <th>Version</th>
+ <th>JDBC 2</th>
+ <th>JDBC 2 EE</th>
+ <th>JDBC 3</th>
+ <th>JDBC 4</th>
+ <th>JDBC 41</th>
+ <th>Source</th>
+</tr>
+
+<tr>
+ <td>9.3 Build 1104</td>
+ <td> </td>
+ <td> </td>
+ <td> </td>
+ <td><a href="download/postgresql-9.3-1104.jdbc4.jar">9.3-1104 JDBC 4</a></td>
+ <td><a href="download/postgresql-9.3-1104.jdbc41.jar">9.3-1104 JDBC 41</a></td>
+ <td><a href="download/postgresql-jdbc-9.3-1104.src.tar.gz">9.3-1104 JDBC Source</a></td>
+</tr>
+
+<tr>
+ <td>9.3 Build 1103</td>
+ <td> </td>
+ <td> </td>
+ <td><a href="download/postgresql-9.3-1103.jdbc3.jar">9.3-1103 JDBC 3</a></td>
+ <td><a href="download/postgresql-9.3-1103.jdbc4.jar">9.3-1103 JDBC 4</a></td>
+ <td><a href="download/postgresql-9.3-1103.jdbc41.jar">9.3-1103 JDBC 41</a></td>
+ <td><a href="download/postgresql-jdbc-9.3-1103.src.tar.gz">9.3-1103 JDBC Source</a></td>
+</tr>
+<tr>
+ <td>9.2 Build 1004</td>
+ <td> </td>
+ <td> </td>
+ <td><a href="download/postgresql-9.2-1004.jdbc3.jar">9.2-1004 JDBC 3</a></td>
+ <td><a href="download/postgresql-9.2-1004.jdbc4.jar">9.2-1004 JDBC 4</a></td>
+ <td><a href="download/postgresql-9.2-1004.jdbc41.jar">9.2-1004 JDBC 41</a></td>
+ <td><a href="download/postgresql-jdbc-9.2-1004.src.tar.gz">9.2-1004 JDBC Source</a></td>
+</tr>
+<tr>
+ <td>9.1 Build 903</td>
+ <td> </td>
+ <td> </td>
+ <td><a href="download/postgresql-9.1-903.jdbc3.jar">9.1-903 JDBC 3</a></td>
+ <td><a href="download/postgresql-9.1-903.jdbc4.jar">9.1-903 JDBC 4</a></td>
+ <td> </td>
+ <td><a href="download/postgresql-jdbc-9.1-903.src.tar.gz">9.1-903 JDBC Source</a></td>
+</tr>
+<tr>
+ <td>9.0 Build 802</td>
+ <td> </td>
+ <td> </td>
+ <td><a href="download/postgresql-9.0-802.jdbc3.jar">9.0-802 JDBC 3</a></td>
+ <td><a href="download/postgresql-9.0-802.jdbc4.jar">9.0-802 JDBC 4</a></td>
+ <td> </td>
+ <td><a href="download/postgresql-jdbc-9.0-802.src.tar.gz">9.0-802 JDBC Source</a></td>
+</tr>
+<tr>
+ <td>8.4 Build 703</td>
+ <td> </td>
+ <td> </td>
+ <td><a href="download/postgresql-8.4-703.jdbc3.jar">8.4-703 JDBC 3</a></td>
+ <td><a href="download/postgresql-8.4-703.jdbc4.jar">8.4-703 JDBC 4</a></td>
+ <td> </td>
+ <td><a href="download/postgresql-jdbc-8.4-703.src.tar.gz">8.4-703 JDBC Source</a></td>
+</tr>
+<tr>
+ <td>8.3 Build 607</td>
+ <td><a href="download/postgresql-8.3-607.jdbc2.jar">8.3-607 JDBC 2</a></td>
+ <td><a href="download/postgresql-8.3-607.jdbc2ee.jar">8.3-607 JDBC 2EE</a></td>
+ <td><a href="download/postgresql-8.3-607.jdbc3.jar">8.3-607 JDBC 3</a></td>
+ <td><a href="download/postgresql-8.3-607.jdbc4.jar">8.3-607 JDBC 4</a></td>
+ <td> </td>
+ <td><a href="download/postgresql-jdbc-8.3-607.src.tar.gz">8.3-607 JDBC Source</a></td>
+</tr>
+<tr>
+ <td>8.2 Build 512</td>
+ <td><a href="download/postgresql-8.2-512.jdbc2.jar">8.2-512 JDBC 2</a></td>
+ <td><a href="download/postgresql-8.2-512.jdbc2ee.jar">8.2-512 JDBC 2EE</a></td>
+ <td><a href="download/postgresql-8.2-512.jdbc3.jar">8.2-512 JDBC 3</a></td>
+ <td><a href="download/postgresql-8.2-512.jdbc4.jar">8.2-512 JDBC 4</a></td>
+ <td> </td>
+ <td><a href="download/postgresql-jdbc-8.2-512.src.tar.gz">8.2-512 JDBC Source</a></td>
+</tr>
+</table>
+</div>
+
+<div class="tblBasic">
+<table class="tblBasicGrey" style="width: 100%;" summary="Older Versions" border="1" cellspacing="0" cellpadding="0">
+<tr>
+ <th>Version</th>
+ <th>JDBC 1</th>
+ <th>JDBC 2</th>
+ <th>JDBC 2 EE</th>
+ <th>JDBC 3</th>
+ <th>Source</th>
+</tr>
+<tr>
+ <td>8.1 Build 415</td>
+ <td> </td>
+ <td><a href="download/postgresql-8.1-415.jdbc2.jar">8.1-415 JDBC 2</a></td>
+ <td><a href="download/postgresql-8.1-415.jdbc2ee.jar">8.1-415 JDBC 2EE</a></td>
+ <td><a href="download/postgresql-8.1-415.jdbc3.jar">8.1-415 JDBC 3</a></td>
+ <td><a href="download/postgresql-jdbc-8.1-415.src.tar.gz">8.1-415 JDBC Source</a></td>
+</tr>
+<tr>
+ <td>8.0 Build 325</td>
+ <td> </td>
+ <td><a href="download/postgresql-8.0-325.jdbc2.jar">8.0-325 JDBC 2</a></td>
+ <td><a href="download/postgresql-8.0-325.jdbc2ee.jar">8.0-325 JDBC 2EE</a></td>
+ <td><a href="download/postgresql-8.0-325.jdbc3.jar">8.0-325 JDBC 3</a></td>
+ <td><a href="download/postgresql-jdbc-8.0-325.src.tar.gz">8.0-325 JDBC Source</a></td>
+</tr>
+<tr>
+ <td>7.4 Build 216</td>
+ <td><a href="download/pg74.216.jdbc1.jar">pg74.216.jdbc1.jar</a></td>
+ <td><a href="download/pg74.216.jdbc2.jar">pg74.216.jdbc2.jar</a></td>
+ <td><a href="download/pg74.216.jdbc2ee.jar">pg74.216.jdbc2ee.jar</a></td>
+ <td><a href="download/pg74.216.jdbc3.jar">pg74.216.jdbc3.jar</a></td>
+ <td> </td>
+</tr>
+<tr>
+ <td>7.3 Build 113</td>
+ <td><a href="download/pg73jdbc1.jar">pg73jdbc1.jar</a></td>
+ <td><a href="download/pg73jdbc2.jar">pg73jdbc2.jar</a></td>
+ <td><a href="download/pg73jdbc2ee.jar">pg73jdbc2ee.jar</a></td>
+ <td><a href="download/pg73jdbc3.jar">pg73jdbc3.jar</a></td>
+ <td> </td>
+</tr>
+<tr>
+ <td>7.2</td>
+ <td><a href="download/pg72jdbc1.jar">pg72jdbc1.jar</a></td>
+ <td><a href="download/pg72jdbc2.jar">pg72jdbc2.jar</a></td>
+ <td> </td>
+ <td> </td>
+ <td> </td>
+</tr>
+<tr>
+ <td>7.1</td>
+ <td><a href="download/jdbc7.1-1.1.jar">jdbc7.1-1.1.jar</a></td>
+ <td><a href="download/jdbc7.1-1.2.jar">jdbc7.1-1.2.jar</a></td>
+ <td> </td>
+ <td> </td>
+ <td> </td>
+</tr>
+<tr>
+ <td>7.0</td>
+ <td><a href="download/jdbc7.0-1.1.jar">jdbc7.0-1.1.jar</a></td>
+ <td><a href="download/jdbc7.0-1.2.jar">jdbc7.0-1.2.jar</a></td>
+ <td> </td>
+ <td> </td>
+ <td> </td>
+</tr>
+<tr>
+ <td>6.5.2</td>
+ <td><a href="download/jdbc6.5-1.1.jar">jdbc6.5-1.1.jar</a></td>
+ <td><a href="download/jdbc6.5-1.2.jar">jdbc6.5-1.2.jar</a></td>
+ <td> </td>
+ <td> </td>
+ <td> </td>
+</tr>
+<tr>
+ <td>6.4</td>
+ <td><a href="download/jdbc6.4.jar">jdbc6.4.jar</a></td>
+ <td> </td>
+ <td> </td>
+ <td> </td>
+ <td> </td>
+</tr>
+<tr>
+ <td>6.3</td>
+ <td><a href="download/jdbc6.3.jar">jdbc6.3.jar</a></td>
+ <td> </td>
+ <td> </td>
+ <td> </td>
+ <td> </td>
+</tr>
+<tr>
+ <td>6.2.1</td>
+ <td> </td>
+ <td> </td>
+ <td> </td>
+ <td> </td>
+ <td><a href="download/jdbc6.2.1.tgz">jdbc6.2.1.tgz</a></td>
+</tr>
+<tr>
+<td>0.4</td>
+ <td> </td>
+ <td> </td>
+ <td> </td>
+ <td> </td>
+ <td><a href="download/JavaPostgres95-0.4.tar.gz">JavaPostgres95-0.4.tar.gz</a></td>
+</tr>
+<tr>
+ <td>0.3</td>
+ <td> </td>
+ <td> </td>
+ <td> </td>
+ <td> </td>
+ <td><a href="download/JavaPostgres95-0.3.tar.gz">JavaPostgres95-0.3.tar.gz</a></td>
+</tr>
+<tr>
+ <td>0.2</td>
+ <td> </td>
+ <td> </td>
+ <td> </td>
+ <td> </td>
+ <td><a href="download/JavaPostgres95-0.2.tar.gz">JavaPostgres95-0.2.tar.gz</a></td>
+</tr>
+</table>
+</div>
diff --git a/docs/index.html b/docs/index.html
new file mode 100644
index 0000000..54d4f96
--- /dev/null
+++ b/docs/index.html
@@ -0,0 +1,67 @@
+---
+layout: default
+title: PostgreSQL JDBC Driver
+resource: media
+nav:
+---
+
+<br />
+<div id="pgFrontContainer">
+ <div id="pgFrontMain">
+ <div id="pgFrontFeature">
+ <div id="pgFrontFeatureContent">
+ {% for post in site.posts offset: 0 limit: 3 %}
+ <p class="txtDate"><strong>{{ post.date | date_to_long_string }}</strong></p>
+ <h1 id="txtFrontFeatureHeading">{{ post.title }}</h1>
+ <div>{{ post.excerpt | prepend: "<!--start-->" | split: "<!--start-->" | last }}</div>
+ <br/>
+ <p>See full <a href="documentation/changelog.html#version_{{ post.version}}">changelog for {{ post.version}}</a>
+ <hr />
+ {% endfor %}
+ <p><br/><br/>
+ The PostgreSQL JDBC group would like to thank YourKit<br/>for graciously providing licenses to the project.<br/>
+ <img src="https://www.yourkit.com/images/yklogo.png" />
+ </p>
+ </div> <!-- pgFrontFeatureContent -->
+ </div> <!-- pgFrontFeature -->
+ </div> <!-- pgFrontMain -->
+</div> <!-- pgFrontContainer -->
+<div id="pgFrontRightContainer">
+ <div id="pgFrontLatestReleases">
+ <h2><img src="media/img/hdr/hdr_latestreleases.png" alt="Latest Releases" width="120" height="10"></h2>
+ <div id="pgFrontLatestReleasesWrap">
+ {% for post in site.posts offset: 0 limit: 5 %}
+ <b>{{ post.version}}</b> · {{ post.date | date_to_string }} · <a href="documentation/changelog.html#version_{{ post.version}}">Notes</a>
+ <br/>
+ {% endfor %}
+ </div>
+ <div id="pgFrontLatestReleasesNote">
+ <b><a href="download.html">Downloads</a></b>
+ |
+ <a href="https://oss.sonatype.org/content/repositories/snapshots/org/postgresql/postgresql/">Snapshots</a>
+ </div>
+ </div> <!-- pgFrontLatestreleases -->
+ <div id="pgFrontShortcuts">
+ <h2><img src="media/img/hdr/hdr_shortcuts.png" alt="Shortcuts" width="85" height="10"></h2>
+ <div id="pgFrontShortcutsWrap">
+ <ul id="pgFrontShortcutsList">
+ <li><a href="https://github.com/pgjdbc/pgjdbc">GitHub project</a></li>
+ <li><a href="documentation/head/index.html">Documentation</a></li>
+ <li><a href="https://www.postgresql.org/list/pgsql-jdbc/">Mailing list</a></li>
+ <li><a href="https://github.com/pgjdbc/pgjdbc/issues/new">Report a bug</a></li>
+ <li><a href="documentation/faq.html">FAQ</a></li>
+ </ul>
+ </div> <!-- pgFrontShortcutsWrap -->
+ </div> <!-- pgFrontShortcuts -->
+ <div id="pgFrontSupportUs">
+ <h2><img src="media/img/hdr/hdr_supportus.png" alt="Support Us" width="81" height="10"></h2>
+ <div id="pgFrontSupportUsWrap">
+ <div id="txtFrontSupportUsText">
+ PostgreSQL is free. Please support our work by making a <a href="https://www.postgresql.org/about/donate">donation</a>.
+ </div>
+ </div>
+ </div>
+ <div>
+ <img height="90" alt="" style="display: block; margin: 0 auto; padding-top: 30px;" src="/media/img/slonik_duke.png" />
+ </div>
+</div> <!-- pgFrontRightContainer -->
diff --git a/docs/media/css/base.css b/docs/media/css/base.css
new file mode 100644
index 0000000..66eec85
--- /dev/null
+++ b/docs/media/css/base.css
@@ -0,0 +1,7 @@
+ at import url("global.css");
+ at import url("layout.css");
+ at import url("text.css");
+ at import url("navigation.css");
+ at import url("table.css");
+
+ at import url("iefixes.css");
diff --git a/docs/media/css/docs.css b/docs/media/css/docs.css
new file mode 100644
index 0000000..436570f
--- /dev/null
+++ b/docs/media/css/docs.css
@@ -0,0 +1,448 @@
+/* PostgreSQL.org Documentation Style */
+
+ at import url("global.css");
+ at import url("table.css");
+ at import url("text.css");
+
+body {
+ font-size: 76%;
+}
+
+div.NAVHEADER table {
+ margin-left: 0;
+}
+
+/* Container Definitions */
+
+#docContainerWrap {
+ text-align: center; /* Win IE5 */
+}
+
+#docContainer {
+ margin: 0 auto;
+ width: 90%;
+ padding-bottom: 2em;
+ display: block;
+ text-align: left; /* Win IE5 */
+}
+
+#docHeader {
+ background-image: url("media/img/docs/bg_hdr.png");
+ height: 83px;
+ margin: 0px;
+ padding: 0px;
+ display: block;
+}
+
+#docHeaderLogo {
+ position: relative;
+ width: 206px;
+ height: 83px;
+ border: 0px;
+ padding: 0px;
+ margin: 0 0 0 20px;
+}
+
+#docHeaderLogo img {
+ border: 0px;
+}
+
+#docNavSearchContainer {
+ padding-bottom: 2px;
+}
+
+#docNav, #docVersions {
+ position: relative;
+ text-align: left;
+ margin-left: 10px;
+ margin-top: 5px;
+ color: #666;
+ font-size: 0.95em;
+}
+
+#docSearch {
+ position: relative;
+ text-align: right;
+ padding: 0;
+ margin: 0;
+ color: #666;
+}
+
+#docTextSize {
+ text-align: right;
+ white-space: nowrap;
+ margin-top: 7px;
+ font-size: 0.95em;
+}
+
+#docSearch form {
+ position: relative;
+ top: 5px;
+ right: 0;
+ margin: 0; /* need for IE 5.5 OSX */
+ text-align: right; /* need for IE 5.5 OSX */
+ white-space: nowrap; /* for Opera */
+}
+
+#docSearch form label {
+ color: #666;
+ font-size: 0.95em;
+}
+
+#docSearch form input {
+ font-size: 0.95em;
+}
+
+#docSearch form #submit {
+ font-size: 0.95em;
+ background: #7A7A7A;
+ color: #fff;
+ border: 1px solid #7A7A7A;
+ padding: 1px 4px;
+}
+
+#docSearch form #q {
+ width: 170px;
+ font-size: 0.95em;
+ border: 1px solid #7A7A7A;
+ background: #E1E1E1;
+ color: #000000;
+ padding: 2px;
+}
+
+.frmDocSearch {
+ padding: 0;
+ margin: 0;
+ display: inline;
+}
+
+.inpDocSearch {
+ padding: 0;
+ margin: 0;
+ color: #000;
+}
+
+#docContent {
+ position: relative;
+ margin-left: 10px;
+ margin-right: 10px;
+ margin-top: 40px;
+}
+
+#docFooter {
+ position: relative;
+ font-size: 0.9em;
+ color: #666;
+ line-height: 1.3em;
+ margin-left: 10px;
+ margin-right: 10px;
+}
+
+#docComments {
+ margin-top: 10px;
+}
+
+#docClear {
+ clear: both;
+ margin: 0;
+ padding: 0;
+}
+
+/* Heading Definitions */
+
+h1, h2, h3 {
+ font-weight: bold;
+ margin-top: 2ex;
+}
+
+h1 {
+ font-size: 1.4em;
+}
+
+h2 {
+ font-size: 1.2em !important;
+}
+
+h3 {
+ font-size: 1.1em;
+}
+
+h1 a:hover {
+ color: #EC5800;
+ text-decoration: none;
+}
+
+h2 a:hover,
+h3 a:hover,
+h4 a:hover {
+ color: #666666;
+ text-decoration: none;
+}
+
+/* Text Styles */
+
+div.SECT2 {
+ margin-top: 4ex;
+}
+
+div.SECT3 {
+ margin-top: 3ex;
+ margin-left: 3ex;
+}
+
+.txtCurrentLocation {
+ font-weight: bold;
+}
+
+p, ol, ul, li {
+ line-height: 1.5em;
+}
+
+.txtCommentsWrap {
+ border: 2px solid #F5F5F5;
+ width: 100%;
+}
+
+.txtCommentsContent {
+ background: #F5F5F5;
+ padding: 3px;
+}
+
+.txtCommentsPoster {
+ float: left;
+}
+
+.txtCommentsDate {
+ float: right;
+}
+
+.txtCommentsComment {
+ padding: 3px;
+}
+
+#docContainer pre code,
+#docContainer pre tt,
+#docContainer pre pre,
+#docContainer tt tt,
+#docContainer tt code,
+#docContainer tt pre {
+ font-size: 1em;
+}
+
+pre.LITERALLAYOUT,
+.SCREEN,
+.SYNOPSIS,
+.PROGRAMLISTING,
+.REFSYNOPSISDIV p,
+table.CAUTION,
+table.WARNING,
+blockquote.NOTE,
+blockquote.TIP,
+table.CALSTABLE {
+ -moz-box-shadow: 3px 3px 5px #DFDFDF;
+ -webkit-box-shadow: 3px 3px 5px #DFDFDF;
+ -khtml-box-shadow: 3px 3px 5px #DFDFDF;
+ -o-box-shadow: 3px 3px 5px #DFDFDF;
+ box-shadow: 3px 3px 5px #DFDFDF;
+}
+
+pre.LITERALLAYOUT,
+.SCREEN,
+.SYNOPSIS,
+.PROGRAMLISTING,
+.REFSYNOPSISDIV p,
+table.CAUTION,
+table.WARNING,
+blockquote.NOTE,
+blockquote.TIP {
+ color: black;
+ border-width: 1px;
+ border-style: solid;
+ padding: 2ex;
+ margin: 2ex 0 2ex 2ex;
+ overflow: auto;
+ -moz-border-radius: 8px;
+ -webkit-border-radius: 8px;
+ -khtml-border-radius: 8px;
+ border-radius: 8px;
+}
+
+pre.LITERALLAYOUT,
+pre.SYNOPSIS,
+pre.PROGRAMLISTING,
+.REFSYNOPSISDIV p,
+.SCREEN {
+ border-color: #CFCFCF;
+ background-color: #F7F7F7;
+}
+
+blockquote.NOTE,
+blockquote.TIP {
+ border-color: #DBDBCC;
+ background-color: #EEEEDD;
+ padding: 14px;
+ width: 572px;
+}
+
+blockquote.NOTE,
+blockquote.TIP,
+table.CAUTION,
+table.WARNING {
+ margin: 4ex auto;
+}
+
+blockquote.NOTE p,
+blockquote.TIP p {
+ margin: 0;
+}
+
+blockquote.NOTE pre,
+blockquote.NOTE code,
+blockquote.TIP pre,
+blockquote.TIP code {
+ margin-left: 0;
+ margin-right: 0;
+ -moz-box-shadow: none;
+ -webkit-box-shadow: none;
+ -khtml-box-shadow: none;
+ -o-box-shadow: none;
+ box-shadow: none;
+}
+
+.emphasis,
+.c2 {
+ font-weight: bold;
+}
+
+.REPLACEABLE {
+ font-style: italic;
+}
+
+/* Table Styles */
+
+table {
+ margin-left: 2ex;
+}
+
+table.CALSTABLE td,
+table.CALSTABLE th,
+table.CAUTION td,
+table.CAUTION th,
+table.WARNING td,
+table.WARNING th {
+ border-style: solid;
+}
+
+table.CALSTABLE,
+table.CAUTION,
+table.WARNING {
+ border-spacing: 0;
+ border-collapse: collapse;
+}
+
+table.CALSTABLE
+{
+ margin: 2ex 0 2ex 2ex;
+ background-color: #E0ECEF;
+ border: 2px solid #A7C6DF;
+}
+
+table.CALSTABLE tr:hover td
+{
+ background-color: #EFEFEF;
+}
+
+table.CALSTABLE td {
+ background-color: #FFF;
+}
+
+table.CALSTABLE td,
+table.CALSTABLE th {
+ border: 1px solid #A7C6DF;
+ padding: 0.5ex 0.5ex;
+}
+
+table.CAUTION,
+table.WARNING {
+ border-collapse: separate;
+ display: block;
+ padding: 0;
+ max-width: 600px;
+}
+
+table.CAUTION {
+ background-color: #F5F5DC;
+ border-color: #DEDFA7;
+}
+
+table.WARNING {
+ background-color: #FFD7D7;
+ border-color: #DF421E;
+}
+
+table.CAUTION td,
+table.CAUTION th,
+table.WARNING td,
+table.WARNING th {
+ border-width: 0;
+ padding-left: 2ex;
+ padding-right: 2ex;
+}
+
+table.CAUTION td,
+table.CAUTION th {
+ border-color: #F3E4D5
+}
+
+table.WARNING td,
+table.WARNING th {
+ border-color: #FFD7D7;
+}
+
+td.c1,
+td.c2,
+td.c3,
+td.c4,
+td.c5,
+td.c6 {
+ font-size: 1.1em;
+ font-weight: bold;
+ border-bottom: 0px solid #FFEFEF;
+ padding: 1ex 2ex 0;
+}
+
+/* Link Styles */
+
+#docNav a {
+ font-weight: bold;
+}
+
+a:link,
+a:visited,
+a:active,
+a:hover {
+ text-decoration: underline;
+}
+
+a:link,
+a:active {
+ color:#0066A2;
+}
+
+a:visited {
+ color:#004E66;
+}
+
+a:hover {
+ color:#000000;
+}
+
+#docFooter a:link,
+#docFooter a:visited,
+#docFooter a:active {
+ color:#666;
+}
+
+#docContainer code.FUNCTION tt {
+ font-size: 1em;
+}
diff --git a/docs/media/css/docs_large.css b/docs/media/css/docs_large.css
new file mode 100644
index 0000000..c421648
--- /dev/null
+++ b/docs/media/css/docs_large.css
@@ -0,0 +1,17 @@
+/* PostgreSQL Documentation Style - Large Text Version */
+
+ at import url("docs.css");
+
+body {
+ font-size: 93%;
+}
+
+#pgTopNav,
+#pgTopNavLeft,
+#pgTopNavRight {
+ height: 57px;
+}
+
+#pgTopNavList {
+ line-height: 1.8em;
+}
diff --git a/docs/media/css/global.css b/docs/media/css/global.css
new file mode 100644
index 0000000..1706e11
--- /dev/null
+++ b/docs/media/css/global.css
@@ -0,0 +1,98 @@
+/*
+ PostgreSQL.org - Global Styles
+*/
+
+body {
+ margin: 0;
+ padding: 0;
+ font-family: verdana, sans-serif;
+ font-size: 69%;
+ color: #000;
+ background-color: #fff;
+}
+
+h1 {
+ font-size: 1.4em;
+ font-weight: bold;
+ margin-top: 0em;
+ margin-bottom: 0em;
+}
+
+h2 {
+ font-size: 1.2em;
+ margin: 1.2em 0em 1.2em 0em;
+ font-weight: bold;
+}
+
+h3 {
+ font-size: 1.0em;
+ margin: 1.2em 0em 1.2em 0em;
+ font-weight: bold;
+}
+
+h4 {
+ font-size: 0.95em;
+ margin: 1.2em 0em 1.2em 0em;
+ font-weight: normal;
+}
+
+h5 {
+ font-size: 0.9em;
+ margin: 1.2em 0em 1.2em 0em;
+ font-weight: normal;
+}
+
+h6 {
+ font-size: 0.85em;
+ margin: 1.2em 0em 1.2em 0em;
+ font-weight: normal;
+}
+
+img {
+ border: 0;
+}
+
+ol, ul, li {/*
+ list-style: none;*/
+ font-size: 1.0em;
+ line-height: 1.2em;
+ margin-top: 0.2em;
+ margin-bottom: 0.1em;
+}
+
+p {
+ font-size: 1.0em;
+ line-height: 1.2em;
+ margin: 1.2em 0em;
+}
+
+td p {
+ margin: 0em 0em 1.2em;
+}
+
+li > p {
+ margin-top: 0.2em;
+}
+
+pre {
+ font-family: monospace;
+ font-size: 1.0em;
+}
+
+div#pgContentWrap code {
+ font-size: 1.2em;
+ padding: 1em;
+ margin: 2ex 0 2ex 2ex;
+ background: #F7F7F7;
+ border: 1px solid #CFCFCF;
+ -moz-border-radius: 8px;
+ -webkit-border-radius: 8px;
+ -khtml-border-radius: 8px;
+ border-radius: 8px;
+ display: block;
+ overflow: auto;
+}
+
+strong, b {
+ font-weight: bold;
+}
diff --git a/docs/media/css/iefixes.css b/docs/media/css/iefixes.css
new file mode 100644
index 0000000..8601bc1
--- /dev/null
+++ b/docs/media/css/iefixes.css
@@ -0,0 +1,138 @@
+/*
+ PostgreSQL.org - Fixes for Internet Explorer
+*/
+
+/*Win IE fix \*/
+* html #pgHeaderContainer { height: 1%; }
+
+/*End Win IE fix*/
+
+/*Win IE fix \*/
+* html #pgHeader { height: 1%; }
+
+/*End Win IE fix*/
+
+/*Win IE fix \*/
+* html #pgTopNav { height: 1%; margin-top: 0px; }
+
+/*End Win IE fix*/
+
+/*Win IE fix \*/
+* html #pgTopNavLeft { height: 1%; }
+
+/*End Win IE fix*/
+
+/*Win IE fix \*/
+* html #pgTopNavRight { height: 1%; }
+
+/*End Win IE fix*/
+
+/*Win IE fix \*/
+* html #pgTopNavList { height: 1%; margin-bottom: -2px; }
+* html #pgTopNavList li { margin: 0 0.5em 0 -0.5em; }
+
+/*End Win IE fix*/
+
+
+/*Win IE fix \*/
+* html #pgSearchNavList { height: 1%; margin-right: 0.5em; }
+* html #pgSearchNavList li { margin: 0 0 0 0.5em; }
+
+/*End Win IE fix*/
+
+/*Win IE fix \*/
+* html #pgContent { height: 1%; }
+
+/*End Win IE fix*/
+
+/*Win IE fix \*/
+* html #pgFrontContainer { height: 1%; }
+
+/*End Win IE fix*/
+
+/*Win IE fix \*/
+* html #pgFrontMain { height: 1%; }
+
+/*End Win IE fix*/
+
+/*Win IE fix \*/
+* html #pgFrontFeature { height: 1%; }
+
+/*End Win IE fix*/
+
+/*Win IE fix \*/
+* html #pgFrontFeatureLink { height: 1%; }
+
+/*End Win IE fix*/
+
+/*Win IE fix \*/
+* html #pgFrontNewsEventsContainer { height: 1%; }
+
+/*End Win IE fix*/
+
+/*Win IE fix \*/
+* html #pgFrontNews { height: 1%; }
+
+/*End Win IE fix*/
+
+/*Win IE fix \*/
+* html #pgFrontEvents { height: 1%; }
+
+/*End Win IE fix*/
+
+/*Win IE fix \*/
+* html .pgNewsEventsList { height: 1%; }
+
+/*End Win IE fix*/
+
+/*Win IE fix \*/
+* html #pgFrontUSSContainer { height: 1%; }
+
+/*End Win IE fix*/
+
+/*Win IE fix \*/
+* html #pgFrontUser { height: 1%; }
+
+/*End Win IE fix*/
+
+/*Win IE fix \*/
+* html #pgFrontSupportUs { height: 1%; }
+
+/*End Win IE fix*/
+
+/*Win IE fix \*/
+* html #pgFrontShortcuts { height: 1%; }
+
+/*End Win IE fix*/
+
+/*Win IE fix \*/
+* html #pgFrontShortcutsWrap { height: 1%; margin-top: 7px; }
+
+/*End Win IE fix*/
+
+/*Win IE fix \*/
+* html #pgFrontShortcutsList { height: 1%; }
+
+/*End Win IE fix*/
+
+/*Win IE fix \*/
+* html #pgFrontNewsEventsContainer h3 img { height: 1%; margin-bottom: 4px; }
+
+/*End Win IE fix*/
+
+/*Win IE fix \*/
+* html #pgSideWrap { /* margin-top: 11px; */ }
+/*End Win IE fix*/
+
+/*Win IE fix \*/
+* html #pgContentWrap {margin-left: 165px; /* margin-top: 11px; */ }
+/*End Win IE fix*/
+
+/*Win IE fix \*/
+* html #pgSideNav { height: 1%; position: static; }
+
+/*End Win IE fix*/
+
+/*Win IE fix \*/
+* html #txtArchives pre { font-size: 100%; }
+/*End Win IE fix*/
diff --git a/docs/media/css/layout.css b/docs/media/css/layout.css
new file mode 100644
index 0000000..bdbea13
--- /dev/null
+++ b/docs/media/css/layout.css
@@ -0,0 +1,688 @@
+/*
+ PostgreSQL.org - Layout Styles
+*/
+
+/* Container Definitions */
+
+/* Page Container */
+
+#pgContainerWrap {
+ text-align: center; /* Win IE5 */
+}
+
+#pgContainer {
+ margin: 0em auto;
+ width: 765px;
+ padding: 0;
+ padding-top: 4px;
+ padding-bottom: 10px;
+ text-align: left; /* Win IE5 */
+}
+
+
+/* Header Container */
+#pgHeaderContainer {
+ padding-bottom: 2px;
+}
+
+#pgHeader {
+ position: relative;
+ background: url("../img/layout/hdr_fill.png") repeat-x;
+ height: 80px;
+ margin: 0;
+ padding: 0;
+ clear: both;
+}
+
+#pgHeaderLogoLeft {
+ position: relative;
+ width: 390px;
+ height: 80px;
+ border: 0px;
+ padding: 0px;
+ margin: 0px;
+ float: left;
+}
+
+#pgHeaderLogoLeft img {
+ border: 0px;
+}
+
+#pgHeaderLogoRight {
+ position: relative;
+ width: 210px;
+ height: 80px;
+ border: 0px;
+ padding: 0px;
+ margin: 0px;
+ float: right;
+}
+
+#pgHeaderLogoRight img {
+ border: 0px;
+}
+
+#pgSearch {
+ position: relative;
+ text-align: right;
+ padding: 0;
+ margin: 0;
+ color: #666;
+}
+
+#pgSearch form {
+ position: relative;
+ top: 5px;
+ right: 0;
+ margin: 0; /* need for IE Mac */
+ text-align: right; /* need for IE Mac */
+ white-space: nowrap; /* for Opera */
+}
+
+#pgSearch form label {
+ color: #666;
+ font-size: 0.8em;
+}
+
+#pgSearch form input {
+ font-size: 0.8em;
+}
+
+#pgSearch form #submit,
+#pgSearch form #q {
+ font-size: 0.8em;
+ background: #FFFFFF;
+ color: #000000;
+ border: 1px solid #7A7A7A;
+}
+
+#pgSearch form #submit {
+
+ padding: 1px 4px;
+}
+
+#pgSearch form #q {
+ width: 140px;
+ padding: 2px;
+}
+
+/* Content Container */
+#pgContent {
+ clear: both;
+ display: block;
+}
+
+#pgFrontContainer {
+ width: 100%;
+ float: left;
+ margin-right: -220px;
+}
+
+#pgFrontMain {
+ margin-right: 220px;
+ margin-top: 10px;
+}
+
+#pgFrontFeature {
+ position: relative;
+ background: #F5F5F5 url(../img/feature/feature_gears.png) right bottom no-repeat;
+ /* Also see pgFrontFeatureContent for image size */
+ padding: 15px;
+ margin-bottom: 1em;
+ font-size: 1.0em;
+}
+
+#pgFrontFeature:before {
+ line-height: 0.1;
+ font-size: 1px;
+ background: transparent url("../img/layout/feature_tr.gif") no-repeat top right;
+ margin: -15px -15px 0 -15px;
+ height: 15px;
+ display: block;
+ border: none;
+ content: url("../img/layout/feature_tl.gif");
+}
+
+#pgFrontFeature:after {
+ display: block;
+ clear: both;
+ padding-top: 15px;
+ line-height: 0.1;
+ font-size: 1px;
+ content: url("../img/layout/feature_bl.gif");
+ margin: -15px;
+ height: 8px;
+ background: transparent url("../img/layout/feature_br.gif") scroll no-repeat bottom right ;
+}
+
+#pgFrontFeature h2{
+ border: none;
+ margin-top: 0;
+}
+
+#pgFrontFeature p {
+ margin: 0 0 1em 0;
+}
+
+#pgFrontFeature #pgFrontFeatureContent {
+ /* This padding controls the size of the text in the front blurb, and needs to be
+ * adjusted whenever the image is changed. */
+ padding: 6px 16px 16px 10px;
+}
+
+#pgFrontRightContainer {
+ float: right;
+ width: 200px;
+/* border-left: 1px solid #E1E1E1;*/
+ margin: 0;
+ padding: 0;
+
+ padding-left: 10px;
+}
+
+#pgFrontBottomContainer {
+ clear: both;
+ width: 100%;
+ padding-top: 0.7em;
+ margin-bottom: 15px;
+}
+
+#pgFrontNews {
+ float:left;
+ width: 230px;
+ margin-right: 10px;
+}
+
+#pgFrontEvents {
+ width: 240px;
+ border-left: 1px solid #E1E1E1;
+ margin: 0;
+ padding: 0;
+ padding-left: 10px;
+ margin-left: 250px;
+ margin-right: 250px;
+}
+
+.pgNewsEventsWrap {
+ padding-left: 5px;
+}
+
+.pgRSSBottomList {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+ display: inline;
+}
+
+.pgRSSBottomList img.pgRSSImage {
+ display: inline;
+ border: 0;
+ vertical-align: bottom;
+}
+
+.pgRSSBottomList li {
+ padding: 0 0.5em 0 0.5em;
+ display: inline;
+ border-right: 1px solid #E1E1E1;
+}
+
+.pgRSSBottomList li a {
+}
+
+/* Uncomment when IE/Validator supports last-child
+
+.pgRSSBottomList li:last-child {
+ border-right: 0;
+ padding-right: 0;
+}
+
+*/
+
+.pgRSSBottomList li.last-child {
+ border-right: 0;
+ padding-right: 0;
+}
+
+/* Used in pgRSSBottomList */
+img.pgArrowImage {
+ padding: 0;
+ margin: 0;
+ display: inline;
+ border: 0;
+}
+
+#pgFrontUSSContainer {
+}
+
+/* Featured User Box */
+
+#pgFrontUser {
+ width: 545px;
+ padding-top: 7px;
+ float: left;
+ background: url(../img/layout/usr_tbl_top.png) top right no-repeat;
+ margin-bottom: 15px;
+}
+
+#pgFrontUserInner {
+ background: url(../img/layout/usr_tbl_btm.png) bottom left no-repeat;
+ width: 100%;
+ padding-bottom: 7px;
+}
+
+#pgFrontUserWrap {
+ padding: 11px 14px 12px 15px;
+ border-left: 1px solid #DADADA;
+ border-right: 1px solid #DADADA;
+}
+
+#pgFrontUserContent {
+ margin-left: 4px;
+}
+
+#pgFrontSupportUs {
+}
+
+#pgFrontSupportUs h2 {
+ margin-bottom: 0.7em;
+}
+
+#pgFrontSupportUsWrap {
+ margin-left: 8px;
+ color: #666;
+}
+
+#pgFrontShortcuts h2 {
+ margin-bottom: 0.7em;
+}
+
+#pgFrontShortcutsWrap {
+ font-size: 0.9em;
+ margin-left: 12px;
+ margin-top: 10px;
+ color: #666;
+}
+
+#pgFrontShortcutsWrap img {
+ padding-right: 7px;
+}
+
+#pgFrontShortcutsList {
+ margin: 0;
+ padding: 0;
+ list-style: none;
+}
+
+#pgFrontShortcutsList li {
+ margin: 0;
+ padding-left: 12px;
+ background-image: url(../img/layout/blt_blu_arrow.png);
+ background-repeat: no-repeat;
+ background-position: 0px 0.5em;
+}
+
+#pgFrontPlanet {
+ float: right;
+ width: 230px;
+ border-left: 1px solid #E1E1E1;
+ margin: 0;
+ padding: 0;
+ padding-left: 10px;
+}
+
+#pgFrontPlanetWrap {
+ margin-left: 8px;
+ font-size: 0.9em;
+}
+
+#pgFrontPlanetList {
+ margin: 0;
+ padding: 0;
+}
+
+#pgFrontLatestReleases h2 {
+ margin-bottom: 0.7em;
+}
+
+#pgFrontLatestReleasesWrap {
+ font-size: 0.9em;
+ margin-left: 12px;
+ margin-top: 10px;
+ color: #666;
+}
+
+#pgFrontLatestReleasesNote {
+ font-size: 0.9em;
+ margin-left: 12px;
+ margin-top: 10px;
+ color: #666;
+ vertical-align: bottom;
+}
+
+#pgFrontLatestReleasesNote IMG {
+ vertical-align: bottom;
+}
+
+#pgFrontTrainingSummary {
+ font-size: 1.1em;
+ color: #666;
+}
+
+/* Secondary Pages */
+
+#pgSideWrap {
+ float: left;
+ width: 166px;
+ margin-top: 10px;
+ margin-right: -165px;
+}
+
+#pgContentWrap {
+ margin-left: 165px;
+ padding-top: 10px;
+}
+
+#pgContentWrap dd.quote_source {
+ font-weight: bold;
+ margin-bottom: 18px;
+}
+
+#pgAdminWrap {
+ padding-top: 10px;
+ padding-bottom: 10px;
+}
+
+#pgCommunityWrap {
+ margin-right: -420px;
+ float: left;
+ width: 100%;
+}
+
+#pgCommunity {
+ margin-right: 210px;
+}
+
+#pgSurveyWrap {
+ float: right;
+ width: 200px;
+ margin-left: 210px;
+ padding: 0;
+ border: 0;
+ top: 0px;
+
+ padding-left: 10px;
+}
+
+#pgSurvey dl {
+ width: 200px;
+ margin: 0;
+ padding: 0;
+ background: #F5F5F5 url(../img/layout/box_bottom.gif) no-repeat bottom left;
+ padding-bottom: 10px;
+}
+
+#pgSurvey dt {
+ margin: 0 0 10px 0;
+ padding: 10px;
+ font-weight: bold;
+ color: #666;
+ border-bottom: 1px solid #EFEFEF;
+ background: #F5F5F5 url(../img/layout/box_top.gif) no-repeat top left;
+}
+
+#pgSurvey dd {
+ margin: 0 0 0 10px;
+ padding: 0 10px 0 0;
+ color: #666;
+ font-size: 0.9em;
+}
+
+#pgSurvey form #surveySubmit {
+ font-size: 0.9em;
+ background: #F5F5F5;
+ color: #000000;
+ border: 1px solid #7A7A7A;
+ padding: 1px 4px;
+}
+
+#pgPlanetWrap {
+ float: right;
+ width: 200px;
+ margin-left: 210px;
+ padding: 0;
+ border: 0;
+ margin-top: 10px;
+
+ padding-left: 5px;
+}
+
+#pgPlanet dl {
+ width: 200px;
+ margin: 0;
+ padding: 0;
+ background: #F5F5F5 url(../img/layout/box_bottom.gif) no-repeat bottom left;
+ padding-bottom: 10px;
+}
+
+#pgPlanet dt {
+ margin: 0 0 10px 0;
+ padding: 10px;
+ font-weight: bold;
+ color: #666;
+ border-bottom: 1px solid #EFEFEF;
+ background: #F5F5F5 url(../img/layout/box_top.gif) no-repeat top left;
+}
+
+#pgPlanet dd {
+ margin: 0 0 0 10px;
+ padding: 0 10px 0 0;
+ color: #666;
+ font-size: 0.9em;
+}
+
+#pgPlanet dd ul {
+ margin-left: 0px;
+ padding-left: 10px;
+ margin-bottom: 10px;
+}
+
+#pgDocsWrap {
+ margin-right: -420px;
+ float: left;
+ width: 100%;
+}
+
+#pgDocs {
+ margin-right: 210px;
+}
+
+#pgQuickDocsWrap {
+ float: right;
+ width: 200px;
+ margin-left: 210px;
+ padding: 0;
+ border: 0;
+ top: 0px;
+
+ padding-left: 10px;
+}
+
+#pgQuickDocs dl {
+ width: 200px;
+ margin: 0;
+ padding: 0;
+ background: #F5F5F5 url(../img/layout/box_bottom.gif) no-repeat bottom left;
+ padding-bottom: 10px;
+}
+
+#pgQuickDocs dt {
+ margin: 0 0 10px 0;
+ padding: 10px;
+ font-weight: bold;
+ color: #666;
+ border-bottom: 1px solid #EFEFEF;
+ background: #F5F5F5 url(../img/layout/box_top.gif) no-repeat top left;
+}
+
+#pgQuickDocs dd {
+ margin: 0 0 0 10px;
+ padding: 0 10px 0 0;
+ color: #666;
+ font-size: 0.9em;
+}
+
+#pgCommunityDocsFooter table tr td ul {
+ padding-left: 0px;
+ list-style: none;
+}
+
+#pgCommunityDocsHeader table tr.firstrow td {
+ border-bottom: none;
+}
+
+#pgCommunityDocsHeader table tr.lastrow {
+ height: 1px;
+}
+
+#pgCommunityDocsBreadcrumbs {
+ margin-left: 10px;
+ margin-top: 5px;
+ margin-bottom: 10px;
+}
+
+#pgCommunityDocsPageContent {
+ margin-top: 5px;
+ margin-bottom: 20px;
+}
+
+.pgCommunityDocsCurrentMenu {
+ font-weight: bold;
+}
+
+#pgDownloadsWrap {
+ margin-right: -420px;
+ float: left;
+ width: 100%;
+}
+
+#pgDownloads {
+ margin-right: 210px;
+}
+
+#pgQuickDownloadsWrap {
+ float: right;
+ width: 200px;
+ margin-left: 210px;
+ padding: 0;
+ border: 0;
+ top: 0px;
+
+ padding-left: 10px;
+}
+
+#pgQuickDownloads dl {
+ width: 200px;
+ margin: 0;
+ padding: 0;
+ background: #F5F5F5 url(../img/layout/box_bottom.gif) no-repeat bottom left;
+ padding-bottom: 10px;
+}
+
+#pgQuickDownloads dt {
+ margin: 0 0 10px 0;
+ padding: 10px;
+ font-weight: bold;
+ color: #666;
+ border-bottom: 1px solid #EFEFEF;
+ background: #F5F5F5 url(../img/layout/box_top.gif) no-repeat top left;
+}
+
+#pgQuickDownloads dd {
+ margin: 0 0 0 10px;
+ padding: 0 10px 0 0;
+ color: #666;
+ font-size: 0.9em;
+}
+
+#pgFtpContent table tr td {
+ vertical-align: bottom;
+}
+
+#pgProfPage div.tblBasic table td {
+ color: black;
+ padding: 3px 5px;
+}
+
+#pgPressContacts dt {
+ font-weight: bold;
+}
+
+#pgPressContacts dd {
+ margin-bottom: 10px;
+
+}
+
+#pgArchiveWrap {
+ margin-top: 13px;
+}
+
+/* Footer Container */
+#pgFooter {
+ font-size: 0.9em;
+ color: #666;
+ line-height: 1.3em;
+ padding-top: 5px;
+ clear: both;
+}
+
+/* Generic forms class */
+TABLE.pgGenericFormTable TR {
+ vertical-align: top;
+}
+
+TABLE.pgGenericFormTable TR TD INPUT,
+TABLE.pgGenericFormTable TR TD SELECT,
+TABLE.pgGenericFormTable TR TD TEXTAREA,
+TABLE.pgGenericFormTable TR TD DIV.markdownpreview {
+ width: 100%;
+}
+
+TABLE.pgGenericFormTable TR.error {
+ background-color: red;
+ color: white;
+}
+
+TABLE.pgGenericFormTable TR.errorinfo {
+ background-color: #FFFFCC;
+}
+
+TABLE.pgGenericFormTable TR.errorheader TD {
+ background-color: #FFFFCC;
+ border: 1px solid red;
+ padding: 2px;
+}
+
+TABLE.pgGenericFormTable TR TH SPAN.formfieldhelp {
+ font-weight: normal;
+ font-style: italic;
+}
+
+/* Misc Classes */
+
+.pgClearBoth {
+ clear: both;
+ margin: 0;
+ padding: 0;
+}
+
+.pgBlockHide {
+ display: none;
+ height: 0;
+ width: 0;
+ overflow: hidden;
+ position: absolute; /* IE5 Mac */
+}
+
+img {
+ border: 0;
+}
diff --git a/docs/media/css/navigation.css b/docs/media/css/navigation.css
new file mode 100644
index 0000000..04d2a53
--- /dev/null
+++ b/docs/media/css/navigation.css
@@ -0,0 +1,237 @@
+/*
+ PostgreSQL.org - Navigation (and List) Styles
+*/
+
+/* Site Navigation */
+
+#pgTopNav {
+ text-align: left;
+ color: #666;
+ font-size: 0.9em;
+ margin: 0;
+ padding: 0;
+ height: 23px;
+ background: #B7B7B7 url("../img/layout/nav_fill.png") top left repeat-x;
+ overflow: visible;
+ margin-top: 2px;
+}
+
+#pgTopNavLeft {
+ width: 7px;
+ height: 23px;
+ border: 0px;
+ padding-right: 10px;
+ margin: 0px;
+ float: left;
+}
+
+#pgTopNavLeft img {
+ border: 0px;
+ margin: 0;
+ padding: 0;
+}
+
+#pgTopNavRight {
+ width: 7px;
+ height: 23px;
+ border: 0px;
+ padding: 0px;
+ margin: 0px;
+ float: right;
+}
+
+#pgTopNavRight img {
+ border: 0px;
+ margin: 0;
+ padding: 0;
+}
+
+#pgTopNavList {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+
+ height: 23px;
+ padding-top: 5px;
+}
+
+#pgTopNavList li {
+ padding: 0 1em 0 1.2em;
+ display: inline;
+ border-left: 1px solid #C8C8C8;
+}
+
+#pgTopNavList li a {
+ color: #fff;
+ font-weight: bold;
+ text-decoration: none;
+}
+
+#pgTopNavList li:first-child {
+ border-left: 0;
+ padding-left: 0;
+}
+
+#pgLoginLink {
+ margin: 0;
+ padding: 0;
+}
+#pgLoginlink a {
+ float: right;
+ color: #fff;
+ font-weight: bold;
+ text-decoration: none;
+ padding: 5px 1em 0 1.2em;
+ margin: 0;
+ height: 23px;
+}
+
+/* The search navigation is the list of links next to the search box. */
+
+#pgSearchNav {
+ position: relative;
+ float: right;
+ text-align: right;
+ color: #666;
+ font-size: 0.9em;
+ margin: 0px 0px 0px 0px;
+ top: -11px;
+ right: 209px;
+ padding: 0;
+}
+
+#pgSearchNavList {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+}
+
+#pgSearchNavList li {
+ padding: 0 0.5em 0 0.5em;
+ display: inline;
+ border-right: 1px solid #C8C8C8;
+}
+
+#pgSearchNavList li a {
+ color: #666;
+ text-decoration: none;
+}
+
+#pgSearchNavList li a:hover {
+ color: #000;
+}
+
+/* Category Navigation */
+
+#pgSideNav:before {
+ line-height: 0.1;
+ font-size: 1px;
+ margin: 0;
+ display: block;
+}
+
+#pgSideNav:after {
+ line-height: 0.1;
+ font-size: 1px;
+ margin: 0;
+ display: block;
+}
+
+#pgSideNav, #pgSideNav ul, #pgSideNav ul ul {
+ margin: 0;
+ padding: 0;
+ list-style: none;
+ font-size: 1.0em;
+}
+
+#pgSideNav {
+ width: 150px;
+ background-color: #F5F5F5;
+ background-image: url(../img/layout/nav_tbl_top.png);
+ background-position: top right;
+ background-repeat: no-repeat;
+}
+
+#pgSideNav ul {
+ background-image: url(../img/layout/nav_tbl_btm.png);
+ background-position: bottom left;
+ background-repeat: no-repeat;
+ padding: 10px 0 10px 0;
+}
+
+#pgSideNav ul ul {
+ background: none;
+ background-color: #F5F5F5;
+ margin: 0;
+ padding: 0;
+ list-style: none;
+}
+
+#pgSideNav ul ul li {
+ background: none;
+ border: none;
+}
+
+#pgSideNav ul li {
+ border-bottom: 1px solid #EFEFEF;
+ margin: 0;
+ padding-left: 12px;
+ background-image: url(../img/layout/blt_gry_arrow.png);
+ background-repeat: no-repeat;
+ background-position: 12px 0.65em;
+}
+
+/* Uncomment when IE/Validator supports last-child
+
+#pgSideNav ul li:last-child {
+ border-bottom: 1px solid #F5F5F5;
+}
+
+*/
+
+#pgSideNav ul li.last-child {
+ border-bottom: 1px solid #F5F5F5;
+}
+
+#pgSideNav ul li.active {
+ font-weight: bold;
+}
+
+#pgSideNav ul li.active span {
+ display: none;
+}
+
+#pgSideNav ul li a {
+ display: block;
+ color: #666;
+ text-decoration: none;
+ padding: 3px 5px 3px 15px;
+ margin: 0;
+}
+
+#pgSideNav ul ul li a.active {
+ font-weight: bold;
+}
+
+/* Uncomment when IE/Validator supports last-child
+
+#pgSideNav ul ul li:last-child {
+ border-bottom: none;
+}
+
+*/
+
+#pgSideNav ul ul li.last-child {
+ border-bottom: none;
+}
+
+#pgSideNav ul ul li a {
+ display: block;
+ /* padding: 3px 5px 3px 12px; */
+ padding-left: 12px;
+ margin: 0;
+}
+
+#pgSideNav ul li a:hover {
+ color: #333;
+}
\ No newline at end of file
diff --git a/docs/media/css/table.css b/docs/media/css/table.css
new file mode 100644
index 0000000..3aba3ca
--- /dev/null
+++ b/docs/media/css/table.css
@@ -0,0 +1,101 @@
+/*
+ PostgreSQL.org - Table Styles
+*/
+
+div.tblBasic h2 {
+ margin: 25px 0 .5em 0;
+}
+
+div.tblBasic table {
+ background: #F5F5F5 url(media/img/layout/nav_tbl_top_lft.png) top left no-repeat;
+ margin-left: 2ex;
+ margin-bottom: 15px;
+}
+
+div.tblBasic table th {
+ padding-top: 20px;
+ border-bottom: 1px solid #EFEFEF;
+ vertical-align: bottom;
+}
+
+div.tblBasic table td {
+ border-bottom: 1px solid #EFEFEF;
+}
+
+div.tblBasic table th,
+div.tblBasic table td {
+ padding: 8px 11px;
+ color: #555555;
+}
+
+div.tblBasic table td.indented {
+ text-indent: 30px;
+}
+
+div.tblBasic table.tblCompact td {
+ padding: 3px 3px;
+}
+
+div.tblBasic table tr.lastrow td {
+ border-bottom: none;
+ padding-bottom: 13px;
+}
+
+div.tblBasic table.tblCompact tr.lastrow td {
+ padding-bottom: 3px;
+}
+
+div.tblBasic table tr.lastrow td.colFirstT,
+div.tblBasic table tr.lastrow td.colFirst {
+ background: url(media/img/layout/nav_tbl_btm_lft.png) bottom left no-repeat;
+}
+
+div.tblBasic table.tblBasicGrey th.colLast,
+div.tblBasic table.tblCompact th.colLast {
+ background: #F5F5F5 url(media/img/layout/nav_tbl_top_rgt.png) top right no-repeat;
+}
+
+div.tblBasic table.tblBasicGrey tr.lastrow td.colLastT,
+div.tblBasic table.tblBasicGrey tr.lastrow td.colLast,
+div.tblBasic table.tblCompact tr.lastrow td.colLast,
+div.tblBasic table.tblCompact tr.lastrow td.colLastT{
+ background: #F5F5F5 url(media/img/layout/nav_tbl_btm_rgt.png) bottom right no-repeat;
+}
+
+div.tblBasic table.tblBasicGrey tr.firstrow td.colLastT,
+div.tblBasic table.tblBasicGrey tr.firstrow td.colLast,
+div tblBasic table.tblCompact tr.firstrow td.colLast {
+ background: #F5F5F5 url(media/img/layout/nav_tbl_top_rgt.png) top right no-repeat;
+}
+
+div.tblBasic table th.colMid,
+div.tblBasic table td.colMid,
+div.tblBasic table th.colLast,
+div.tblBasic table td.colLast {
+ background-color: #F5F5F5 ;
+}
+
+div.tblBasic table th.colLastC,
+div.tblBasic table td.colFirstC,
+div.tblBasic table td.colLastC {
+ text-align: center;
+}
+
+div.tblBasic table th.colLastR,
+div.tblBasic table td.colFirstR,
+div.tblBasic table td.colLastR {
+ text-align: right;
+}
+
+div.tblBasic table td.colFirstT,
+div.tblBasic table td.colMidT,
+div.tblBasic table td.colLastT {
+ vertical-align: top;
+}
+
+div.tblBasic table th.colLastRT,
+div.tblBasic table td.colFirstRT,
+div.tblBasic table td.colLastRT {
+ text-align: right;
+ vertical-align: top;
+}
diff --git a/docs/media/css/text.css b/docs/media/css/text.css
new file mode 100644
index 0000000..f7fb708
--- /dev/null
+++ b/docs/media/css/text.css
@@ -0,0 +1,162 @@
+/*
+ PostgreSQL.org - Text Styles
+*/
+
+/* Heading Definitions */
+
+h1 {
+ color: #EC5800;
+}
+
+h2 {
+ color: #666;
+}
+
+h3 {
+ color: #666;
+}
+
+h4 {
+ color: #666;
+}
+
+/* Text Styles */
+
+.txtColumn1 {
+ width: 50%;
+ line-height: 1.3em;
+}
+
+.txtColumn2 {
+ width: 50%;
+ line-height: 1.5em;
+}
+
+.txtCurrentLocation {
+ font-weight: bold;
+}
+
+.txtDivider {
+ font-size: 0.8em;
+ color: #E1E1E1;
+ padding-left: 4px;
+ padding-right: 4px;
+}
+
+.txtNewsEvent {
+ font-size: 0.9em;
+ color: #0094C7;
+}
+
+.txtDate {
+ font-size: 0.9em;
+ color: #333;
+}
+
+.txtMediumGrey {
+ color: #666;
+}
+
+.txtFormLabel {
+ color: #666;
+ font-weight: bold;
+ text-align: right;
+ vertical-align: top;
+}
+
+.txtRequiredField {
+ color: #EC5800;
+}
+
+.txtImportant {
+ color: #EC5800;
+}
+
+.txtOffScreen {
+ position: absolute;
+ left: -1999px;
+ width: 1990px;
+}
+
+#txtFrontFeatureHeading {
+ padding-bottom: 1.1em;
+}
+
+#txtFrontFeatureLink a {
+ font-size: 1.2em;
+ font-weight: bold;
+ padding-left: 5px;
+}
+
+#txtFrontUserText {
+ font-size: 1.0em;
+ color: #666;
+ margin-top: 12px;
+}
+
+#txtFrontUserName {
+ font-size: 0.9em;
+ color: #666;
+ margin-top: 9px;
+ font-weight: bold;
+}
+
+#txtFrontUserLink {
+ font-size: 0.9em;
+ color: #666;
+ margin-top: 11px;
+ margin-left: 1px;
+}
+
+#txtFrontUserLink img {
+ padding-right: 5px;
+}
+
+#txtFrontSupportUsText {
+ font-size: 1.0em;
+ margin-top: 9px;
+}
+
+#txtFrontSupportUsLink {
+ font-size: 0.9em;
+ margin-top: 6px;
+}
+
+#txtFrontSupportUsLink img {
+ padding-right: 7px;
+}
+
+/* Link Styles */
+
+a:link { color:#0085B0; text-decoration: underline; }
+a:visited { color:#004E66; text-decoration: underline; }
+a:active { color:#0085B0; text-decoration: underline; }
+a:hover { color:#000000; text-decoration: underline; }
+
+#pgFooter a:link { color:#666; text-decoration: underline; }
+#pgFooter a:visited { color:#666; text-decoration: underline; }
+#pgFooter a:active { color:#666; text-decoration: underline; }
+#pgFooter a:hover { color:#000000; text-decoration: underline; }
+
+#txtFrontUserName a:link { color:#666; text-decoration: underline; }
+#txtFrontUserName a:visited { color:#666; text-decoration: underline; }
+#txtFrontUserName a:active { color:#666; text-decoration: underline; }
+#txtFrontUserName a:hover { color:#000; text-decoration: underline; }
+
+#txtArchives a:visited { color:#00536E; text-decoration: underline; }
+#txtArchives pre { word-wrap: break-word; font-size: 150%; }
+#txtArchives tt { word-wrap: break-word; font-size: 150%; }
+
+#pgFrontUSSContainer h2, #pgFrontUSSContainer h3 {
+ margin: 0;
+ padding: 0;
+}
+
+#pgFrontNewsEventsContainer h2, #pgFrontNewsEventsContainer h3 {
+ margin: 0;
+ padding: 0;
+}
+
+#pgFrontNewsEventsContainer h3 img {
+ margin-bottom: 10px;
+}
diff --git a/docs/media/favicon.ico b/docs/media/favicon.ico
new file mode 100644
index 0000000..a1cc036
Binary files /dev/null and b/docs/media/favicon.ico differ
diff --git a/docs/media/img/add.jpg b/docs/media/img/add.jpg
new file mode 100644
index 0000000..06831ee
Binary files /dev/null and b/docs/media/img/add.jpg differ
diff --git a/docs/media/img/feature/feature_gears.png b/docs/media/img/feature/feature_gears.png
new file mode 100644
index 0000000..7c733fb
Binary files /dev/null and b/docs/media/img/feature/feature_gears.png differ
diff --git a/docs/media/img/fix.jpg b/docs/media/img/fix.jpg
new file mode 100644
index 0000000..1d6820b
Binary files /dev/null and b/docs/media/img/fix.jpg differ
diff --git a/docs/media/img/group-logo.png b/docs/media/img/group-logo.png
new file mode 100644
index 0000000..4d03b84
Binary files /dev/null and b/docs/media/img/group-logo.png differ
diff --git a/docs/media/img/hdr/hdr_latestreleases.png b/docs/media/img/hdr/hdr_latestreleases.png
new file mode 100644
index 0000000..1113d42
Binary files /dev/null and b/docs/media/img/hdr/hdr_latestreleases.png differ
diff --git a/docs/media/img/hdr/hdr_shortcuts.png b/docs/media/img/hdr/hdr_shortcuts.png
new file mode 100644
index 0000000..627b5aa
Binary files /dev/null and b/docs/media/img/hdr/hdr_shortcuts.png differ
diff --git a/docs/media/img/hdr/hdr_supportus.png b/docs/media/img/hdr/hdr_supportus.png
new file mode 100644
index 0000000..f1e6ecf
Binary files /dev/null and b/docs/media/img/hdr/hdr_supportus.png differ
diff --git a/docs/media/img/layout/blt_blu_arrow.png b/docs/media/img/layout/blt_blu_arrow.png
new file mode 100644
index 0000000..32ae5e3
Binary files /dev/null and b/docs/media/img/layout/blt_blu_arrow.png differ
diff --git a/docs/media/img/layout/blt_gry_arrow.png b/docs/media/img/layout/blt_gry_arrow.png
new file mode 100644
index 0000000..ce9b38e
Binary files /dev/null and b/docs/media/img/layout/blt_gry_arrow.png differ
diff --git a/docs/media/img/layout/box_bottom.gif b/docs/media/img/layout/box_bottom.gif
new file mode 100644
index 0000000..5d29384
Binary files /dev/null and b/docs/media/img/layout/box_bottom.gif differ
diff --git a/docs/media/img/layout/box_top.gif b/docs/media/img/layout/box_top.gif
new file mode 100644
index 0000000..a4d927d
Binary files /dev/null and b/docs/media/img/layout/box_top.gif differ
diff --git a/docs/media/img/layout/feature_bl.gif b/docs/media/img/layout/feature_bl.gif
new file mode 100644
index 0000000..fe6f825
Binary files /dev/null and b/docs/media/img/layout/feature_bl.gif differ
diff --git a/docs/media/img/layout/feature_br.gif b/docs/media/img/layout/feature_br.gif
new file mode 100644
index 0000000..0ae4117
Binary files /dev/null and b/docs/media/img/layout/feature_br.gif differ
diff --git a/docs/media/img/layout/feature_tl.gif b/docs/media/img/layout/feature_tl.gif
new file mode 100644
index 0000000..87d7cd0
Binary files /dev/null and b/docs/media/img/layout/feature_tl.gif differ
diff --git a/docs/media/img/layout/feature_tr.gif b/docs/media/img/layout/feature_tr.gif
new file mode 100644
index 0000000..1e5675a
Binary files /dev/null and b/docs/media/img/layout/feature_tr.gif differ
diff --git a/docs/media/img/layout/hdr_fill.png b/docs/media/img/layout/hdr_fill.png
new file mode 100644
index 0000000..ed2e57c
Binary files /dev/null and b/docs/media/img/layout/hdr_fill.png differ
diff --git a/docs/media/img/layout/hdr_left.png b/docs/media/img/layout/hdr_left.png
new file mode 100644
index 0000000..c483920
Binary files /dev/null and b/docs/media/img/layout/hdr_left.png differ
diff --git a/docs/media/img/layout/hdr_left3.png b/docs/media/img/layout/hdr_left3.png
new file mode 100644
index 0000000..c9a2207
Binary files /dev/null and b/docs/media/img/layout/hdr_left3.png differ
diff --git a/docs/media/img/layout/hdr_right.png b/docs/media/img/layout/hdr_right.png
new file mode 100644
index 0000000..d3de11c
Binary files /dev/null and b/docs/media/img/layout/hdr_right.png differ
diff --git a/docs/media/img/layout/nav_fill.png b/docs/media/img/layout/nav_fill.png
new file mode 100644
index 0000000..124a783
Binary files /dev/null and b/docs/media/img/layout/nav_fill.png differ
diff --git a/docs/media/img/layout/nav_lft.png b/docs/media/img/layout/nav_lft.png
new file mode 100644
index 0000000..f0aa5ff
Binary files /dev/null and b/docs/media/img/layout/nav_lft.png differ
diff --git a/docs/media/img/layout/nav_rgt.png b/docs/media/img/layout/nav_rgt.png
new file mode 100644
index 0000000..4eadb0a
Binary files /dev/null and b/docs/media/img/layout/nav_rgt.png differ
diff --git a/docs/media/img/layout/nav_tbl_btm.png b/docs/media/img/layout/nav_tbl_btm.png
new file mode 100644
index 0000000..ec897af
Binary files /dev/null and b/docs/media/img/layout/nav_tbl_btm.png differ
diff --git a/docs/media/img/layout/nav_tbl_top.png b/docs/media/img/layout/nav_tbl_top.png
new file mode 100644
index 0000000..3a22368
Binary files /dev/null and b/docs/media/img/layout/nav_tbl_top.png differ
diff --git a/docs/media/img/layout/usr_tbl_btm.png b/docs/media/img/layout/usr_tbl_btm.png
new file mode 100644
index 0000000..b62d0c1
Binary files /dev/null and b/docs/media/img/layout/usr_tbl_btm.png differ
diff --git a/docs/media/img/layout/usr_tbl_top.png b/docs/media/img/layout/usr_tbl_top.png
new file mode 100644
index 0000000..42eaab0
Binary files /dev/null and b/docs/media/img/layout/usr_tbl_top.png differ
diff --git a/docs/media/img/project-logo.png b/docs/media/img/project-logo.png
new file mode 100644
index 0000000..0cfa528
Binary files /dev/null and b/docs/media/img/project-logo.png differ
diff --git a/docs/media/img/remove.jpg b/docs/media/img/remove.jpg
new file mode 100644
index 0000000..8c9b9ef
Binary files /dev/null and b/docs/media/img/remove.jpg differ
diff --git a/docs/media/img/rss.png b/docs/media/img/rss.png
new file mode 100644
index 0000000..f0796ac
Binary files /dev/null and b/docs/media/img/rss.png differ
diff --git a/docs/media/img/slonik_duke.png b/docs/media/img/slonik_duke.png
new file mode 100644
index 0000000..26422c7
Binary files /dev/null and b/docs/media/img/slonik_duke.png differ
diff --git a/docs/media/img/update.jpg b/docs/media/img/update.jpg
new file mode 100644
index 0000000..beb9207
Binary files /dev/null and b/docs/media/img/update.jpg differ
diff --git a/docs/search/index.html b/docs/search/index.html
new file mode 100644
index 0000000..99b92b5
--- /dev/null
+++ b/docs/search/index.html
@@ -0,0 +1,33 @@
+---
+layout: default
+title: PostgreSQL JDBC Driver Search Results
+resource: ../media
+nav: ../
+---
+
+<br />
+ <div id="pgContentWrap">
+ <form method="get" action="search/">
+ <div class="tblBasic">
+ <table summary="" border="0" cellpadding="0" cellspacing="0" class="tblBasicGrey" width="590">
+ <tr>
+ <td class="colFirst">Search for</td>
+ <th class="colLast">
+ <input type="text" name="q" value="" />
+ <input type="submit" value="Search" />
+ </th>
+ </tr>
+ <tr class="lastrow">
+ <td class="colFirst"></td>
+ <td class="colLast">
+ <input type="checkbox" name="a" value="1" />Include community sites
+ </td>
+ </tr>
+ </table>
+ </div> <!-- tblBasic -->
+ </form>
+
+ <div id="pgSearchContent">
+ <div>No search term specified.</div>
+ </div>
+ </div> <!-- pgContentWrap -->
\ No newline at end of file
diff --git a/packaging/rpm/.gitignore b/packaging/rpm/.gitignore
index 033bcb4..f27668b 100644
--- a/packaging/rpm/.gitignore
+++ b/packaging/rpm/.gitignore
@@ -1,5 +1,6 @@
*.tar.gz
*.src.rpm
*.spec
+stdout
copr-token
copr_build_id
diff --git a/packaging/rpm/.srpmconfig b/packaging/rpm/.srpmconfig
new file mode 100644
index 0000000..bdc6ace
--- /dev/null
+++ b/packaging/rpm/.srpmconfig
@@ -0,0 +1,4 @@
+spec: postgresql-jdbc.spec
+
+source0:
+ method: git_archive
diff --git a/packaging/rpm/.srpmgen b/packaging/rpm/.srpmgen
deleted file mode 100644
index f9af4cb..0000000
--- a/packaging/rpm/.srpmgen
+++ /dev/null
@@ -1,10 +0,0 @@
-git:
- address: 'https://github.com/pgjdbc/pgjdbc.git'
- rpmsources: packaging/rpm
-
-spec: postgresql-jdbc.spec
-
-source0:
- git_archive:
- prefix: pgjdbc-REL9.5.git
- tarball_base: REL9.5.git
diff --git a/packaging/rpm/fedora-image/Dockerfile b/packaging/rpm/fedora-image/Dockerfile
index 26a0141..7f24e2e 100644
--- a/packaging/rpm/fedora-image/Dockerfile
+++ b/packaging/rpm/fedora-image/Dockerfile
@@ -1,20 +1,18 @@
-FROM index.docker.io/fedora:24
+FROM index.docker.io/fedora:27
MAINTAINER pgjdbc team
ENV HOME=/rpm
ENV container="docker"
-RUN dnf -y --setopt=tsflags=nodocs install \
+RUN dnf -y --setopt=tsflags=nodocs install dnf-plugins-core \
+ && dnf -y copr enable praiskup/srpm-tools \
+ && dnf -y --setopt=tsflags=nodocs install \
+ srpm-tools \
copr-cli \
- git \
- perl \
- perl-YAML \
- rpm-build \
- rpmdevtools \
- && dnf -y --setopt=tsflags=nodocs clean all --enablerepo='*' \
- && dnf -y update copr-cli python-copr --enablerepo updates-testing
+ && dnf -y --setopt=tsflags=nodocs clean all --enablerepo='*'
-ADD build_local copr-ci-git srpmgen /usr/bin/
+ADD copr-ci-git /usr/bin/
+RUN chmod +rx /usr/bin/copr-ci-git
WORKDIR /rpm
diff --git a/packaging/rpm/fedora-image/build_local b/packaging/rpm/fedora-image/build_local
deleted file mode 100755
index 5a9c26d..0000000
--- a/packaging/rpm/fedora-image/build_local
+++ /dev/null
@@ -1,43 +0,0 @@
-#!/bin/bash
-
-test -z "$RPMBUILD" && RPMBUILD=rpmbuild
-
-ARR=( )
-
-for i in "$@"; do
- case "$i" in
- --copr)
- ARR+=( --define "_source_filedigest_algorithm md5" )
- ARR+=( --define "_binary_filedigest_algorithm md5" )
- ARR+=( --define "dist %nil" )
- ;;
-
- *)
- ARR+=( "$i" )
- ;;
- esac
-done
-
-run_rpmbuild()
-{
- set -x
- echo "$@"
-
- $RPMBUILD \
- --define "_sourcedir $PWD" \
- --define "_rpmdir $PWD" \
- --define "_specdir $PWD" \
- --define "_builddir $PWD" \
- --define "_srcrpmdir $PWD" \
- --buildroot "$PWD/buildroot" \
- "$@"
-}
-
-case "$0" in
- *build_local_nocheck)
- ARR+=( --define "runselftest 0" )
- ARR+=( --without=check )
- ;;
-esac
-
-run_rpmbuild "${ARR[@]}"
diff --git a/packaging/rpm/fedora-image/copr-ci-git b/packaging/rpm/fedora-image/copr-ci-git
index ccbb9b3..b9416bc 100755
--- a/packaging/rpm/fedora-image/copr-ci-git
+++ b/packaging/rpm/fedora-image/copr-ci-git
@@ -6,6 +6,10 @@ copr_fe_url=https://copr.fedorainfracloud.org/coprs/g/pgjdbc/pgjdbc-travis/build
copr_be_link=https://copr-be.cloud.fedoraproject.org/results/@pgjdbc/pgjdbc-travis/fedora-rawhide-x86_64/
status_file=copr_build_id
+test -z "$PARENT_VERSION" && exit 1
+test -z "$PROJECT_VERSION" && exit 1
+PROJECT_VERSION=${PROJECT_VERSION//-/_}
+
copr_wrapper ()
(
set +x
@@ -29,10 +33,16 @@ cd "$1"
git_rev=$(git rev-parse --short=7 HEAD)
date_rev=$(date +%Y%m%d_%H%M%S)
release=${date_rev}.git$git_rev
-sed "s!^Release:.*\$!Release: 1.$release%{?dist}!" "$2".spec.tpl > "$2".spec
-srpmgen
-build_local -bs "$2".spec --define "dist %nil"
-copr_wrapper --config "$1"/copr-token build --nowait @pgjdbc/pgjdbc-travis "$2-$3-1.$release.src.rpm"
+sed -e "s!^Release:.*\$!Release: 1.$release%{?dist}!" \
+ -e "s!^Version:.*\$!Version: $PROJECT_VERSION!" \
+ -e "s!%global parent_ver.*!%global parent_ver $PARENT_VERSION!" \
+ "$2".spec.tpl > "$2".spec
+
+# See https://github.com/praiskup/srpm-tools
+srpm-generator | tee stdout
+srpm=$(grep Wrote: stdout | sed 's/^Wrote: //')
+
+copr_wrapper --config "$1"/copr-token build --nowait @pgjdbc/pgjdbc-travis "$srpm"
copr_build_id=$(cat "$status_file")
concrete_copr_be_link=$copr_be_link$(printf "%08d" "$copr_build_id")-postgresql-jdbc/
@@ -66,6 +76,6 @@ do
done
echo " * getting the build log for rawhide chroot"
-curl $concrete_copr_be_link/build.log.gz | gunzip || :
+curl -L $concrete_copr_be_link/build.log.gz | gunzip || :
$exit_cmd
diff --git a/packaging/rpm/fedora-image/srpmgen b/packaging/rpm/fedora-image/srpmgen
deleted file mode 100755
index 05d7062..0000000
--- a/packaging/rpm/fedora-image/srpmgen
+++ /dev/null
@@ -1,68 +0,0 @@
-#! /bin/perl
-
-use YAML;
-use File::Basename;
-
-open (my $config_file, "<", ".srpmgen") or die "Couldn't open file: $!";
-
-my ($config) = Load( join('', <$config_file>));
-
-sub info
-{
- print (" * @_\n");
-}
-
-my @sources = `spectool $config->{spec} -S`;
-if ($? >> 8) {
- die ("can't successfully run 'spectool'");
-}
-
-sub obtain_source
-{
- my ($id, $config) = @_;
-
- if (defined ($config->{git_archive})) {
- $config = $config->{git_archive};
- my $topleveldir = `git rev-parse --show-toplevel`;
- if ($? >> 8) {
- die ("can't get git top level directory");
- }
- chomp ($topleveldir);
-
- my $pfx = $config->{prefix};
- my $tarball_base = $pfx;
- info ("generating tarball $tarball_base.tar.gz from git repository");
- if (defined ($config->{tarball_base})) {
- $tarball_base = $config->{tarball_base};
- }
- system ("git archive --remote $topleveldir --prefix $pfx/ HEAD | gzip > $tarball_base.tar.gz");
- if ($? >> 8) {
- die ("can't generate tarball $tarball_base.tar.gz");
- }
- return;
- }
-
- die ("no method specified to obtain sources for '$id'\n");
-}
-
-# Go through all 'SourceN' statements in spec file.
-for my $source_line (@sources)
-{
- chomp $source_line;
- my ($id, $source) = split (/ /, $source_line, 2);
- $id =~ s/:$//;
- $id = lc ($id);
-
- if (defined ($config->{$id})) {
- obtain_source ($id, $config->{$id});
- }
-
- my $src_basename = basename ($source);
- if (! -f "$src_basename") {
- info ("getting sources $source");
- system ("wget", "$source");
- if ($? >> 8) {
- die ("can't wget $source");
- }
- }
-}
diff --git a/packaging/rpm/postgresql-jdbc.spec.tpl b/packaging/rpm/postgresql-jdbc.spec.tpl
index 739e953..b5988d6 100644
--- a/packaging/rpm/postgresql-jdbc.spec.tpl
+++ b/packaging/rpm/postgresql-jdbc.spec.tpl
@@ -35,10 +35,8 @@
%global section devel
-%global upstreamrel git
-%global upstreammajor 9.5
%global source_path pgjdbc/src/main/java/org/postgresql
-%global parent_ver 1.1.0
+%global parent_ver GENERATED
%global parent_poms_builddir ./pgjdbc-parent-poms
%global pgjdbc_mvn_options -DwaffleEnabled=false -DosgiEnabled=false \\\
@@ -46,18 +44,17 @@
Summary: JDBC driver for PostgreSQL
Name: postgresql-jdbc
-Version: %upstreammajor.%{upstreamrel}
-Release: 1%{?dist}
+Version: GENERATED
+Release: GENERATED
License: BSD
URL: http://jdbc.postgresql.org/
-Source0: REL%{version}.tar.gz
-Source1: postgres-testing.sh
+Source0: https://github.com/pgjdbc/pgjdbc/archive/REL%{version}/pgjdbc-REL%{version}.tar.gz
# Upstream moved parent pom.xml into separate project (even though there is only
# one dependant project on it?). Let's try to not complicate packaging by
# having separate spec file for it, too.
-Source2: https://github.com/pgjdbc/pgjdbc-parent-poms/archive/REL%parent_ver.tar.gz
+Source1: https://github.com/pgjdbc/pgjdbc-parent-poms/archive/REL%parent_ver/pgjdbc-parent-poms-REL%{parent_ver}.tar.gz
BuildArch: noarch
BuildRequires: java-devel >= 1.8
@@ -67,10 +64,15 @@ BuildRequires: properties-maven-plugin
BuildRequires: maven-enforcer-plugin
BuildRequires: maven-plugin-bundle
BuildRequires: maven-plugin-build-helper
+BuildRequires: classloader-leak-test-framework
+
+BuildRequires: mvn(com.ongres.scram:client)
+BuildRequires: mvn(org.apache.maven.plugins:maven-clean-plugin)
%if %runselftest
-BuildRequires: postgresql-server
BuildRequires: postgresql-contrib
+BuildRequires: postgresql-devel
+BuildRequires: postgresql-server
%endif
# gettext is only needed if we try to update translations
@@ -98,7 +100,7 @@ This package contains the API Documentation for %{name}.
%prep
-%setup -c -q -a 2 -n pgjdbc-REL%version
+%setup -c -q -a 1
mv pgjdbc-REL%version/* .
mv pgjdbc-parent-poms-REL%parent_ver pgjdbc-parent-poms
@@ -112,6 +114,7 @@ find -name "*.jar" -or -name "*.class" | xargs rm -f
%pom_xpath_inject pom:modules "<module>%parent_poms_builddir</module>"
%pom_xpath_inject pom:parent "<relativePath>pgjdbc-parent-poms/pgjdbc-versions</relativePath>"
%pom_xpath_set pom:relativePath ../pgjdbc-parent-poms/pgjdbc-core-parent pgjdbc
+%pom_xpath_remove "pom:plugin[pom:artifactId = 'maven-shade-plugin']" pgjdbc
# compat symlink: requested by dtardon (libreoffice), reverts part of
# 0af97ce32de877 commit.
@@ -138,7 +141,7 @@ mkdir -p pgjdbc/target/generated-sources/annotations
# Include PostgreSQL testing methods and variables.
%if %runselftest
-. %{SOURCE1}
+%postgresql_tests_init
PGTESTS_LOCALE=C.UTF-8
@@ -156,7 +159,7 @@ protocolVersion=0
EOF
# Start the local PG cluster.
-pgtests_start
+%postgresql_tests_start
%else
# -f is equal to -Dmaven.test.skip=true
opts="-f"
@@ -164,6 +167,7 @@ opts="-f"
%mvn_build $opts -- %pgjdbc_mvn_options
+
%install
%mvn_install
@@ -183,168 +187,5 @@ opts="-f"
%changelog
-* Mon Aug 29 2016 Pavel Raiskup <praiskup at redhat.com> - 9.4.1209-6
-- sync with latest Fedora
-
-* Wed Jun 01 2016 Pavel Raiskup <praiskup at redhat.com> - 9.5.git-1
-- update to work with tarball from git version of jdbc
-
-* Wed Apr 13 2016 Pavel Raiskup <praiskup at redhat.com> - 9.4.1208-8
-- merge parent-poms and pgjdbc downstream (having separate package does not seem
- to be necessary at all)
-
-* Tue Apr 12 2016 Pavel Raiskup <praiskup at redhat.com> - 9.4.1208-7
-- fix testsuite for fedora 24
-
-* Tue Apr 12 2016 Pavel Kajaba <pkajaba at redhat.com> - 9.4.1208-6
-- Added script to enable testing
-
-* Fri Apr 08 2016 Pavel Raiskup <praiskup at redhat.com> - 9.4.1208-5
-- enable testsuite for each build, to-be-fixed-yet
-
-* Fri Apr 08 2016 Pavel Raiskup <praiskup at redhat.com> - 9.4.1208-4
-- apply the work-around for maven-compiler-plugin && jcp issue
-
-* Fri Apr 08 2016 Pavel Raiskup <praiskup at redhat.com> - 9.4.1208-3
-- bump
-
-* Thu Jun 18 2015 Fedora Release Engineering <rel-eng at lists.fedoraproject.org> - 9.4.1200-2
-- Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild
-
-* Wed Feb 04 2015 Pavel Raiskup <praiskup at redhat.com> - 9.4.1200-1
-- rebase to most recent version (#1188827)
-
-* Mon Jul 14 2014 Pavel Raiskup <praiskup at redhat.com> - 9.3.1102-1
-- Rebase to most recent version (#1118667)
-- revert back upstream commit for travis build
-
-* Sat Jun 07 2014 Fedora Release Engineering <rel-eng at lists.fedoraproject.org> - 9.3.1101-4
-- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild
-
-* Mon May 19 2014 Pavel Raiskup <praiskup at redhat.com> - 9.3.1101-3
-- run upstream testsuite when '%%runselftest' defined
-
-* Wed Apr 23 2014 Mikolaj Izdebski <mizdebsk at redhat.com> - 9.3.1101-2
-- Add explicit requires on java-headless
-
-* Wed Apr 23 2014 Pavel Raiskup <praiskup at redhat.com> - 9.3.1101-1
-- Rebase to most recent version (#1090366)
-
-* Fri Mar 28 2014 Michael Simacek <msimacek at redhat.com> - 9.2.1002-5
-- Use Requires: java-headless rebuild (#1067528)
-
-* Tue Aug 06 2013 Pavel Raiskup <praiskup at redhat.com> - 9.2.1002-4
-- add javadoc subpackage
-
-* Tue Aug 06 2013 Pavel Raiskup <praiskup at redhat.com> - 9.2.1002-4
-- don't use removed macro %%add_to_maven_depmap (#992816)
-- lint: trim-lines, reuse %%{name} macro, fedora-review fixes
-- merge cleanup changes by Stano Ochotnicky
-
-* Sun Aug 04 2013 Fedora Release Engineering <rel-eng at lists.fedoraproject.org> - 9.2.1002-3
-- Rebuilt for https://fedoraproject.org/wiki/Fedora_20_Mass_Rebuild
-
-* Thu Feb 14 2013 Fedora Release Engineering <rel-eng at lists.fedoraproject.org> - 9.2.1002-2
-- Rebuilt for https://fedoraproject.org/wiki/Fedora_19_Mass_Rebuild
-
-* Wed Nov 14 2012 Tom Lane <tgl at redhat.com> 9.2.1002-1
-- Update to build 9.2-1002 (just to correct mispackaging of source tarball)
-
-* Tue Nov 13 2012 Tom Lane <tgl at redhat.com> 9.2.1001-1
-- Update to build 9.2-1001 for compatibility with PostgreSQL 9.2
-
-* Sun Jul 22 2012 Tom Lane <tgl at redhat.com> 9.1.902-1
-- Update to build 9.1-902
-
-* Sat Jul 21 2012 Fedora Release Engineering <rel-eng at lists.fedoraproject.org> - 9.1.901-4
-- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild
-
-* Thu Feb 23 2012 Tom Lane <tgl at redhat.com> 9.1.901-3
-- Change BuildRequires: java-1.6.0-openjdk-devel to just java-devel.
- As of 9.1-901, upstream has support for JDBC4.1, so we don't have to
- restrict to JDK6 anymore, and Fedora is moving to JDK7
-Resolves: #796580
-
-* Sat Jan 14 2012 Fedora Release Engineering <rel-eng at lists.fedoraproject.org> - 9.1.901-2
-- Rebuilt for https://fedoraproject.org/wiki/Fedora_17_Mass_Rebuild
-
-* Mon Sep 12 2011 Tom Lane <tgl at redhat.com> 9.1.901-1
-- Update to build 9.1-901 for compatibility with PostgreSQL 9.1
-
-* Mon Aug 15 2011 Tom Lane <tgl at redhat.com> 9.0.801-4
-- Add BuildRequires: java-1.6.0-openjdk-devel to ensure we have recent JDK
-Related: #730588
-- Remove long-obsolete minimum versions from BuildRequires
-
-* Sun Jul 17 2011 Tom Lane <tgl at redhat.com> 9.0.801-3
-- Switch to non-GCJ build, since GCJ is now deprecated in Fedora
-Resolves: #722247
-- Use %%{_mavendepmapfragdir} to fix FTBFS with maven 3
-
-* Wed Feb 09 2011 Fedora Release Engineering <rel-eng at lists.fedoraproject.org> - 9.0.801-2
-- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild
-
-* Wed Dec 29 2010 Tom Lane <tgl at redhat.com> 9.0.801-1
-- Update to build 9.0-801
-
-* Mon May 31 2010 Tom Lane <tgl at redhat.com> 8.4.701-4
-- Update gcj_support sections to meet Packaging/GCJGuidelines;
- fixes FTBFS in F-14 rawhide
-
-* Tue Nov 24 2009 Tom Lane <tgl at redhat.com> 8.4.701-3
-- Seems the .pom file *must* have a package version number in it, sigh
-Resolves: #538487
-
-* Mon Nov 23 2009 Tom Lane <tgl at redhat.com> 8.4.701-2
-- Add a .pom file to ease use by maven-based packages (courtesy Deepak Bhole)
-Resolves: #538487
-
-* Tue Aug 18 2009 Tom Lane <tgl at redhat.com> 8.4.701-1
-- Update to build 8.4-701
-
-* Sun Jul 26 2009 Fedora Release Engineering <rel-eng at lists.fedoraproject.org> - 0:8.3.603-4
-- Rebuilt for https://fedoraproject.org/wiki/Fedora_12_Mass_Rebuild
-
-* Tue Apr 21 2009 Tom Lane <tgl at redhat.com> 8.3.603-3
-- Avoid multilib conflict caused by overeager attempt to rebuild translations
-
-* Thu Feb 26 2009 Fedora Release Engineering <rel-eng at lists.fedoraproject.org> - 0:8.3.603-2.1
-- Rebuilt for https://fedoraproject.org/wiki/Fedora_11_Mass_Rebuild
-
-* Wed Jul 9 2008 Tom "spot" Callaway <tcallawa at redhat.com> 8.3.603-1.1
-- drop repotag
-
-* Tue Feb 12 2008 Tom Lane <tgl at redhat.com> 8.3.603-1jpp
-- Update to build 8.3-603
-
-* Sun Aug 12 2007 Tom Lane <tgl at redhat.com> 8.2.506-1jpp
-- Update to build 8.2-506
-
-* Tue Apr 24 2007 Tom Lane <tgl at redhat.com> 8.2.505-1jpp
-- Update to build 8.2-505
-- Work around 1.4 vs 1.5 versioning inconsistency
-
-* Fri Dec 15 2006 Tom Lane <tgl at redhat.com> 8.2.504-1jpp
-- Update to build 8.2-504
-
-* Wed Aug 16 2006 Tom Lane <tgl at redhat.com> 8.1.407-1jpp.4
-- Fix Requires: for rebuild-gcj-db (bz #202544)
-
-* Wed Aug 16 2006 Fernando Nasser <fnasser at redhat.com> 8.1.407-1jpp.3
-- Merge with upstream
-
-* Sat Jul 22 2006 Jakub Jelinek <jakub at redhat.com> 8.1.407-1jpp.2
-- Rebuilt
-
-* Wed Jul 12 2006 Jesse Keating <jkeating at redhat.com> - 0:8.1.407-1jpp.1
-- rebuild
-
-* Wed Jun 14 2006 Tom Lane <tgl at redhat.com> 8.1.407-1jpp
-- Update to build 8.1-407
-
-* Mon Mar 27 2006 Tom Lane <tgl at redhat.com> 8.1.405-2jpp
-- Back-patch upstream fix to support unspecified-type strings.
-
-* Thu Feb 16 2006 Tom Lane <tgl at redhat.com> 8.1.405-1jpp
-- Split postgresql-jdbc into its own SRPM (at last).
-- Build it from source. Add support for gcj compilation.
+* Wed Nov 29 2017 Pavel Raiskup <praiskup at redhat.com> - 9.5.git
+- no changelog in this spec file (upstream git)
diff --git a/packaging/rpm_ci b/packaging/rpm_ci
index be6b892..4c6464a 100755
--- a/packaging/rpm_ci
+++ b/packaging/rpm_ci
@@ -10,10 +10,6 @@ cd "$(dirname "$0")"
echo "$copr_token_password" | gpg --batch --passphrase-fd 0 rpm/copr-token.gpg
) || exit 0
-# If we have SELinux box, setup correct docker label
-if test -x /bin/chcon ; then
- chcon -R -t svirt_sandbox_file_t ..
-fi
-
-docker run -e HOME=/git -u `id -u` -ti --rm -v `pwd`/..:/git praiskup/copr-and-jdbc-ci \
- copr-ci-git /git/packaging/rpm postgresql-jdbc 9.5.git
+docker run -e HOME=/git -e PARENT_VERSION -e PROJECT_VERSION \
+ -u `id -u` -ti --rm -v `pwd`/..:/git:Z praiskup/copr-and-jdbc-ci \
+ copr-ci-git /git/packaging/rpm postgresql-jdbc
diff --git a/pgjdbc/pom.xml b/pgjdbc/pom.xml
index 9d4ec9e..79459f2 100644
--- a/pgjdbc/pom.xml
+++ b/pgjdbc/pom.xml
@@ -3,14 +3,14 @@
<parent>
<groupId>org.postgresql</groupId>
<artifactId>pgjdbc-core-parent</artifactId>
- <version>1.1.2</version>
+ <version>1.1.3</version>
<relativePath />
</parent>
<artifactId>postgresql</artifactId>
<packaging>bundle</packaging>
<name>PostgreSQL JDBC Driver - JDBC 4.2</name>
- <version>9.4.1212</version>
+ <version>42.2.2</version>
<description>Java JDBC 4.2 (JRE 8+) driver for PostgreSQL database</description>
<url>https://github.com/pgjdbc/pgjdbc</url>
@@ -33,8 +33,17 @@
<jdbc.specification.version>4.2</jdbc.specification.version>
<jdbc.specification.version.nodot>42</jdbc.specification.version.nodot>
<skip.assembly>false</skip.assembly>
+ <checkstyle.version>8.5</checkstyle.version>
</properties>
+ <dependencies>
+ <dependency>
+ <groupId>com.ongres.scram</groupId>
+ <artifactId>client</artifactId>
+ <version>1.0.0-beta.2</version>
+ </dependency>
+ </dependencies>
+
<profiles>
<profile>
<id>translate</id>
@@ -248,6 +257,56 @@
<outputEncoding>UTF-8</outputEncoding>
</configuration>
</plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-shade-plugin</artifactId>
+ <version>3.1.0</version>
+ <configuration>
+ <minimizeJar>true</minimizeJar>
+ <filters>
+ <filter>
+ <artifact>com.ongres.scram:client</artifact>
+ <includes>
+ <include>**</include>
+ </includes>
+ </filter>
+ <filter>
+ <artifact>com.github.dblock.waffle:waffle-jna</artifact>
+ <excludes>
+ <exclude>**</exclude>
+ </excludes>
+ </filter>
+ <filter>
+ <artifact>org.slf4j:jcl-over-slf4j</artifact>
+ <excludes>
+ <exclude>**</exclude>
+ </excludes>
+ </filter>
+ <filter>
+ <artifact>*:*</artifact>
+ <excludes>
+ <exclude>com/sun/jna/**</exclude>
+ </excludes>
+ </filter>
+ </filters>
+ </configuration>
+ <executions>
+ <execution>
+ <phase>package</phase>
+ <goals>
+ <goal>shade</goal>
+ </goals>
+ <configuration>
+ <relocations>
+ <relocation>
+ <pattern>com.ongres</pattern>
+ <shadedPattern>org.postgresql.shaded.com.ongres</shadedPattern>
+ </relocation>
+ </relocations>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
</plugins>
<pluginManagement>
@@ -260,11 +319,12 @@
<dependency>
<groupId>com.puppycrawl.tools</groupId>
<artifactId>checkstyle</artifactId>
- <version>6.13</version>
+ <version>${checkstyle.version}</version>
</dependency>
</dependencies>
<configuration>
<configLocation>src/main/checkstyle/checks.xml</configLocation>
+ <suppressionsLocation>src/main/checkstyle/suppressions.xml</suppressionsLocation>
<violationSeverity>error</violationSeverity>
<failOnViolation>true</failOnViolation>
<failsOnError>true</failsOnError>
@@ -277,6 +337,6 @@
</build>
<scm>
- <tag>REL9.4.1212</tag>
+ <tag>REL42.2.2</tag>
</scm>
</project>
diff --git a/pgjdbc/src/main/checkstyle/checks.xml b/pgjdbc/src/main/checkstyle/checks.xml
index 60871df..4b4c089 100644
--- a/pgjdbc/src/main/checkstyle/checks.xml
+++ b/pgjdbc/src/main/checkstyle/checks.xml
@@ -22,10 +22,6 @@
<property name="fileExtensions" value="java, properties, xml"/>
- <module name="SuppressionCommentFilter">
- <property name="offCommentFormat" value="CHECKSTYLE: OFF"/>
- <property name="onCommentFormat" value="CHECKSTYLE: ON"/>
- </module>
<!-- Checks for whitespace -->
<!-- See http://checkstyle.sf.net/config_whitespace.html -->
@@ -37,8 +33,11 @@
</module>
<module name="TreeWalker">
- <!-- For SuppressionCommentFilter -->
- <module name="FileContentsHolder"/>
+
+ <module name="SuppressionCommentFilter">
+ <property name="offCommentFormat" value="CHECKSTYLE: OFF"/>
+ <property name="onCommentFormat" value="CHECKSTYLE: ON"/>
+ </module>
<module name="Regexp">
<property name="format" value="[ \t]++$"/>
@@ -71,14 +70,14 @@
value="LITERAL_TRY, LITERAL_FINALLY, LITERAL_IF, LITERAL_ELSE, LITERAL_SWITCH"/>
</module>
<module name="NeedBraces"/>
- <module name="LeftCurly">
- <property name="maxLineLength" value="100"/>
+ <module name="LeftCurly"/>
+ <module name="RightCurly">
+ <property name="tokens" value="LITERAL_TRY, LITERAL_CATCH, LITERAL_FINALLY, LITERAL_IF, LITERAL_ELSE, LITERAL_DO"/>
</module>
- <module name="RightCurly"/>
<module name="RightCurly">
<property name="option" value="alone"/>
<property name="tokens"
- value="CLASS_DEF, METHOD_DEF, CTOR_DEF, LITERAL_FOR, LITERAL_WHILE, LITERAL_DO, STATIC_INIT, INSTANCE_INIT"/>
+ value="CLASS_DEF, METHOD_DEF, CTOR_DEF, LITERAL_FOR, LITERAL_WHILE, STATIC_INIT, INSTANCE_INIT"/>
</module>
<module name="WhitespaceAround">
<property name="allowEmptyConstructors" value="true"/>
@@ -91,12 +90,14 @@
value="WhitespaceAround: ''{0}'' is not preceded with whitespace."/>
</module>
<module name="OneStatementPerLine"/>
+ <module name="MissingDeprecated"/>
<module name="MultipleVariableDeclarations"/>
- <!--<module name="ArrayTypeStyle"/>-->
+ <module name="ArrayTypeStyle"/>
<!--<module name="MissingSwitchDefault"/>-->
<!--<module name="FallThrough"/>-->
<module name="UpperEll"/>
- <!--<module name="ModifierOrder"/>-->
+ <module name="ModifierOrder"/>
+ <module name="RedundantModifier"/>
<module name="EmptyLineSeparator">
<property name="allowNoEmptyLineBetweenFields" value="true"/>
</module>
@@ -175,7 +176,7 @@
</module>
<module name="OverloadMethodsDeclarationOrder"/>
<module name="VariableDeclarationUsageDistance"/>-->
- <module name="com.puppycrawl.tools.checkstyle.checks.imports.CustomImportOrder">
+ <module name="CustomImportOrder">
<property name="specialImportsRegExp" value="org.postgresql"/>
<property name="sortImportsInGroupAlphabetically" value="true"/>
<property name="customImportOrderRules"
diff --git a/pgjdbc/src/main/checkstyle/suppressions.xml b/pgjdbc/src/main/checkstyle/suppressions.xml
new file mode 100644
index 0000000..76e5070
--- /dev/null
+++ b/pgjdbc/src/main/checkstyle/suppressions.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+
+<!DOCTYPE suppressions PUBLIC
+ "-//Puppy Crawl//DTD Suppressions 1.1//EN"
+ "http://www.puppycrawl.com/dtds/suppressions_1_1.dtd">
+
+<suppressions>
+ <suppress files="WriterHandler\.java" checks="RegexpHeader"/>
+</suppressions>
diff --git a/pgjdbc/src/main/java/org/postgresql/Driver.java b/pgjdbc/src/main/java/org/postgresql/Driver.java
index 1107d88..637af62 100644
--- a/pgjdbc/src/main/java/org/postgresql/Driver.java
+++ b/pgjdbc/src/main/java/org/postgresql/Driver.java
@@ -5,13 +5,16 @@
package org.postgresql;
-import org.postgresql.core.Logger;
import org.postgresql.jdbc.PgConnection;
+
+import org.postgresql.util.DriverInfo;
+import org.postgresql.util.ExpressionProperties;
import org.postgresql.util.GT;
import org.postgresql.util.HostSpec;
import org.postgresql.util.PSQLException;
import org.postgresql.util.PSQLState;
import org.postgresql.util.SharedTimer;
+import org.postgresql.util.WriterHandler;
import java.io.IOException;
import java.io.InputStream;
@@ -28,6 +31,12 @@ import java.sql.SQLFeatureNotSupportedException;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Properties;
+import java.util.Set;
+import java.util.logging.Formatter;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import java.util.logging.SimpleFormatter;
+import java.util.logging.StreamHandler;
/**
* The Java SQL framework allows for multiple database drivers. Each driver should supply a class
@@ -51,16 +60,10 @@ import java.util.Properties;
*/
public class Driver implements java.sql.Driver {
- // make these public so they can be used in setLogLevel below
-
- public static final int DEBUG = 2;
- public static final int INFO = 1;
- public static final int OFF = 0;
-
private static Driver registeredDriver;
- private static final Logger logger = new Logger();
- private static boolean logLevelSet = false;
- private static SharedTimer sharedTimer = new SharedTimer(logger);
+ private static final Logger PARENT_LOGGER = Logger.getLogger("org.postgresql");
+ private static final Logger LOGGER = Logger.getLogger("org.postgresql.Driver");
+ private static SharedTimer sharedTimer = new SharedTimer();
static {
try {
@@ -83,8 +86,7 @@ public class Driver implements java.sql.Driver {
return defaultProperties;
}
- // Make sure we load properties with the maximum possible
- // privileges.
+ // Make sure we load properties with the maximum possible privileges.
try {
defaultProperties =
AccessController.doPrivileged(new PrivilegedExceptionAction<Properties>() {
@@ -96,23 +98,6 @@ public class Driver implements java.sql.Driver {
throw (IOException) e.getException();
}
- // Use the loglevel from the default properties (if any)
- // as the driver-wide default unless someone explicitly called
- // setLogLevel() already.
- synchronized (Driver.class) {
- if (!logLevelSet) {
- String driverLogLevel = PGProperty.LOG_LEVEL.get(defaultProperties);
- if (driverLogLevel != null) {
- try {
- setLogLevel(Integer.parseInt(driverLogLevel));
- } catch (Exception l_e) {
- // XXX revisit
- // invalid value for loglevel; ignore it
- }
- }
- }
- }
-
return defaultProperties;
}
@@ -121,7 +106,7 @@ public class Driver implements java.sql.Driver {
try {
PGProperty.USER.set(merged, System.getProperty("user.name"));
- } catch (java.lang.SecurityException se) {
+ } catch (SecurityException se) {
// We're just trying to set a default, so if we can't
// it's not a big deal.
}
@@ -140,13 +125,11 @@ public class Driver implements java.sql.Driver {
}
if (cl == null) {
- logger.debug("Can't find a classloader for the Driver; not loading driver configuration");
+ LOGGER.log(Level.WARNING, "Can't find a classloader for the Driver; not loading driver configuration");
return merged; // Give up on finding defaults.
}
- if (logger.logDebug()) {
- logger.debug("Loading driver configuration via classloader " + cl);
- }
+ LOGGER.log(Level.FINE, "Loading driver configuration via classloader {0}", cl);
// When loading the driver config files we don't want settings found
// in later files in the classpath to override settings specified in
@@ -160,9 +143,7 @@ public class Driver implements java.sql.Driver {
for (int i = urls.size() - 1; i >= 0; i--) {
URL url = urls.get(i);
- if (logger.logDebug()) {
- logger.debug("Loading driver configuration from: " + url);
- }
+ LOGGER.log(Level.FINE, "Loading driver configuration from: {0}", url);
InputStream is = url.openStream();
merged.load(is);
is.close();
@@ -219,7 +200,8 @@ public class Driver implements java.sql.Driver {
* @throws SQLException if a database access error occurs
* @see java.sql.Driver#connect
*/
- public java.sql.Connection connect(String url, Properties info) throws SQLException {
+ @Override
+ public Connection connect(String url, Properties info) throws SQLException {
// get defaults
Properties defaults;
@@ -236,9 +218,8 @@ public class Driver implements java.sql.Driver {
// override defaults with provided properties
Properties props = new Properties(defaults);
if (info != null) {
- Enumeration<?> e = info.propertyNames();
- while (e.hasMoreElements()) {
- String propName = (String) e.nextElement();
+ Set<String> e = info.stringPropertyNames();
+ for (String propName : e) {
String propValue = info.getProperty(propName);
if (propValue == null) {
throw new PSQLException(
@@ -251,13 +232,14 @@ public class Driver implements java.sql.Driver {
}
// parse URL and add more properties
if ((props = parseURL(url, props)) == null) {
- logger.debug("Error in url: " + url);
+ LOGGER.log(Level.SEVERE, "Error in url: {0}", url);
return null;
}
try {
- if (logger.logDebug()) {
- logger.debug("Connecting with URL: " + url);
- }
+ // Setup java.util.logging.Logger using connection properties.
+ setupLoggerFromProperties(props);
+
+ LOGGER.log(Level.FINE, "Connecting with URL: {0}", url);
// Enforce login timeout, if specified, by running the connection
// attempt in a separate thread. If we hit the timeout without the
@@ -278,7 +260,7 @@ public class Driver implements java.sql.Driver {
thread.start();
return ct.getResult(timeout);
} catch (PSQLException ex1) {
- logger.debug("Connection error:", ex1);
+ LOGGER.log(Level.SEVERE, "Connection error: ", ex1);
// re-throw the exception, otherwise it will be caught next, and a
// org.postgresql.unusual error will be returned instead.
throw ex1;
@@ -288,7 +270,7 @@ public class Driver implements java.sql.Driver {
"Your security policy has prevented the connection from being attempted. You probably need to grant the connect java.net.SocketPermission to the database server host and port that you wish to connect to."),
PSQLState.UNEXPECTED_ERROR, ace);
} catch (Exception ex2) {
- logger.debug("Unexpected connection error:", ex2);
+ LOGGER.log(Level.SEVERE, "Unexpected connection error: ", ex2);
throw new PSQLException(
GT.tr(
"Something unusual has occurred to cause the driver to fail. Please report this exception."),
@@ -296,6 +278,72 @@ public class Driver implements java.sql.Driver {
}
}
+ // Used to check if the handler file is the same
+ private static String loggerHandlerFile;
+
+ /**
+ * Setup java.util.logging.Logger using connection properties.
+ * <p>
+ * See {@link PGProperty#LOGGER_FILE} and {@link PGProperty#LOGGER_FILE}
+ *
+ * @param props Connection Properties
+ */
+ private void setupLoggerFromProperties(final Properties props) {
+ final String driverLogLevel = PGProperty.LOGGER_LEVEL.get(props);
+ if (driverLogLevel == null) {
+ return; // Don't mess with Logger if not set
+ }
+ if ("OFF".equalsIgnoreCase(driverLogLevel)) {
+ PARENT_LOGGER.setLevel(Level.OFF);
+ return; // Don't mess with Logger if set to OFF
+ } else if ("DEBUG".equalsIgnoreCase(driverLogLevel)) {
+ PARENT_LOGGER.setLevel(Level.FINE);
+ } else if ("TRACE".equalsIgnoreCase(driverLogLevel)) {
+ PARENT_LOGGER.setLevel(Level.FINEST);
+ }
+
+ ExpressionProperties exprProps = new ExpressionProperties(props, System.getProperties());
+ final String driverLogFile = PGProperty.LOGGER_FILE.get(exprProps);
+ if (driverLogFile != null && driverLogFile.equals(loggerHandlerFile)) {
+ return; // Same file output, do nothing.
+ }
+
+ for (java.util.logging.Handler handlers : PARENT_LOGGER.getHandlers()) {
+ // Remove previously set Handlers
+ handlers.close();
+ PARENT_LOGGER.removeHandler(handlers);
+ loggerHandlerFile = null;
+ }
+
+ java.util.logging.Handler handler = null;
+ if (driverLogFile != null) {
+ try {
+ handler = new java.util.logging.FileHandler(driverLogFile);
+ loggerHandlerFile = driverLogFile;
+ } catch (Exception ex) {
+ System.err.println("Cannot enable FileHandler, fallback to ConsoleHandler.");
+ }
+ }
+
+ Formatter formatter = new SimpleFormatter();
+
+ if ( handler == null ) {
+ if (DriverManager.getLogWriter() != null) {
+ handler = new WriterHandler(DriverManager.getLogWriter());
+ } else if ( DriverManager.getLogStream() != null) {
+ handler = new StreamHandler(DriverManager.getLogStream(), formatter);
+ } else {
+ handler = new StreamHandler(System.err, formatter);
+ }
+ } else {
+ handler.setFormatter(formatter);
+ }
+
+ handler.setLevel(PARENT_LOGGER.getLevel());
+ PARENT_LOGGER.setUseParentHandlers(false);
+ PARENT_LOGGER.addHandler(handler);
+ }
+
/**
* Perform a connect in a separate thread; supports getting the results from the original thread
* while enforcing a login timeout.
@@ -413,6 +461,7 @@ public class Driver implements java.sql.Driver {
* @return true if this driver accepts the given URL
* @see java.sql.Driver#acceptsURL
*/
+ @Override
public boolean acceptsURL(String url) {
return parseURL(url, null) != null;
}
@@ -431,6 +480,7 @@ public class Driver implements java.sql.Driver {
* be an empty array if no properties are required
* @see java.sql.Driver#getPropertyInfo
*/
+ @Override
public DriverPropertyInfo[] getPropertyInfo(String url, Properties info) {
Properties copy = new Properties(info);
Properties parse = parseURL(url, copy);
@@ -447,37 +497,25 @@ public class Driver implements java.sql.Driver {
return props;
}
- public static final int MAJORVERSION =
- /*$mvn.project.property.parsedversion.majorversion+";"$*//*-*/9;
-
- /**
- * Gets the drivers major version number
- *
- * @return the drivers major version number
- */
+ @Override
public int getMajorVersion() {
- return MAJORVERSION;
+ return org.postgresql.util.DriverInfo.MAJOR_VERSION;
}
- public static final int MINORVERSION =
- /*$mvn.project.property.parsedversion.minorversion+";"$*//*-*/4;
-
- /**
- * Get the drivers minor version number
- *
- * @return the drivers minor version number
- */
+ @Override
public int getMinorVersion() {
- return MINORVERSION;
+ return org.postgresql.util.DriverInfo.MINOR_VERSION;
}
/**
* Returns the server version series of this driver and the specific build number.
*
* @return JDBC driver version
+ * @deprecated use {@link #getMajorVersion()} and {@link #getMinorVersion()} instead
*/
+ @Deprecated
public static String getVersion() {
- return "PostgreSQL /*$mvn.project.property.parsedversion.osgiversion$*/";
+ return DriverInfo.DRIVER_FULL_NAME;
}
/**
@@ -488,6 +526,7 @@ public class Driver implements java.sql.Driver {
* <p>
* For PostgreSQL, this is not yet possible, as we are not SQL92 compliant (yet).
*/
+ @Override
public boolean jdbcCompliant() {
return false;
}
@@ -527,9 +566,7 @@ public class Driver implements java.sql.Driver {
String[] addresses = l_urlServer.substring(0, slash).split(",");
StringBuilder hosts = new StringBuilder();
StringBuilder ports = new StringBuilder();
- for (int addr = 0; addr < addresses.length; ++addr) {
- String address = addresses[addr];
-
+ for (String address : addresses) {
int portIdx = address.lastIndexOf(':');
if (portIdx != -1 && address.lastIndexOf(']') < portIdx) {
String portStr = address.substring(portIdx + 1);
@@ -554,9 +591,19 @@ public class Driver implements java.sql.Driver {
urlProps.setProperty("PGPORT", ports.toString());
urlProps.setProperty("PGHOST", hosts.toString());
} else {
- urlProps.setProperty("PGPORT", "/*$mvn.project.property.template.default.pg.port$*/");
- urlProps.setProperty("PGHOST", "localhost");
- urlProps.setProperty("PGDBNAME", URLDecoder.decode(l_urlServer));
+ /*
+ if there are no defaults set or any one of PORT, HOST, DBNAME not set
+ then set it to default
+ */
+ if (defaults == null || !defaults.containsKey("PGPORT")) {
+ urlProps.setProperty("PGPORT", "/*$mvn.project.property.template.default.pg.port$*/");
+ }
+ if (defaults == null || !defaults.containsKey("PGHOST")) {
+ urlProps.setProperty("PGHOST", "localhost");
+ }
+ if (defaults == null || !defaults.containsKey("PGDBNAME")) {
+ urlProps.setProperty("PGDBNAME", URLDecoder.decode(l_urlServer));
+ }
}
// parse the args part of the url
@@ -612,11 +659,7 @@ public class Driver implements java.sql.Driver {
try {
return (long) (Float.parseFloat(timeout) * 1000);
} catch (NumberFormatException e) {
- // Log level isn't set yet, so this doesn't actually
- // get printed.
- if (logger.logDebug()) {
- logger.debug("Couldn't parse loginTimeout value: " + timeout);
- }
+ LOGGER.log(Level.WARNING, "Couldn't parse loginTimeout value: {0}", timeout);
}
}
return (long) DriverManager.getLoginTimeout() * 1000;
@@ -640,29 +683,12 @@ public class Driver implements java.sql.Driver {
PSQLState.NOT_IMPLEMENTED.getState());
}
- /**
- * used to turn logging on to a certain level, can be called by specifying fully qualified class
- * ie org.postgresql.Driver.setLogLevel()
- *
- * @param logLevel sets the level which logging will respond to OFF turn off logging INFO being
- * almost no messages DEBUG most verbose
- */
- public static void setLogLevel(int logLevel) {
- synchronized (Driver.class) {
- logger.setLogLevel(logLevel);
- logLevelSet = true;
- }
- }
-
- public static int getLogLevel() {
- synchronized (Driver.class) {
- return logger.getLogLevel();
- }
- }
-
- public java.util.logging.Logger getParentLogger() throws SQLFeatureNotSupportedException {
- throw notImplemented(this.getClass(), "getParentLogger()");
+ //#if mvn.project.property.postgresql.jdbc.spec >= "JDBC4.1"
+ @Override
+ public java.util.logging.Logger getParentLogger() {
+ return PARENT_LOGGER;
}
+ //#endif
public static SharedTimer getSharedTimer() {
return sharedTimer;
diff --git a/pgjdbc/src/main/java/org/postgresql/PGConnection.java b/pgjdbc/src/main/java/org/postgresql/PGConnection.java
index 01a3575..ad2172a 100644
--- a/pgjdbc/src/main/java/org/postgresql/PGConnection.java
+++ b/pgjdbc/src/main/java/org/postgresql/PGConnection.java
@@ -10,8 +10,10 @@ import org.postgresql.fastpath.Fastpath;
import org.postgresql.jdbc.AutoSave;
import org.postgresql.jdbc.PreferQueryMode;
import org.postgresql.largeobject.LargeObjectManager;
+import org.postgresql.replication.PGReplicationConnection;
import org.postgresql.util.PGobject;
+import java.sql.Array;
import java.sql.SQLException;
import java.sql.Statement;
@@ -20,6 +22,25 @@ import java.sql.Statement;
* returned by the PostgreSQL driver implement PGConnection.
*/
public interface PGConnection {
+
+ /**
+ * Creates an {@link Array} wrapping <i>elements</i>. This is similar to
+ * {@link java.sql.Connection#createArrayOf(String, Object[])}, but also
+ * provides support for primitive arrays.
+ *
+ * @param typeName
+ * The SQL name of the type to map the <i>elements</i> to.
+ * Must not be {@code null}.
+ * @param elements
+ * The array of objects to map. A {@code null} value will result in
+ * an {@link Array} representing {@code null}.
+ * @return An {@link Array} wrapping <i>elements</i>.
+ * @throws SQLException
+ * If for some reason the array cannot be created.
+ * @see java.sql.Connection#createArrayOf(String, Object[])
+ */
+ Array createArrayOf(String typeName, Object elements) throws SQLException;
+
/**
* This method returns any notifications that have been received since the last call to this
* method. Returns null if there have been no notifications.
@@ -31,6 +52,20 @@ public interface PGConnection {
PGNotification[] getNotifications() throws SQLException;
/**
+ * This method returns any notifications that have been received since the last call to this
+ * method. Returns null if there have been no notifications. A timeout can be specified so the
+ * driver waits for notifications.
+ *
+ * @param timeoutMillis when 0, blocks forever. when > 0, blocks up to the specified number of millies
+ * or until at least one notification has been received. If more than one notification is
+ * about to be received, these will be returned in one batch.
+ * @return notifications that have been received
+ * @throws SQLException if something wrong happens
+ * @since 43
+ */
+ PGNotification[] getNotifications(int timeoutMillis) throws SQLException;
+
+ /**
* This returns the COPY API for the current connection.
*
* @return COPY API for the current connection
@@ -68,6 +103,7 @@ public interface PGConnection {
* does not work correctly for registering classes that cannot be directly loaded by
* the JDBC driver's classloader.
*/
+ @Deprecated
void addDataType(String type, String className);
/**
@@ -168,12 +204,14 @@ public interface PGConnection {
String escapeLiteral(String literal) throws SQLException;
/**
- * Returns true if the connection is configured to use "simple 'Q' execute" commands only
- * When running in simple protocol only, certain features are not available: callable statements,
+ * Returns the query mode for this connection.
+ * <p>
+ * When running in simple query mode, certain features are not available: callable statements,
* partial result set fetch, bytea type, etc.
* The list of supported features is subject to change.
*
- * @return true if the connection is configured to use "simple 'Q' execute" commands only
+ * @return the preferred query mode
+ * @see PreferQueryMode
*/
PreferQueryMode getPreferQueryMode();
@@ -192,4 +230,9 @@ public interface PGConnection {
* @param autoSave connection configuration regarding automatic per-query savepoints
*/
void setAutosave(AutoSave autoSave);
+
+ /**
+ * @return replication API for the current connection
+ */
+ PGReplicationConnection getReplicationAPI();
}
diff --git a/pgjdbc/src/main/java/org/postgresql/PGProperty.java b/pgjdbc/src/main/java/org/postgresql/PGProperty.java
index b949f93..9217694 100644
--- a/pgjdbc/src/main/java/org/postgresql/PGProperty.java
+++ b/pgjdbc/src/main/java/org/postgresql/PGProperty.java
@@ -5,6 +5,7 @@
package org.postgresql;
+import org.postgresql.util.DriverInfo;
import org.postgresql.util.GT;
import org.postgresql.util.PSQLException;
import org.postgresql.util.PSQLState;
@@ -51,13 +52,33 @@ public enum PGProperty {
* fallback.
*/
PROTOCOL_VERSION("protocolVersion", null,
- "Force use of a particular protocol version when connecting, if set, disables protocol version fallback.",
- false, "2", "3"),
+ "Force use of a particular protocol version when connecting, currently only version 3 is supported.",
+ false, "3"),
/**
- * The loglevel. Can be one of {@link Driver#DEBUG}, {@link Driver#INFO}, {@link Driver#OFF}.
+ * Logger level of the driver. Allowed values: {@code OFF}, {@code DEBUG} or {@code TRACE}.
+ * <p>
+ * This enable the {@link java.util.logging.Logger} of the driver based on the following mapping
+ * of levels:
+ * <p>
+ * FINE -> DEBUG<br>
+ * FINEST -> TRACE
+ * <p>
+ * <b>NOTE:</b> The recommended approach to enable java.util.logging is using a
+ * {@code logging.properties} configuration file with the property
+ * {@code -Djava.util.logging.config.file=myfile} or if your are using an application server
+ * you should use the appropriate logging subsystem.
+ */
+ LOGGER_LEVEL("loggerLevel", null, "Logger level of the driver", false, "OFF", "DEBUG", "TRACE"),
+
+ /**
+ * File name output of the Logger, if set, the Logger will use a
+ * {@link java.util.logging.FileHandler} to write to a specified file. If the parameter is not set
+ * or the file can't be created the {@link java.util.logging.ConsoleHandler} will be used instead.
+ * <p>
+ * Parameter should be use together with {@link PGProperty#LOGGER_LEVEL}
*/
- LOG_LEVEL("loglevel", "0", "The log level", false, "0", "1", "2"),
+ LOGGER_FILE("loggerFile", null, "File name output of the Logger"),
/**
* Sets the default threshold for enabling server-side prepare. A value of {@code -1} stands for
@@ -106,12 +127,6 @@ public enum PGProperty {
"Use binary format for sending and receiving data if possible"),
/**
- * Force compatibility of some features with an older version of the driver.
- */
- COMPATIBLE("compatible", Driver.MAJORVERSION + "." + Driver.MINORVERSION,
- "Force compatibility of some features with an older version of the driver"),
-
- /**
* Puts this connection in read-only mode.
*/
READ_ONLY("readOnly", "false", "Puts this connection in read-only mode"),
@@ -166,7 +181,8 @@ public enum PGProperty {
* {@code verify-full}, or {@code disable} ({@code allow} and {@code prefer} are not implemented)
* If not set, the {@code ssl} property may be checked to enable SSL mode.
*/
- SSL_MODE("sslmode", null, "Parameter governing the use of SSL"),
+ SSL_MODE("sslmode", null, "Parameter governing the use of SSL",false,
+ "disable", "require", "verify-ca", "verify-full"),
/**
* Classname of the SSL Factory to use (instance of {@code javax.net.ssl.SSLSocketFactory}).
@@ -287,7 +303,14 @@ public enum PGProperty {
/**
* The application name (require server version >= 9.0)
*/
- APPLICATION_NAME("ApplicationName", null, "name of the application (backend >= 9.0)"),
+ APPLICATION_NAME("ApplicationName", DriverInfo.DRIVER_NAME, "Name of the Application (backend >= 9.0)"),
+
+ /**
+ * Flag to enable/disable obtaining a GSS credential via JAAS login before authenticating.
+ * Useful if setting system property javax.security.auth.useSubjectCredsOnly=false
+ * or using native GSS with system property sun.security.jgss.native=true
+ */
+ JAAS_LOGIN("jaasLogin", "true", "Login with JAAS before doing GSSAPI authentication"),
/**
* Specifies the name of the JAAS system or application login configuration.
@@ -324,13 +347,6 @@ public enum PGProperty {
SSPI_SERVICE_CLASS("sspiServiceClass", "POSTGRES", "The Windows SSPI service class for SPN"),
/**
- * The character set to use for data sent to the database or received from the database. This
- * property is only relevant for server versions less than or equal to 7.2.
- */
- CHARSET("charSet", null,
- "The character set to use for data sent to the database or received from the database (for backend <= 7.2)"),
-
- /**
* When using the V3 protocol the driver monitors changes in certain server configuration
* parameters that should not be touched by end users. The {@code client_encoding} setting is set
* by the driver and should not be altered. If the driver detects a change it will abort the
@@ -345,36 +361,36 @@ public enum PGProperty {
CURRENT_SCHEMA("currentSchema", null, "Specify the schema to be set in the search-path"),
TARGET_SERVER_TYPE("targetServerType", "any", "Specifies what kind of server to connect", false,
- "any", "master", "slave", "preferSlave"),
+ "any", "master", "slave", "secondary", "preferSlave", "preferSecondary"),
LOAD_BALANCE_HOSTS("loadBalanceHosts", "false",
"If disabled hosts are connected in the given order. If enabled hosts are chosen randomly from the set of suitable candidates"),
HOST_RECHECK_SECONDS("hostRecheckSeconds", "10",
- "Specifies period (seconds) after host statuses are checked again in case they have changed"),
+ "Specifies period (seconds) after which the host status is checked again in case it has changed"),
/**
* Specifies which mode is used to execute queries to database: simple means ('Q' execute, no parse, no bind, text mode only),
* extended means always use bind/execute messages, extendedForPrepared means extended for prepared statements only,
- * extendedCacheEveryting means use extended protocol and try cache every statement (including Statement.execute(String sql)) in a query cache.
+ * extendedCacheEverything means use extended protocol and try cache every statement (including Statement.execute(String sql)) in a query cache.
*
* This mode is meant for debugging purposes and/or for cases when extended protocol cannot be used (e.g. logical replication protocol)
*/
PREFER_QUERY_MODE("preferQueryMode", "extended",
"Specifies which mode is used to execute queries to database: simple means ('Q' execute, no parse, no bind, text mode only), "
+ "extended means always use bind/execute messages, extendedForPrepared means extended for prepared statements only, "
- + "extendedCacheEveryting means use extended protocol and try cache every statement (including Statement.execute(String sql)) in a query cache.", false,
- "extended", "extendedForPrepared", "extendedCacheEveryting", "simple"),
+ + "extendedCacheEverything means use extended protocol and try cache every statement (including Statement.execute(String sql)) in a query cache.", false,
+ "extended", "extendedForPrepared", "extendedCacheEverything", "simple"),
/**
- * Specifies what the driver should do if a query fails. In {@code autosave=always} mode, JDBC driver sets a safepoint before each query,
- * and rolls back to that safepoint in case of failure. In {@code autosave=never} mode (default), no safepoint dance is made ever.
- * In {@code autosave=conservative} mode, safepoint is set for each query, however the rollback is done only for rare cases
+ * Specifies what the driver should do if a query fails. In {@code autosave=always} mode, JDBC driver sets a savepoint before each query,
+ * and rolls back to that savepoint in case of failure. In {@code autosave=never} mode (default), no savepoint dance is made ever.
+ * In {@code autosave=conservative} mode, savepoint is set for each query, however the rollback is done only for rare cases
* like 'cached statement cannot change return type' or 'statement XXX is not valid' so JDBC driver rollsback and retries
*/
AUTOSAVE("autosave", "never",
- "Specifies what the driver should do if a query fails. In autosave=always mode, JDBC driver sets a safepoint before each query, "
- + "and rolls back to that safepoint in case of failure. In autosave=never mode (default), no safepoint dance is made ever. "
+ "Specifies what the driver should do if a query fails. In autosave=always mode, JDBC driver sets a savepoint before each query, "
+ + "and rolls back to that savepoint in case of failure. In autosave=never mode (default), no savepoint dance is made ever. "
+ "In autosave=conservative mode, safepoint is set for each query, however the rollback is done only for rare cases"
+ " like 'cached statement cannot change return type' or 'statement XXX is not valid' so JDBC driver rollsback and retries", false,
"always", "never", "conservative"),
@@ -382,8 +398,28 @@ public enum PGProperty {
/**
* Configure optimization to enable batch insert re-writing.
*/
- REWRITE_BATCHED_INSERTS ("reWriteBatchedInserts", "false",
- "Enable optimization to rewrite and collapse compatible INSERT statements that are batched.");
+ REWRITE_BATCHED_INSERTS("reWriteBatchedInserts", "false",
+ "Enable optimization to rewrite and collapse compatible INSERT statements that are batched."),
+
+ /**
+ * <p>Connection parameter passed in the startup message. This parameter accepts two values; "true"
+ * and "database". Passing "true" tells the backend to go into walsender mode, wherein a small set
+ * of replication commands can be issued instead of SQL statements. Only the simple query protocol
+ * can be used in walsender mode. Passing "database" as the value instructs walsender to connect
+ * to the database specified in the dbname parameter, which will allow the connection to be used
+ * for logical replication from that database. <p>Parameter should be use together with {@link
+ * PGProperty#ASSUME_MIN_SERVER_VERSION} with parameter >= 9.4 (backend >= 9.4)
+ */
+ REPLICATION("replication", null,
+ "Connection parameter passed in startup message, one of 'true' or 'database' "
+ + "Passing 'true' tells the backend to go into walsender mode, "
+ + "wherein a small set of replication commands can be issued instead of SQL statements. "
+ + "Only the simple query protocol can be used in walsender mode. "
+ + "Passing 'database' as the value instructs walsender to connect "
+ + "to the database specified in the dbname parameter, "
+ + "which will allow the connection to be used for logical replication "
+ + "from that database. "
+ + "(backend >= 9.4)");
private String _name;
private String _defaultValue;
@@ -391,15 +427,15 @@ public enum PGProperty {
private String _description;
private String[] _choices;
- private PGProperty(String name, String defaultValue, String description) {
+ PGProperty(String name, String defaultValue, String description) {
this(name, defaultValue, description, false);
}
- private PGProperty(String name, String defaultValue, String description, boolean required) {
+ PGProperty(String name, String defaultValue, String description, boolean required) {
this(name, defaultValue, description, required, (String[]) null);
}
- private PGProperty(String name, String defaultValue, String description, boolean required,
+ PGProperty(String name, String defaultValue, String description, boolean required,
String... choices) {
_name = name;
_defaultValue = defaultValue;
diff --git a/pgjdbc/src/main/java/org/postgresql/PGRefCursorResultSet.java b/pgjdbc/src/main/java/org/postgresql/PGRefCursorResultSet.java
index 293aa0c..8fc678b 100644
--- a/pgjdbc/src/main/java/org/postgresql/PGRefCursorResultSet.java
+++ b/pgjdbc/src/main/java/org/postgresql/PGRefCursorResultSet.java
@@ -12,6 +12,7 @@ package org.postgresql;
* code should call getString() on the ResultSet that contains the refcursor to obtain
* the underlying cursor name.
*/
+ at Deprecated
public interface PGRefCursorResultSet {
/**
@@ -19,5 +20,6 @@ public interface PGRefCursorResultSet {
* @deprecated As of 8.0, replaced with calling getString() on the ResultSet that this ResultSet
* was obtained from.
*/
+ @Deprecated
String getRefCursor();
}
diff --git a/pgjdbc/src/main/java/org/postgresql/PGResultSetMetaData.java b/pgjdbc/src/main/java/org/postgresql/PGResultSetMetaData.java
index a69e94c..92a3ca0 100644
--- a/pgjdbc/src/main/java/org/postgresql/PGResultSetMetaData.java
+++ b/pgjdbc/src/main/java/org/postgresql/PGResultSetMetaData.java
@@ -45,7 +45,7 @@ public interface PGResultSetMetaData {
* Is a column Text or Binary?
*
* @param column column position (1-based)
- * @return if column is Text or Binary
+ * @return 0 if column data foramt is TEXT, or 1 if BINARY
* @throws SQLException if something wrong happens
* @see Field#BINARY_FORMAT
* @see Field#TEXT_FORMAT
diff --git a/pgjdbc/src/main/java/org/postgresql/PGStatement.java b/pgjdbc/src/main/java/org/postgresql/PGStatement.java
index c11adb9..b1d5387 100644
--- a/pgjdbc/src/main/java/org/postgresql/PGStatement.java
+++ b/pgjdbc/src/main/java/org/postgresql/PGStatement.java
@@ -43,6 +43,7 @@ public interface PGStatement {
* @since 7.3
* @deprecated As of build 302, replaced by {@link #setPrepareThreshold(int)}
*/
+ @Deprecated
void setUseServerPrepare(boolean flag) throws SQLException;
/**
diff --git a/pgjdbc/src/main/java/org/postgresql/copy/CopyDual.java b/pgjdbc/src/main/java/org/postgresql/copy/CopyDual.java
new file mode 100644
index 0000000..c5db1df
--- /dev/null
+++ b/pgjdbc/src/main/java/org/postgresql/copy/CopyDual.java
@@ -0,0 +1,16 @@
+/*
+ * Copyright (c) 2016, PostgreSQL Global Development Group
+ * See the LICENSE file in the project root for more information.
+ */
+
+package org.postgresql.copy;
+
+/**
+ * Bidirectional via copy stream protocol. Via bidirectional copy protocol work PostgreSQL
+ * replication.
+ *
+ * @see CopyIn
+ * @see CopyOut
+ */
+public interface CopyDual extends CopyIn, CopyOut {
+}
diff --git a/pgjdbc/src/main/java/org/postgresql/copy/CopyManager.java b/pgjdbc/src/main/java/org/postgresql/copy/CopyManager.java
index ff331c8..1ea3838 100644
--- a/pgjdbc/src/main/java/org/postgresql/copy/CopyManager.java
+++ b/pgjdbc/src/main/java/org/postgresql/copy/CopyManager.java
@@ -32,7 +32,7 @@ public class CopyManager {
// do figure it out we can just set it here and they reap the rewards.
// Note that this is currently being used for both a number of bytes and a number
// of characters.
- final static int DEFAULT_BUFFER_SIZE = 65536;
+ static final int DEFAULT_BUFFER_SIZE = 65536;
private final Encoding encoding;
private final QueryExecutor queryExecutor;
@@ -66,6 +66,17 @@ public class CopyManager {
}
}
+ public CopyDual copyDual(String sql) throws SQLException {
+ CopyOperation op = queryExecutor.startCopy(sql, connection.getAutoCommit());
+ if (op == null || op instanceof CopyDual) {
+ return (CopyDual) op;
+ } else {
+ op.cancelCopy();
+ throw new PSQLException(GT.tr("Requested CopyDual but got {0}", op.getClass().getName()),
+ PSQLState.WRONG_OBJECT_TYPE);
+ }
+ }
+
/**
* Pass results of a COPY TO STDOUT query from database into a Writer.
*
diff --git a/pgjdbc/src/main/java/org/postgresql/copy/CopyOut.java b/pgjdbc/src/main/java/org/postgresql/copy/CopyOut.java
index da5c505..70c6f06 100644
--- a/pgjdbc/src/main/java/org/postgresql/copy/CopyOut.java
+++ b/pgjdbc/src/main/java/org/postgresql/copy/CopyOut.java
@@ -8,5 +8,22 @@ package org.postgresql.copy;
import java.sql.SQLException;
public interface CopyOut extends CopyOperation {
+ /**
+ * Blocks wait for a row of data to be received from server on an active copy operation.
+ *
+ * @return byte array received from server, null if server complete copy operation
+ * @throws SQLException if something goes wrong for example socket timeout
+ */
byte[] readFromCopy() throws SQLException;
+
+ /**
+ * Wait for a row of data to be received from server on an active copy operation.
+ *
+ * @param block {@code true} if need wait data from server otherwise {@code false} and will read
+ * pending message from server
+ * @return byte array received from server, if pending message from server absent and use no
+ * blocking mode return null
+ * @throws SQLException if something goes wrong for example socket timeout
+ */
+ byte[] readFromCopy(boolean block) throws SQLException;
}
diff --git a/pgjdbc/src/main/java/org/postgresql/copy/PGCopyInputStream.java b/pgjdbc/src/main/java/org/postgresql/copy/PGCopyInputStream.java
index 2e4b2bb..0a166a9 100644
--- a/pgjdbc/src/main/java/org/postgresql/copy/PGCopyInputStream.java
+++ b/pgjdbc/src/main/java/org/postgresql/copy/PGCopyInputStream.java
@@ -112,6 +112,11 @@ public class PGCopyInputStream extends InputStream implements CopyOut {
return result;
}
+ @Override
+ public byte[] readFromCopy(boolean block) throws SQLException {
+ return readFromCopy();
+ }
+
public void close() throws IOException {
// Don't complain about a double close.
if (op == null) {
diff --git a/pgjdbc/src/main/java/org/postgresql/core/BaseConnection.java b/pgjdbc/src/main/java/org/postgresql/core/BaseConnection.java
index 705cf6d..2e03611 100644
--- a/pgjdbc/src/main/java/org/postgresql/core/BaseConnection.java
+++ b/pgjdbc/src/main/java/org/postgresql/core/BaseConnection.java
@@ -56,6 +56,14 @@ public interface BaseConnection extends PGConnection, Connection {
QueryExecutor getQueryExecutor();
/**
+ * Internal protocol for work with physical and logical replication. Physical replication available
+ * only since PostgreSQL version 9.1. Logical replication available only since PostgreSQL version 9.4.
+ *
+ * @return not null replication protocol
+ */
+ ReplicationProtocol getReplicationProtocol();
+
+ /**
* Construct and return an appropriate object for the given type and value. This only considers
* the types registered via {@link org.postgresql.PGConnection#addDataType(String, Class)} and
* {@link org.postgresql.PGConnection#addDataType(String, String)}.
@@ -76,62 +84,6 @@ public interface BaseConnection extends PGConnection, Connection {
TypeInfo getTypeInfo();
/**
- * Check if we should use driver behaviour introduced in a particular driver version. This
- * defaults to behaving as the actual driver's version but can be overridden by the "compatible"
- * URL parameter.
- *
- * If possible you should use the integer version of this method instead. It was introduced with
- * the 9.4 driver release.
- *
- * @param ver the driver version to check
- * @return true if the driver's behavioural version is at least "ver".
- * @deprecated Avoid using this in new code that can require PgJDBC 9.4.
- */
- @Deprecated
- boolean haveMinimumCompatibleVersion(String ver);
-
- /**
- * Check if we should use driver behaviour introduced in a particular driver version.
- *
- * This defaults to behaving as the actual driver's version but can be overridden by the
- * "compatible" URL parameter.
- *
- * The version is of the form xxyyzz, e.g. 90401 for PgJDBC 9.4.1.
- *
- * This is used to toggle between different functionality as it changes across different releases
- * of the jdbc driver code. The values here are versions of the jdbc client and not server
- * versions. For example in 7.1 get/setBytes worked on LargeObject values, in 7.2 these methods
- * were changed to work on bytea values. This change in functionality could be disabled by setting
- * the "compatible" level to be 7.1, in which case the driver will revert to the 7.1
- * functionality.
- *
- * @param ver the driver version to check, eg 90401 for 9.4.1
- * @return true if the driver's behavioural version is at least "ver".
- */
- boolean haveMinimumCompatibleVersion(int ver);
-
- /**
- * Check if we should use driver behaviour introduced in a particular driver version.
- *
- * This defaults to behaving as the actual driver's version but can be overridden by the
- * "compatible" URL parameter.
- *
- * @param ver the driver version to check
- * @return true if the driver's behavioural version is at least "ver".
- */
- boolean haveMinimumCompatibleVersion(Version ver);
-
- /**
- * Check if we have at least a particular server version.
- *
- * @param ver the server version to check
- * @return true if the server version is at least "ver".
- * @deprecated Use haveMinimumServerVersion(int) instead
- */
- @Deprecated
- boolean haveMinimumServerVersion(String ver);
-
- /**
* Check if we have at least a particular server version.
*
* The input version is of the form xxyyzz, matching a PostgreSQL version like xx.yy.zz. So 9.0.12
@@ -189,7 +141,7 @@ public interface BaseConnection extends PGConnection, Connection {
TimestampUtils getTimestampUtils();
// Get the per-connection logger.
- Logger getLogger();
+ java.util.logging.Logger getLogger();
// Get the bind-string-as-varchar config flag
boolean getStringVarcharFlag();
diff --git a/pgjdbc/src/main/java/org/postgresql/core/CachedQueryCreateAction.java b/pgjdbc/src/main/java/org/postgresql/core/CachedQueryCreateAction.java
index 1e5006b..2f7c087 100644
--- a/pgjdbc/src/main/java/org/postgresql/core/CachedQueryCreateAction.java
+++ b/pgjdbc/src/main/java/org/postgresql/core/CachedQueryCreateAction.java
@@ -15,10 +15,10 @@ import java.util.List;
* Creates an instance of {@link CachedQuery} for a given connection.
*/
class CachedQueryCreateAction implements LruCache.CreateAction<Object, CachedQuery> {
- private final static String[] EMPTY_RETURNING = new String[0];
+ private static final String[] EMPTY_RETURNING = new String[0];
private final QueryExecutor queryExecutor;
- public CachedQueryCreateAction(QueryExecutor queryExecutor) {
+ CachedQueryCreateAction(QueryExecutor queryExecutor) {
this.queryExecutor = queryExecutor;
}
diff --git a/pgjdbc/src/main/java/org/postgresql/core/CallableQueryKey.java b/pgjdbc/src/main/java/org/postgresql/core/CallableQueryKey.java
index f453a85..d65ab18 100644
--- a/pgjdbc/src/main/java/org/postgresql/core/CallableQueryKey.java
+++ b/pgjdbc/src/main/java/org/postgresql/core/CallableQueryKey.java
@@ -11,7 +11,8 @@ package org.postgresql.core;
* syntax, thus a special cache key class is used to trigger proper parsing for callable statements.
*/
class CallableQueryKey extends BaseQueryKey {
- public CallableQueryKey(String sql) {
+
+ CallableQueryKey(String sql) {
super(sql, true, true);
}
@@ -28,4 +29,10 @@ class CallableQueryKey extends BaseQueryKey {
public int hashCode() {
return super.hashCode() * 31;
}
+
+ @Override
+ public boolean equals(Object o) {
+ // Nothing interesting here, overriding equals to make hashCode and equals paired
+ return super.equals(o);
+ }
}
diff --git a/pgjdbc/src/main/java/org/postgresql/core/ConnectionFactory.java b/pgjdbc/src/main/java/org/postgresql/core/ConnectionFactory.java
index e7f7383..039fe06 100644
--- a/pgjdbc/src/main/java/org/postgresql/core/ConnectionFactory.java
+++ b/pgjdbc/src/main/java/org/postgresql/core/ConnectionFactory.java
@@ -29,7 +29,7 @@ public abstract class ConnectionFactory {
* If the "protocolVersion" property is specified, only that protocol version is tried. Otherwise,
* all protocols are tried in order, falling back to older protocols as necessary.
* <p>
- * Currently, protocol versions 3 (7.4+) and 2 (pre-7.4) are supported.
+ * Currently, protocol versions 3 (7.4+) is supported.
*
* @param hostSpecs at least one host and port to connect to; multiple elements for round-robin
* failover
@@ -37,19 +37,17 @@ public abstract class ConnectionFactory {
* @param database the database on the server to connect to; may not be null.
* @param info extra properties controlling the connection; notably, "password" if present
* supplies the password to authenticate with.
- * @param logger the logger to use for this connection
* @return the new, initialized, connection
* @throws SQLException if the connection could not be established.
*/
public static QueryExecutor openConnection(HostSpec[] hostSpecs, String user,
- String database, Properties info, Logger logger) throws SQLException {
+ String database, Properties info) throws SQLException {
String protoName = PGProperty.PROTOCOL_VERSION.get(info);
- if (protoName == null || "".equals(protoName)
- || "2".equals(protoName) || "3".equals(protoName)) {
+ if (protoName == null || protoName.isEmpty() || "3".equals(protoName)) {
ConnectionFactory connectionFactory = new ConnectionFactoryImpl();
- QueryExecutor queryExecutor =
- connectionFactory.openConnectionImpl(hostSpecs, user, database, info, logger);
+ QueryExecutor queryExecutor = connectionFactory.openConnectionImpl(
+ hostSpecs, user, database, info);
if (queryExecutor != null) {
return queryExecutor;
}
@@ -70,14 +68,13 @@ public abstract class ConnectionFactory {
* @param database the database on the server to connect to; may not be null.
* @param info extra properties controlling the connection; notably, "password" if present
* supplies the password to authenticate with.
- * @param logger the logger to use for this connection
* @return the new, initialized, connection, or <code>null</code> if this protocol version is not
* supported by the server.
* @throws SQLException if the connection could not be established for a reason other than
* protocol version incompatibility.
*/
public abstract QueryExecutor openConnectionImpl(HostSpec[] hostSpecs, String user,
- String database, Properties info, Logger logger) throws SQLException;
+ String database, Properties info) throws SQLException;
/**
* Safely close the given stream.
diff --git a/pgjdbc/src/main/java/org/postgresql/core/Encoding.java b/pgjdbc/src/main/java/org/postgresql/core/Encoding.java
index 557470f..db7f9bc 100644
--- a/pgjdbc/src/main/java/org/postgresql/core/Encoding.java
+++ b/pgjdbc/src/main/java/org/postgresql/core/Encoding.java
@@ -12,13 +12,20 @@ import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.io.Writer;
+import java.nio.charset.Charset;
import java.util.HashMap;
+import java.util.logging.Level;
+import java.util.logging.Logger;
/**
* Representation of a particular character encoding.
*/
public class Encoding {
- private static final Encoding DEFAULT_ENCODING = new Encoding(null);
+
+ private static final Logger LOGGER = Logger.getLogger(Encoding.class.getName());
+
+ private static final Encoding DEFAULT_ENCODING = new Encoding();
+ private static final Encoding UTF8_ENCODING = new Encoding("UTF-8");
/*
* Preferred JVM encodings for backend encodings.
@@ -28,10 +35,9 @@ public class Encoding {
static {
//Note: this list should match the set of supported server
// encodings found in backend/util/mb/encnames.c
- encodings.put("SQL_ASCII", new String[]{"ASCII", "us-ascii"});
+ encodings.put("SQL_ASCII", new String[]{"ASCII", "US-ASCII"});
encodings.put("UNICODE", new String[]{"UTF-8", "UTF8"});
- encodings.put("UTF8",
- new String[]{"UTF-8", "UTF8"}); // 8.1's canonical name for UNICODE changed.
+ encodings.put("UTF8", new String[]{"UTF-8", "UTF8"});
encodings.put("LATIN1", new String[]{"ISO8859_1"});
encodings.put("LATIN2", new String[]{"ISO8859_2"});
encodings.put("LATIN3", new String[]{"ISO8859_3"});
@@ -73,9 +79,28 @@ public class Encoding {
private final String encoding;
private final boolean fastASCIINumbers;
+ /**
+ * Uses the default charset of the JVM.
+ */
+ private Encoding() {
+ this(Charset.defaultCharset().name());
+ }
+
+ /**
+ * Use the charset passed as parameter.
+ *
+ * @param encoding charset name to use
+ */
protected Encoding(String encoding) {
+ if (encoding == null) {
+ throw new NullPointerException("Null encoding charset not supported");
+ }
this.encoding = encoding;
fastASCIINumbers = testAsciiNumbers();
+ if (LOGGER.isLoggable(Level.FINEST)) {
+ LOGGER.log(Level.FINEST, "Creating new Encoding {0} with fastASCIINumbers {1}",
+ new Object[]{encoding, fastASCIINumbers});
+ }
}
/**
@@ -96,14 +121,13 @@ public class Encoding {
* default JVM encoding if the specified encoding is unavailable.
*/
public static Encoding getJVMEncoding(String jvmEncoding) {
- if (isAvailable(jvmEncoding)) {
- if (jvmEncoding.equals("UTF-8") || jvmEncoding.equals("UTF8")) {
- return new UTF8Encoding(jvmEncoding);
- } else {
- return new Encoding(jvmEncoding);
- }
+ if ("UTF-8".equals(jvmEncoding)) {
+ return new UTF8Encoding(jvmEncoding);
+ }
+ if (Charset.isSupported(jvmEncoding)) {
+ return new Encoding(jvmEncoding);
} else {
- return defaultEncoding();
+ return DEFAULT_ENCODING;
}
}
@@ -115,14 +139,17 @@ public class Encoding {
* default JVM encoding if the specified encoding is unavailable.
*/
public static Encoding getDatabaseEncoding(String databaseEncoding) {
+ if ("UTF8".equals(databaseEncoding)) {
+ return UTF8_ENCODING;
+ }
// If the backend encoding is known and there is a suitable
// encoding in the JVM we use that. Otherwise we fall back
// to the default encoding of the JVM.
-
String[] candidates = encodings.get(databaseEncoding);
if (candidates != null) {
for (String candidate : candidates) {
- if (isAvailable(candidate)) {
+ LOGGER.log(Level.FINEST, "Search encoding candidate {0}", candidate);
+ if (Charset.isSupported(candidate)) {
return new Encoding(candidate);
}
}
@@ -130,12 +157,13 @@ public class Encoding {
// Try the encoding name directly -- maybe the charset has been
// provided by the user.
- if (isAvailable(databaseEncoding)) {
+ if (Charset.isSupported(databaseEncoding)) {
return new Encoding(databaseEncoding);
}
// Fall back to default JVM encoding.
- return defaultEncoding();
+ LOGGER.log(Level.FINEST, "{0} encoding not found, returning default encoding", databaseEncoding);
+ return DEFAULT_ENCODING;
}
/**
@@ -144,7 +172,7 @@ public class Encoding {
* @return the JVM encoding name used by this instance.
*/
public String name() {
- return encoding;
+ return Charset.isSupported(encoding) ? Charset.forName(encoding).name() : encoding;
}
/**
@@ -159,17 +187,13 @@ public class Encoding {
return null;
}
- if (encoding == null) {
- return s.getBytes();
- }
-
return s.getBytes(encoding);
}
/**
* Decode an array of bytes into a string.
*
- * @param encodedString a bytearray containing the encoded string the string to encod
+ * @param encodedString a byte array containing the string to decode
* @param offset the offset in <code>encodedString</code> of the first byte of the encoded
* representation
* @param length the length, in bytes, of the encoded representation
@@ -177,17 +201,13 @@ public class Encoding {
* @throws IOException if something goes wrong
*/
public String decode(byte[] encodedString, int offset, int length) throws IOException {
- if (encoding == null) {
- return new String(encodedString, offset, length);
- }
-
return new String(encodedString, offset, length, encoding);
}
/**
* Decode an array of bytes into a string.
*
- * @param encodedString a bytearray containing the encoded string the string to encod
+ * @param encodedString a byte array containing the string to decode
* @return the decoded string
* @throws IOException if something goes wrong
*/
@@ -203,10 +223,6 @@ public class Encoding {
* @throws IOException if something goes wrong
*/
public Reader getDecodingReader(InputStream in) throws IOException {
- if (encoding == null) {
- return new InputStreamReader(in);
- }
-
return new InputStreamReader(in, encoding);
}
@@ -218,10 +234,6 @@ public class Encoding {
* @throws IOException if something goes wrong
*/
public Writer getEncodingWriter(OutputStream out) throws IOException {
- if (encoding == null) {
- return new OutputStreamWriter(out);
- }
-
return new OutputStreamWriter(out, encoding);
}
@@ -234,23 +246,8 @@ public class Encoding {
return DEFAULT_ENCODING;
}
- /**
- * Test if an encoding is available in the JVM.
- *
- * @param encodingName the JVM encoding name to test
- * @return true iff the encoding is supported
- */
- private static boolean isAvailable(String encodingName) {
- try {
- "DUMMY".getBytes(encodingName); //NOSONAR
- return true;
- } catch (java.io.UnsupportedEncodingException e) {
- return false;
- }
- }
-
public String toString() {
- return (encoding == null ? "<default JVM encoding>" : encoding);
+ return encoding;
}
/**
diff --git a/pgjdbc/src/main/java/org/postgresql/core/EncodingPredictor.java b/pgjdbc/src/main/java/org/postgresql/core/EncodingPredictor.java
index c30d409..1ed55c0 100644
--- a/pgjdbc/src/main/java/org/postgresql/core/EncodingPredictor.java
+++ b/pgjdbc/src/main/java/org/postgresql/core/EncodingPredictor.java
@@ -43,7 +43,7 @@ public class EncodingPredictor {
}
}
- private final static Translation[] FATAL_TRANSLATIONS =
+ private static final Translation[] FATAL_TRANSLATIONS =
new Translation[]{
new Translation("ВАЖНО", null, "ru", "WIN", "ALT", "KOI8"),
new Translation("致命错误", null, "zh_CN", "EUC_CN", "GBK", "BIG5"),
diff --git a/pgjdbc/src/main/java/org/postgresql/core/JavaVersion.java b/pgjdbc/src/main/java/org/postgresql/core/JavaVersion.java
new file mode 100644
index 0000000..82773b2
--- /dev/null
+++ b/pgjdbc/src/main/java/org/postgresql/core/JavaVersion.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2017, PostgreSQL Global Development Group
+ * See the LICENSE file in the project root for more information.
+ */
+
+package org.postgresql.core;
+
+public enum JavaVersion {
+ // Note: order is important,
+ v1_6,
+ v1_7,
+ v1_8,
+ other;
+
+ private static final JavaVersion RUNTIME_VERSION = from(System.getProperty("java.version"));
+
+ /**
+ * Returns enum value that represents current runtime. For instance, when using -jre7.jar via Java
+ * 8, this would return v18
+ *
+ * @return enum value that represents current runtime.
+ */
+ public static JavaVersion getRuntimeVersion() {
+ return RUNTIME_VERSION;
+ }
+
+ /**
+ * Java version string like in {@code "java.version"} property
+ *
+ * @param version string like 1.6, 1.7, etc
+ * @return JavaVersion enum
+ */
+ public static JavaVersion from(String version) {
+ // Minimum supported is Java 1.6
+ if (version.startsWith("1.6")) {
+ return v1_6;
+ }
+ if (version.startsWith("1.7")) {
+ return v1_7;
+ }
+ if (version.startsWith("1.8")) {
+ return v1_8;
+ }
+ return other;
+ }
+}
diff --git a/pgjdbc/src/main/java/org/postgresql/core/Keyword.java b/pgjdbc/src/main/java/org/postgresql/core/Keyword.java
deleted file mode 100644
index 4573e34..0000000
--- a/pgjdbc/src/main/java/org/postgresql/core/Keyword.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright (c) 2003, PostgreSQL Global Development Group
- * See the LICENSE file in the project root for more information.
- */
-
-package org.postgresql.core;
-
-/**
- * Reserved SQL keywords.
- * @author Jeremy Whiting jwhiting at redhat.com
- *
- */
-public enum Keyword {
- RETURNING("RETURNING"), INTO("INTO"), VALUES("VALUES"), GROUP_BY("GROUP BY");
- /* add when needed: FROM, WHERE, HAVING, ONLY, ORDER, JOIN, INNER
- , LEFT, RIGHT, OUTER, LIMIT, OFFSET;*/
-
- Keyword(String upperCaseWord) {
- keyword = upperCaseWord;
- }
-
- public String asLowerCase() {
- return keyword.toLowerCase();
- }
-
- public String toString() {
- return keyword;
- }
-
- private final String keyword;
-}
diff --git a/pgjdbc/src/main/java/org/postgresql/core/Logger.java b/pgjdbc/src/main/java/org/postgresql/core/Logger.java
deleted file mode 100644
index 5c6eeb7..0000000
--- a/pgjdbc/src/main/java/org/postgresql/core/Logger.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Copyright (c) 2005, PostgreSQL Global Development Group
- * See the LICENSE file in the project root for more information.
- */
-
-package org.postgresql.core;
-
-import org.postgresql.Driver;
-
-import java.io.PrintWriter;
-import java.sql.DriverManager;
-import java.text.FieldPosition;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-
-/**
- * Poor man's logging infrastructure. This just deals with maintaining a per- connection ID and log
- * level, and timestamping output.
- */
-public final class Logger {
- // For brevity we only log the time, not date or timezone (the main reason
- // for the timestamp is to see delays etc. between log lines, not to pin
- // down an instant in time)
- private final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss.SSS ");
- private final FieldPosition dummyPosition = new FieldPosition(0);
- private final StringBuffer buffer = new StringBuffer();
- private final String connectionIDString;
-
- private int level = 0;
-
- public Logger() {
- connectionIDString = "(driver) ";
- }
-
- public Logger(int connectionID) {
- connectionIDString = "(" + connectionID + ") ";
- }
-
- public void setLogLevel(int level) {
- this.level = level;
- }
-
- public int getLogLevel() {
- return level;
- }
-
- public boolean logDebug() {
- return level >= Driver.DEBUG;
- }
-
- public boolean logInfo() {
- return level >= Driver.INFO;
- }
-
- public void debug(String str) {
- debug(str, null);
- }
-
- public void debug(String str, Throwable t) {
- if (logDebug()) {
- log(str, t);
- }
- }
-
- public void info(String str) {
- info(str, null);
- }
-
- public void info(String str, Throwable t) {
- if (logInfo()) {
- log(str, t);
- }
- }
-
- public void log(String str, Throwable t) {
- PrintWriter writer = DriverManager.getLogWriter();
- if (writer == null) {
- return;
- }
-
- synchronized (this) {
- buffer.setLength(0);
- dateFormat.format(new Date(), buffer, dummyPosition);
- buffer.append(connectionIDString);
- buffer.append(str);
-
- // synchronize to ensure that the exception (if any) does
- // not get split up from the corresponding log message
- synchronized (writer) {
- writer.println(buffer.toString());
- if (t != null) {
- t.printStackTrace(writer);
- }
- }
- writer.flush();
- }
- }
-}
diff --git a/pgjdbc/src/main/java/org/postgresql/core/NativeQuery.java b/pgjdbc/src/main/java/org/postgresql/core/NativeQuery.java
index 1341328..6bb1bce 100644
--- a/pgjdbc/src/main/java/org/postgresql/core/NativeQuery.java
+++ b/pgjdbc/src/main/java/org/postgresql/core/NativeQuery.java
@@ -11,8 +11,8 @@ package org.postgresql.core;
* replaced with $1, $2, etc.
*/
public class NativeQuery {
- private final static String[] BIND_NAMES = new String[128 * 10];
- private final static int[] NO_BINDS = new int[0];
+ private static final String[] BIND_NAMES = new String[128 * 10];
+ private static final int[] NO_BINDS = new int[0];
public final String nativeSql;
public final int[] bindPositions;
@@ -42,7 +42,7 @@ public class NativeQuery {
* parameter placeholders.
*
* @param parameters a ParameterList returned by this Query's {@link Query#createParameterList}
- * method, or <code>null</code> to leave the parameter placeholders unsubstituted.
+ * method, or {@code null} to leave the parameter placeholders unsubstituted.
* @return a human-readable representation of this query
*/
public String toString(ParameterList parameters) {
diff --git a/pgjdbc/src/main/java/org/postgresql/core/Oid.java b/pgjdbc/src/main/java/org/postgresql/core/Oid.java
index 471989c..89007e3 100644
--- a/pgjdbc/src/main/java/org/postgresql/core/Oid.java
+++ b/pgjdbc/src/main/java/org/postgresql/core/Oid.java
@@ -10,6 +10,8 @@ import org.postgresql.util.PSQLException;
import org.postgresql.util.PSQLState;
import java.lang.reflect.Field;
+import java.util.HashMap;
+import java.util.Map;
/**
* Provides constants for well-known backend OIDs for the types we commonly use.
@@ -76,6 +78,22 @@ public class Oid {
public static final int REF_CURSOR = 1790;
public static final int REF_CURSOR_ARRAY = 2201;
+ private static final Map<Integer, String> OID_TO_NAME = new HashMap<Integer, String>(100);
+ private static final Map<String, Integer> NAME_TO_OID = new HashMap<String, Integer>(100);
+
+ static {
+ for (Field field : Oid.class.getFields()) {
+ try {
+ int oid = field.getInt(null);
+ String name = field.getName().toUpperCase();
+ OID_TO_NAME.put(oid, name);
+ NAME_TO_OID.put(name, oid);
+ } catch (IllegalAccessException e) {
+ // ignore
+ }
+ }
+ }
+
/**
* Returns the name of the oid as string.
*
@@ -84,34 +102,28 @@ public class Oid {
* defined.
*/
public static String toString(int oid) {
- try {
- Field[] fields = Oid.class.getFields();
- for (Field field : fields) {
- if (field.getInt(null) == oid) {
- return field.getName();
- }
- }
- } catch (IllegalAccessException e) {
- // never happens
+ String name = OID_TO_NAME.get(oid);
+ if (name == null) {
+ name = "<unknown:" + oid + ">";
}
- return "<unknown:" + oid + ">";
+ return name;
}
public static int valueOf(String oid) throws PSQLException {
- try {
- return (int) Long.parseLong(oid);
- } catch (NumberFormatException ex) {
- }
- try {
- oid = oid.toUpperCase();
- Field[] fields = Oid.class.getFields();
- for (Field field : fields) {
- if (field.getName().toUpperCase().equals(oid)) {
- return field.getInt(null);
- }
+ if (oid.length() > 0 && !Character.isDigit(oid.charAt(0))) {
+ Integer id = NAME_TO_OID.get(oid);
+ if (id == null) {
+ id = NAME_TO_OID.get(oid.toUpperCase());
+ }
+ if (id != null) {
+ return id;
+ }
+ } else {
+ try {
+ // OID are unsigned 32bit integers, so Integer.parseInt is not enough
+ return (int) Long.parseLong(oid);
+ } catch (NumberFormatException ex) {
}
- } catch (IllegalAccessException e) {
- // never happens
}
throw new PSQLException(GT.tr("oid type {0} not known and not a number", oid),
PSQLState.INVALID_PARAMETER_VALUE);
diff --git a/pgjdbc/src/main/java/org/postgresql/core/PGStream.java b/pgjdbc/src/main/java/org/postgresql/core/PGStream.java
index 1f44758..cbb1bd6 100644
--- a/pgjdbc/src/main/java/org/postgresql/core/PGStream.java
+++ b/pgjdbc/src/main/java/org/postgresql/core/PGStream.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, PostgreSQL Global Development Group
+ * Copyright (c) 2017, PostgreSQL Global Development Group
* See the LICENSE file in the project root for more information.
*/
@@ -11,8 +11,10 @@ import org.postgresql.util.PSQLException;
import org.postgresql.util.PSQLState;
import java.io.BufferedOutputStream;
+import java.io.Closeable;
import java.io.EOFException;
import java.io.FilterOutputStream;
+import java.io.Flushable;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
@@ -20,7 +22,6 @@ import java.io.Writer;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.sql.SQLException;
-
import javax.net.SocketFactory;
/**
@@ -30,7 +31,7 @@ import javax.net.SocketFactory;
* In general, instances of PGStream are not threadsafe; the caller must ensure that only one thread
* at a time is accessing a particular PGStream instance.
*/
-public class PGStream {
+public class PGStream implements Closeable, Flushable {
private final SocketFactory socketFactory;
private final HostSpec hostSpec;
@@ -58,7 +59,15 @@ public class PGStream {
this.hostSpec = hostSpec;
Socket socket = socketFactory.createSocket();
- socket.connect(new InetSocketAddress(hostSpec.getHost(), hostSpec.getPort()), timeout);
+ if (!socket.isConnected()) {
+ // When using a SOCKS proxy, the host might not be resolvable locally,
+ // thus we defer resolution until the traffic reaches the proxy. If there
+ // is no proxy, we must resolve the host to an IP to connect the socket.
+ InetSocketAddress address = hostSpec.shouldResolve()
+ ? new InetSocketAddress(hostSpec.getHost(), hostSpec.getPort())
+ : InetSocketAddress.createUnresolved(hostSpec.getHost(), hostSpec.getPort());
+ socket.connect(address, timeout);
+ }
changeSocket(socket);
setEncoding(Encoding.getJVMEncoding("UTF-8"));
@@ -74,6 +83,7 @@ public class PGStream {
* @throws IOException if an IOException occurs below it.
* @deprecated use {@link #PGStream(SocketFactory, org.postgresql.util.HostSpec, int)}
*/
+ @Deprecated
public PGStream(SocketFactory socketFactory, HostSpec hostSpec) throws IOException {
this(socketFactory, hostSpec, 0);
}
@@ -137,6 +147,9 @@ public class PGStream {
* @throws IOException if something goes wrong
*/
public void setEncoding(Encoding encoding) throws IOException {
+ if (this.encoding != null && this.encoding.name().equals(encoding.name())) {
+ return;
+ }
// Close down any old writer.
if (encodingWriter != null) {
encodingWriter.close();
@@ -222,7 +235,7 @@ public class PGStream {
* @param buf The array of bytes to be sent
* @throws IOException if an I/O error occurs
*/
- public void send(byte buf[]) throws IOException {
+ public void send(byte[] buf) throws IOException {
pg_output.write(buf);
}
@@ -234,7 +247,7 @@ public class PGStream {
* @param siz the number of bytes to be sent
* @throws IOException if an I/O error occurs
*/
- public void send(byte buf[], int siz) throws IOException {
+ public void send(byte[] buf, int siz) throws IOException {
send(buf, 0, siz);
}
@@ -247,7 +260,7 @@ public class PGStream {
* @param siz the number of bytes to be sent
* @throws IOException if an I/O error occurs
*/
- public void send(byte buf[], int off, int siz) throws IOException {
+ public void send(byte[] buf, int off, int siz) throws IOException {
int bufamt = buf.length - off;
pg_output.write(buf, off, bufamt < siz ? bufamt : siz);
for (int i = bufamt; i < siz; ++i) {
@@ -409,57 +422,6 @@ public class PGStream {
}
/**
- * Read a tuple from the back end. A tuple is a two dimensional array of bytes. This variant reads
- * the V2 protocol's tuple representation.
- *
- * @param nf the number of fields expected
- * @param bin true if the tuple is a binary tuple
- * @return null if the current response has no more tuples, otherwise an array of bytearrays
- * @throws IOException if a data I/O error occurs
- */
- public byte[][] receiveTupleV2(int nf, boolean bin) throws IOException, OutOfMemoryError {
- int i;
- int bim = (nf + 7) / 8;
- byte[] bitmask = receive(bim);
- byte[][] answer = new byte[nf][];
-
- int whichbit = 0x80;
- int whichbyte = 0;
-
- OutOfMemoryError oom = null;
- for (i = 0; i < nf; ++i) {
- boolean isNull = ((bitmask[whichbyte] & whichbit) == 0);
- whichbit >>= 1;
- if (whichbit == 0) {
- ++whichbyte;
- whichbit = 0x80;
- }
- if (!isNull) {
- int len = receiveInteger4();
- if (!bin) {
- len -= 4;
- }
- if (len < 0) {
- len = 0;
- }
- try {
- answer[i] = new byte[len];
- receive(answer[i], 0, len);
- } catch (OutOfMemoryError oome) {
- oom = oome;
- skip(len);
- }
- }
- }
-
- if (oom != null) {
- throw oom;
- }
-
- return answer;
- }
-
- /**
* Reads in a given number of bytes from the backend
*
* @param siz number of bytes to read
@@ -544,6 +506,7 @@ public class PGStream {
*
* @throws IOException if an I/O error occurs
*/
+ @Override
public void flush() throws IOException {
if (encodingWriter != null) {
encodingWriter.flush();
@@ -571,6 +534,7 @@ public class PGStream {
*
* @throws IOException if an I/O Error occurs
*/
+ @Override
public void close() throws IOException {
if (encodingWriter != null) {
encodingWriter.close();
@@ -580,4 +544,12 @@ public class PGStream {
pg_input.close();
connection.close();
}
+
+ public void setNetworkTimeout(int milliseconds) throws IOException {
+ connection.setSoTimeout(milliseconds);
+ }
+
+ public int getNetworkTimeout() throws IOException {
+ return connection.getSoTimeout();
+ }
}
diff --git a/pgjdbc/src/main/java/org/postgresql/core/ParameterList.java b/pgjdbc/src/main/java/org/postgresql/core/ParameterList.java
index df3679d..eac4004 100644
--- a/pgjdbc/src/main/java/org/postgresql/core/ParameterList.java
+++ b/pgjdbc/src/main/java/org/postgresql/core/ParameterList.java
@@ -125,6 +125,18 @@ public interface ParameterList {
void setBytea(int index, InputStream stream) throws SQLException;
/**
+ * Binds a text value stored as an InputStream that is a valid UTF-8 byte stream.
+ * Any byte-order marks (BOM) in the stream are passed to the backend.
+ * The parameter's type is implicitly set to 'text'.
+ * The stream should remain valid until query execution has completed.
+ *
+ * @param index the 1-based parameter index to bind.
+ * @param stream a stream containing the parameter data.
+ * @throws SQLException on error or if <code>index</code> is out of range
+ */
+ void setText(int index, InputStream stream) throws SQLException;
+
+ /**
* Binds given byte[] value to a parameter. The bytes must already be in correct format matching
* the OID.
*
diff --git a/pgjdbc/src/main/java/org/postgresql/core/Parser.java b/pgjdbc/src/main/java/org/postgresql/core/Parser.java
index f642896..ad755f9 100644
--- a/pgjdbc/src/main/java/org/postgresql/core/Parser.java
+++ b/pgjdbc/src/main/java/org/postgresql/core/Parser.java
@@ -25,7 +25,7 @@ import java.util.List;
* @author Christopher Deckers (chrriis at gmail.com)
*/
public class Parser {
- private final static int[] NO_BINDS = new int[0];
+ private static final int[] NO_BINDS = new int[0];
/**
* Parses JDBC query into PostgreSQL's native format. Several queries might be given if separated
@@ -63,6 +63,7 @@ public class Parser {
boolean isValuesFound = false;
int valuesBraceOpenPosition = -1;
int valuesBraceClosePosition = -1;
+ boolean valuesBraceCloseFound = false;
boolean isInsertPresent = false;
boolean isReturningPresent = false;
boolean isReturningPresentPrev = false;
@@ -73,11 +74,13 @@ public class Parser {
boolean whitespaceOnly = true;
int keyWordCount = 0;
int keywordStart = -1;
+ int keywordEnd = -1;
for (int i = 0; i < aChars.length; ++i) {
char aChar = aChars[i];
boolean isKeyWordChar = false;
// ';' is ignored as it splits the queries
whitespaceOnly &= aChar == ';' || Character.isWhitespace(aChar);
+ keywordEnd = i; // parseSingleQuotes, parseDoubleQuotes, etc move index so we keep old value
switch (aChar) {
case '\'': // single-quotes
i = Parser.parseSingleQuotes(aChars, i, standardConformingStrings);
@@ -103,7 +106,7 @@ public class Parser {
case ')':
inParen--;
- if (inParen == 0 && isValuesFound) {
+ if (inParen == 0 && isValuesFound && !valuesBraceCloseFound) {
// If original statement is multi-values like VALUES (...), (...), ... then
// search for the latest closing paren
valuesBraceClosePosition = nativeSql.length() + i - fragmentStart;
@@ -148,6 +151,13 @@ public class Parser {
nativeQueries = new ArrayList<NativeQuery>();
}
+ if (!isValuesFound || !isCurrentReWriteCompatible || valuesBraceClosePosition == -1
+ || (bindPositions != null
+ && valuesBraceClosePosition < bindPositions.get(bindPositions.size() - 1))) {
+ valuesBraceOpenPosition = -1;
+ valuesBraceClosePosition = -1;
+ }
+
nativeQueries.add(new NativeQuery(nativeSql.toString(),
toIntArray(bindPositions), false,
SqlCommand.createStatementTypeInfo(
@@ -168,20 +178,33 @@ public class Parser {
nativeSql.setLength(0);
valuesBraceOpenPosition = -1;
valuesBraceClosePosition = -1;
+ valuesBraceCloseFound = false;
}
}
break;
default:
- isKeyWordChar =
- aChars[i] >= 'a' && aChars[i] <= 'z' || aChars[i] >= 'A' && aChars[i] <= 'Z';
- if (isKeyWordChar && keywordStart < 0) {
+ if (keywordStart >= 0) {
+ // When we are inside a keyword, we need to detect keyword end boundary
+ // Note that isKeyWordChar is initialized to false before the switch, so
+ // all other characters would result in isKeyWordChar=false
+ isKeyWordChar = isIdentifierContChar(aChar);
+ break;
+ }
+ // Not in keyword, so just detect next keyword start
+ isKeyWordChar = isIdentifierStartChar(aChar);
+ if (isKeyWordChar) {
keywordStart = i;
+ if (valuesBraceOpenPosition != -1 && inParen == 0) {
+ // When the statement already has multi-values, stop looking for more of them
+ // Since values(?,?),(?,?),... should not contain keywords in the middle
+ valuesBraceCloseFound = true;
+ }
}
break;
}
if (keywordStart >= 0 && (i == aChars.length - 1 || !isKeyWordChar)) {
- int wordLength = (isKeyWordChar ? i + 1 : i) - keywordStart;
+ int wordLength = (isKeyWordChar ? i + 1 : keywordEnd) - keywordStart;
if (currentCommandType == SqlCommandType.BLANK) {
if (wordLength == 6 && parseUpdateKeyword(aChars, keywordStart)) {
currentCommandType = SqlCommandType.UPDATE;
@@ -204,8 +227,16 @@ public class Parser {
isCurrentReWriteCompatible = false;
}
}
+ } else if (currentCommandType == SqlCommandType.WITH
+ && inParen == 0) {
+ SqlCommandType command = parseWithCommandType(aChars, i, keywordStart, wordLength);
+ if (command != null) {
+ currentCommandType = command;
+ }
}
- if (wordLength == 9 && parseReturningKeyword(aChars, keywordStart)) {
+ if (inParen != 0 || aChar == ')') {
+ // RETURNING and VALUES cannot be present in braces
+ } else if (wordLength == 9 && parseReturningKeyword(aChars, keywordStart)) {
isReturningPresent = true;
} else if (wordLength == 6 && parseValuesKeyword(aChars, keywordStart)) {
isValuesFound = true;
@@ -220,10 +251,10 @@ public class Parser {
}
}
}
- if (!isValuesFound) {
- isCurrentReWriteCompatible = false;
- }
- if (!isCurrentReWriteCompatible) {
+
+ if (!isValuesFound || !isCurrentReWriteCompatible || valuesBraceClosePosition == -1
+ || (bindPositions != null
+ && valuesBraceClosePosition < bindPositions.get(bindPositions.size() - 1))) {
valuesBraceOpenPosition = -1;
valuesBraceClosePosition = -1;
}
@@ -264,6 +295,47 @@ public class Parser {
return nativeQueries;
}
+ private static SqlCommandType parseWithCommandType(char[] aChars, int i, int keywordStart,
+ int wordLength) {
+ // This parses `with x as (...) ...`
+ // Corner case is `with select as (insert ..) select * from select
+ SqlCommandType command;
+ if (wordLength == 6 && parseUpdateKeyword(aChars, keywordStart)) {
+ command = SqlCommandType.UPDATE;
+ } else if (wordLength == 6 && parseDeleteKeyword(aChars, keywordStart)) {
+ command = SqlCommandType.DELETE;
+ } else if (wordLength == 6 && parseInsertKeyword(aChars, keywordStart)) {
+ command = SqlCommandType.INSERT;
+ } else if (wordLength == 6 && parseSelectKeyword(aChars, keywordStart)) {
+ command = SqlCommandType.SELECT;
+ } else {
+ return null;
+ }
+ // update/delete/insert/select keyword detected
+ // Check if `AS` follows
+ int nextInd = i;
+ // The loop should skip whitespace and comments
+ for (; nextInd < aChars.length; nextInd++) {
+ char nextChar = aChars[nextInd];
+ if (nextChar == '-') {
+ nextInd = Parser.parseLineComment(aChars, nextInd);
+ } else if (nextChar == '/') {
+ nextInd = Parser.parseBlockComment(aChars, nextInd);
+ } else if (Character.isWhitespace(nextChar)) {
+ // Skip whitespace
+ continue;
+ } else {
+ break;
+ }
+ }
+ if (nextInd + 2 >= aChars.length
+ || (!parseAsKeyword(aChars, nextInd)
+ || isIdentifierContChar(aChars[nextInd + 2]))) {
+ return command;
+ }
+ return null;
+ }
+
private static boolean addReturning(StringBuilder nativeSql, SqlCommandType currentCommandType,
String[] returningColumnNames, boolean isReturningPresent) throws SQLException {
if (isReturningPresent || returningColumnNames.length == 0) {
@@ -271,7 +343,8 @@ public class Parser {
}
if (currentCommandType != SqlCommandType.INSERT
&& currentCommandType != SqlCommandType.UPDATE
- && currentCommandType != SqlCommandType.DELETE) {
+ && currentCommandType != SqlCommandType.DELETE
+ && currentCommandType != SqlCommandType.WITH) {
return false;
}
@@ -637,6 +710,22 @@ public class Parser {
}
/**
+ * Parse string to check presence of AS keyword regardless of case.
+ *
+ * @param query char[] of the query statement
+ * @param offset position of query to start checking
+ * @return boolean indicates presence of word
+ */
+ public static boolean parseAsKeyword(final char[] query, int offset) {
+ if (query.length < (offset + 2)) {
+ return false;
+ }
+
+ return (query[offset] | 32) == 'a'
+ && (query[offset + 1] | 32) == 's';
+ }
+
+ /**
* @param c character
* @return true if the character is a whitespace character as defined in the backend's parser
*/
@@ -659,19 +748,23 @@ public class Parser {
/**
* Checks if a character is valid as the start of an identifier.
+ * PostgreSQL 9.4 allows column names like _, ‿, ⁀, ⁔, ︳, ︴, ﹍, ﹎, ﹏, _, so
+ * it is assumed isJavaIdentifierPart is good enough for PostgreSQL.
+ *
+ * @see <a href="https://www.postgresql.org/docs/9.6/static/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS">Identifiers and Key Words</a>
*
* @param c the character to check
* @return true if valid as first character of an identifier; false if not
*/
public static boolean isIdentifierStartChar(char c) {
/*
- * Extracted from {ident_start} and {ident_cont} in
+ * PostgreSQL's implmementation is located in
* pgsql/src/backend/parser/scan.l:
* ident_start [A-Za-z\200-\377_]
* ident_cont [A-Za-z\200-\377_0-9\$]
+ * however is is not clear how that interacts with unicode, so we just use Java's implementation.
*/
- return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')
- || c == '_' || c > 127;
+ return Character.isJavaIdentifierStart(c);
}
/**
@@ -681,10 +774,7 @@ public class Parser {
* @return true if valid as second or later character of an identifier; false if not
*/
public static boolean isIdentifierContChar(char c) {
- return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')
- || c == '_' || c > 127
- || (c >= '0' && c <= '9')
- || c == '$';
+ return Character.isJavaIdentifierPart(c);
}
/**
@@ -706,9 +796,13 @@ public class Parser {
* The allowed dollar quote start and continuation characters
* must stay in sync with what the backend defines in
* pgsql/src/backend/parser/scan.l
+ *
+ * The quoted string starts with $foo$ where "foo" is an optional string
+ * in the form of an identifier, except that it may not contain "$",
+ * and extends to the first occurrence of an identical string.
+ * There is *no* processing of the quoted text.
*/
- return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')
- || c == '_' || c > 127;
+ return c != '$' && isIdentifierStartChar(c);
}
/**
@@ -718,9 +812,7 @@ public class Parser {
* @return true if valid as second or later character of a dollar quoting tag; false if not
*/
public static boolean isDollarQuoteContChar(char c) {
- return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')
- || c == '_' || c > 127
- || (c >= '0' && c <= '9');
+ return c != '$' && isIdentifierContChar(c);
}
/**
@@ -921,14 +1013,16 @@ public class Parser {
}
String s = jdbcSql.substring(startIndex, endIndex);
StringBuilder sb = new StringBuilder(s);
- if (outParmBeforeFunc) {
+
+ int opening = s.indexOf('(') + 1;
+ if (opening == 0) {
+ sb.append(outParmBeforeFunc ? "(?)" : "()");
+ } else if (outParmBeforeFunc) {
// move the single out parameter into the function call
// so that it can be treated like all other parameters
boolean needComma = false;
- // have to use String.indexOf for java 2
- int opening = s.indexOf('(') + 1;
- int closing = s.indexOf(')');
+ int closing = s.indexOf(')', opening);
for (int j = opening; j < closing; j++) {
if (!Character.isWhitespace(sb.charAt(j))) {
needComma = true;
@@ -947,17 +1041,18 @@ public class Parser {
/**
* Filter the SQL string of Java SQL Escape clauses.
- *
+ * <p>
* Currently implemented Escape clauses are those mentioned in 11.3 in the specification.
* Basically we look through the sql string for {d xxx}, {t xxx}, {ts xxx}, {oj xxx} or {fn xxx}
* in non-string sql code. When we find them, we just strip the escape part leaving only the xxx
* part. So, something like "select * from x where d={d '2001-10-09'}" would return "select * from
* x where d= '2001-10-09'".
*
- * @param p_sql the original query text
- * @param replaceProcessingEnabled whether replace_processing_enabled is on
+ * @param p_sql the original query text
+ * @param replaceProcessingEnabled whether replace_processing_enabled is on
* @param standardConformingStrings whether standard_conforming_strings is on
* @return PostgreSQL-compatible SQL
+ * @throws SQLException if given SQL is wrong
*/
public static String replaceProcessing(String p_sql, boolean replaceProcessingEnabled,
boolean standardConformingStrings) throws SQLException {
@@ -1017,23 +1112,31 @@ public class Parser {
if (c == '$') {
int i0 = i;
i = parseDollarQuotes(p_sql, i);
+ checkParsePosition(i, len, i0, p_sql,
+ "Unterminated dollar quote started at position {0} in SQL {1}. Expected terminating $$");
newsql.append(p_sql, i0, i - i0 + 1);
break;
} else if (c == '\'') {
// start of a string?
int i0 = i;
i = parseSingleQuotes(p_sql, i, stdStrings);
+ checkParsePosition(i, len, i0, p_sql,
+ "Unterminated string literal started at position {0} in SQL {1}. Expected ' char");
newsql.append(p_sql, i0, i - i0 + 1);
break;
} else if (c == '"') {
// start of a identifier?
int i0 = i;
i = parseDoubleQuotes(p_sql, i);
+ checkParsePosition(i, len, i0, p_sql,
+ "Unterminated identifier started at position {0} in SQL {1}. Expected \" char");
newsql.append(p_sql, i0, i - i0 + 1);
break;
} else if (c == '/') {
int i0 = i;
i = parseBlockComment(p_sql, i);
+ checkParsePosition(i, len, i0, p_sql,
+ "Unterminated block comment started at position {0} in SQL {1}. Expected */ sequence");
newsql.append(p_sql, i0, i - i0 + 1);
break;
} else if (c == '-') {
@@ -1113,6 +1216,17 @@ public class Parser {
return i;
}
+ private static void checkParsePosition(int i, int len, int i0, char[] p_sql,
+ String message)
+ throws PSQLException {
+ if (i < len) {
+ return;
+ }
+ throw new PSQLException(
+ GT.tr(message, i0, new String(p_sql)),
+ PSQLState.SYNTAX_ERROR);
+ }
+
/**
* generate sql for escaped functions
*
@@ -1163,8 +1277,8 @@ public class Parser {
}
}
- private final static char[] QUOTE_OR_ALPHABETIC_MARKER = new char[]{'\"', '0'};
- private final static char[] SINGLE_QUOTE = new char[]{'\''};
+ private static final char[] QUOTE_OR_ALPHABETIC_MARKER = {'\"', '0'};
+ private static final char[] SINGLE_QUOTE = {'\''};
// Static variables for parsing SQL when replaceProcessing is true.
private enum SqlParseState {
diff --git a/pgjdbc/src/main/java/org/postgresql/core/QueryExecutor.java b/pgjdbc/src/main/java/org/postgresql/core/QueryExecutor.java
index 92422c8..ee83b24 100644
--- a/pgjdbc/src/main/java/org/postgresql/core/QueryExecutor.java
+++ b/pgjdbc/src/main/java/org/postgresql/core/QueryExecutor.java
@@ -14,6 +14,7 @@ import org.postgresql.jdbc.BatchResultHandler;
import org.postgresql.jdbc.PreferQueryMode;
import org.postgresql.util.HostSpec;
+import java.io.IOException;
import java.sql.SQLException;
import java.sql.SQLWarning;
import java.util.List;
@@ -217,6 +218,17 @@ public interface QueryExecutor extends TypeTransferModeRegistry {
*/
void processNotifies() throws SQLException;
+ /**
+ * Prior to attempting to retrieve notifications, we need to pull any recently received
+ * notifications off of the network buffers. The notification retrieval in ProtocolConnection
+ * cannot do this as it is prone to deadlock, so the higher level caller must be responsible which
+ * requires exposing this method. This variant supports blocking for the given time in millis.
+ *
+ * @param timeoutMillis number of milliseconds to block for
+ * @throws SQLException if and error occurs while fetching notifications
+ */
+ void processNotifies(int timeoutMillis) throws SQLException;
+
//
// Fastpath interface.
//
@@ -421,4 +433,13 @@ public interface QueryExecutor extends TypeTransferModeRegistry {
* @param flushCacheOnDeallocate true if statement cache should be reset when "deallocate/discard" message observed
*/
void setFlushCacheOnDeallocate(boolean flushCacheOnDeallocate);
+
+ /**
+ * @return the ReplicationProtocol instance for this connection.
+ */
+ ReplicationProtocol getReplicationProtocol();
+
+ void setNetworkTimeout(int milliseconds) throws IOException;
+
+ int getNetworkTimeout() throws IOException;
}
diff --git a/pgjdbc/src/main/java/org/postgresql/core/QueryExecutorBase.java b/pgjdbc/src/main/java/org/postgresql/core/QueryExecutorBase.java
index c1df912..6825eae 100644
--- a/pgjdbc/src/main/java/org/postgresql/core/QueryExecutorBase.java
+++ b/pgjdbc/src/main/java/org/postgresql/core/QueryExecutorBase.java
@@ -20,9 +20,12 @@ import java.sql.SQLException;
import java.sql.SQLWarning;
import java.util.ArrayList;
import java.util.Properties;
+import java.util.logging.Level;
+import java.util.logging.Logger;
public abstract class QueryExecutorBase implements QueryExecutor {
- protected final Logger logger;
+
+ private static final Logger LOGGER = Logger.getLogger(QueryExecutorBase.class.getName());
protected final PGStream pgStream;
private final String user;
private final String database;
@@ -49,9 +52,8 @@ public abstract class QueryExecutorBase implements QueryExecutor {
private final LruCache<Object, CachedQuery> statementCache;
private final CachedQueryCreateAction cachedQueryCreateAction;
- protected QueryExecutorBase(Logger logger, PGStream pgStream, String user, String database,
- int cancelSignalTimeout, Properties info) throws SQLException {
- this.logger = logger;
+ protected QueryExecutorBase(PGStream pgStream, String user,
+ String database, int cancelSignalTimeout, Properties info) throws SQLException {
this.pgStream = pgStream;
this.user = user;
this.database = database;
@@ -78,6 +80,16 @@ public abstract class QueryExecutorBase implements QueryExecutor {
protected abstract void sendCloseMessage() throws IOException;
@Override
+ public void setNetworkTimeout(int milliseconds) throws IOException {
+ pgStream.setNetworkTimeout(milliseconds);
+ }
+
+ @Override
+ public int getNetworkTimeout() throws IOException {
+ return pgStream.getNetworkTimeout();
+ }
+
+ @Override
public HostSpec getHostSpec() {
return pgStream.getHostSpec();
}
@@ -119,17 +131,12 @@ public abstract class QueryExecutorBase implements QueryExecutor {
}
try {
- if (logger.logDebug()) {
- logger.debug(" FE=> Terminate");
- }
+ LOGGER.log(Level.FINEST, " FE=> Terminate");
sendCloseMessage();
pgStream.flush();
pgStream.close();
} catch (IOException ioe) {
- // Forget it.
- if (logger.logDebug()) {
- logger.debug("Discarding IOException on close:", ioe);
- }
+ LOGGER.log(Level.FINEST, "Discarding IOException on close:", ioe);
}
closed = true;
@@ -150,8 +157,8 @@ public abstract class QueryExecutorBase implements QueryExecutor {
// Now we need to construct and send a cancel packet
try {
- if (logger.logDebug()) {
- logger.debug(" FE=> CancelRequest(pid=" + cancelPid + ",ckey=" + cancelKey + ")");
+ if (LOGGER.isLoggable(Level.FINEST)) {
+ LOGGER.log(Level.FINEST, " FE=> CancelRequest(pid={0},ckey={1})", new Object[]{cancelPid, cancelKey});
}
cancelStream =
@@ -168,9 +175,7 @@ public abstract class QueryExecutorBase implements QueryExecutor {
cancelStream.receiveEOF();
} catch (IOException e) {
// Safe to ignore.
- if (logger.logDebug()) {
- logger.debug("Ignoring exception on cancel request:", e);
- }
+ LOGGER.log(Level.FINEST, "Ignoring exception on cancel request:", e);
} finally {
if (cancelStream != null) {
try {
@@ -380,4 +385,8 @@ public abstract class QueryExecutorBase implements QueryExecutor {
public void setFlushCacheOnDeallocate(boolean flushCacheOnDeallocate) {
this.flushCacheOnDeallocate = flushCacheOnDeallocate;
}
+
+ protected boolean hasNotifications() {
+ return notifications.size() > 0;
+ }
}
diff --git a/pgjdbc/src/main/java/org/postgresql/core/QueryWithReturningColumnsKey.java b/pgjdbc/src/main/java/org/postgresql/core/QueryWithReturningColumnsKey.java
index 2f4b799..0b1dfd7 100644
--- a/pgjdbc/src/main/java/org/postgresql/core/QueryWithReturningColumnsKey.java
+++ b/pgjdbc/src/main/java/org/postgresql/core/QueryWithReturningColumnsKey.java
@@ -17,7 +17,7 @@ import java.util.Arrays;
class QueryWithReturningColumnsKey extends BaseQueryKey {
public final String[] columnNames;
- public QueryWithReturningColumnsKey(String sql, boolean isParameterized, boolean escapeProcessing,
+ QueryWithReturningColumnsKey(String sql, boolean isParameterized, boolean escapeProcessing,
String[] columnNames) {
super(sql, isParameterized, escapeProcessing);
if (columnNames == null) {
diff --git a/pgjdbc/src/main/java/org/postgresql/core/ReplicationProtocol.java b/pgjdbc/src/main/java/org/postgresql/core/ReplicationProtocol.java
new file mode 100644
index 0000000..189da1c
--- /dev/null
+++ b/pgjdbc/src/main/java/org/postgresql/core/ReplicationProtocol.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2016, PostgreSQL Global Development Group
+ * See the LICENSE file in the project root for more information.
+ */
+
+package org.postgresql.core;
+
+import org.postgresql.replication.PGReplicationStream;
+import org.postgresql.replication.fluent.logical.LogicalReplicationOptions;
+import org.postgresql.replication.fluent.physical.PhysicalReplicationOptions;
+
+import java.sql.SQLException;
+
+/**
+ * <p>Abstracts the protocol-specific details of physic and logic replication. <p>With each
+ * connection open with replication options associate own instance ReplicationProtocol.
+ */
+public interface ReplicationProtocol {
+ /**
+ * @param options not null options for logical replication stream
+ * @return not null stream instance from which available fetch wal logs that was decode by output
+ * plugin
+ * @throws SQLException on error
+ */
+ PGReplicationStream startLogical(LogicalReplicationOptions options) throws SQLException;
+
+ /**
+ * @param options not null options for physical replication stream
+ * @return not null stream instance from which available fetch wal logs
+ * @throws SQLException on error
+ */
+ PGReplicationStream startPhysical(PhysicalReplicationOptions options) throws SQLException;
+}
diff --git a/pgjdbc/src/main/java/org/postgresql/core/ServerVersion.java b/pgjdbc/src/main/java/org/postgresql/core/ServerVersion.java
index 0c4fbd7..8f9bd9c 100644
--- a/pgjdbc/src/main/java/org/postgresql/core/ServerVersion.java
+++ b/pgjdbc/src/main/java/org/postgresql/core/ServerVersion.java
@@ -14,15 +14,6 @@ import java.text.ParsePosition;
public enum ServerVersion implements Version {
INVALID("0.0.0"),
- v6_4("6.4.0"),
- v6_5("6.5.0"),
- v7_0("7.0.0"),
- v7_1("7.1.0"),
- v7_2("7.2.0"),
- v7_3("7.3.0"),
- v7_4("7.4.0"),
- v8_0("8.0.0"),
- v8_1("8.1.0"),
v8_2("8.2.0"),
v8_3("8.3.0"),
v8_4("8.4.0"),
@@ -38,7 +29,7 @@ public enum ServerVersion implements Version {
private final int version;
- private ServerVersion(String version) {
+ ServerVersion(String version) {
this.version = parseServerVersionStr(version);
}
@@ -147,7 +138,13 @@ public enum ServerVersion implements Version {
}
}
- if (versionParts == 3) {
+ /* #667 - Allow for versions with greater than 3 parts.
+ For versions with more than 3 parts, still return 3 parts (4th part ignored for now
+ as no functionality is dependent on the 4th part .
+ Allows for future versions of the server to utilize more than 3 part version numbers
+ without upgrading the jdbc driver */
+
+ if (versionParts >= 3) {
if (parts[1] > 99) {
throw new NumberFormatException(
"Unsupported second part of major version > 99 in invalid version string: "
diff --git a/pgjdbc/src/main/java/org/postgresql/core/SqlCommand.java b/pgjdbc/src/main/java/org/postgresql/core/SqlCommand.java
index c358f36..90201fa 100644
--- a/pgjdbc/src/main/java/org/postgresql/core/SqlCommand.java
+++ b/pgjdbc/src/main/java/org/postgresql/core/SqlCommand.java
@@ -6,6 +6,8 @@
package org.postgresql.core;
import static org.postgresql.core.SqlCommandType.INSERT;
+import static org.postgresql.core.SqlCommandType.SELECT;
+import static org.postgresql.core.SqlCommandType.WITH;
/**
* Data Modification Language inspection support.
@@ -37,6 +39,10 @@ public class SqlCommand {
return parsedSQLhasRETURNINGKeyword;
}
+ public boolean returnsRows() {
+ return parsedSQLhasRETURNINGKeyword || commandType == SELECT || commandType == WITH;
+ }
+
public static SqlCommand createStatementTypeInfo(SqlCommandType type,
boolean isBatchedReWritePropertyConfigured,
int valuesBraceOpenPosition, int valuesBraceClosePosition, boolean isRETURNINGkeywordPresent,
diff --git a/pgjdbc/src/main/java/org/postgresql/core/UTF8Encoding.java b/pgjdbc/src/main/java/org/postgresql/core/UTF8Encoding.java
index ec1a89a..3ae6cb1 100644
--- a/pgjdbc/src/main/java/org/postgresql/core/UTF8Encoding.java
+++ b/pgjdbc/src/main/java/org/postgresql/core/UTF8Encoding.java
@@ -10,10 +10,6 @@ import org.postgresql.util.GT;
import java.io.IOException;
class UTF8Encoding extends Encoding {
- UTF8Encoding(String jvmEncoding) {
- super(jvmEncoding);
- }
-
private static final int MIN_2_BYTES = 0x80;
private static final int MIN_3_BYTES = 0x800;
private static final int MIN_4_BYTES = 0x10000;
@@ -21,16 +17,20 @@ class UTF8Encoding extends Encoding {
private char[] decoderArray = new char[1024];
+ UTF8Encoding(String jvmEncoding) {
+ super(jvmEncoding);
+ }
+
// helper for decode
- private final static void checkByte(int ch, int pos, int len) throws IOException {
+ private static void checkByte(int ch, int pos, int len) throws IOException {
if ((ch & 0xc0) != 0x80) {
throw new IOException(
GT.tr("Illegal UTF-8 sequence: byte {0} of {1} byte sequence is not 10xxxxxx: {2}",
- new Object[]{pos, len, ch}));
+ pos, len, ch));
}
}
- private final static void checkMinimal(int ch, int minValue) throws IOException {
+ private static void checkMinimal(int ch, int minValue) throws IOException {
if (ch >= minValue) {
return;
}
@@ -64,7 +64,7 @@ class UTF8Encoding extends Encoding {
throw new IOException(
GT.tr("Illegal UTF-8 sequence: {0} bytes used to encode a {1} byte value: {2}",
- new Object[]{actualLen, expectedLen, ch}));
+ actualLen, expectedLen, ch));
}
/**
@@ -74,11 +74,12 @@ class UTF8Encoding extends Encoding {
* databases out there.
*
* @param data the array containing UTF8-encoded data
- * @param offset the offset of the first byte in <code>data</code> to decode from
+ * @param offset the offset of the first byte in {@code data} to decode from
* @param length the number of bytes to decode
* @return a decoded string
* @throws IOException if something goes wrong
*/
+ @Override
public synchronized String decode(byte[] data, int offset, int length) throws IOException {
char[] cdata = decoderArray;
if (cdata.length < length) {
@@ -99,7 +100,7 @@ class UTF8Encoding extends Encoding {
} else if (ch < 0xc0) {
// 10xxxxxx -- illegal!
throw new IOException(GT.tr("Illegal UTF-8 sequence: initial byte is {0}: {1}",
- new Object[]{"10xxxxxx", ch}));
+ "10xxxxxx", ch));
} else if (ch < 0xe0) {
// 110xxxxx 10xxxxxx
ch = ((ch & 0x1f) << 6);
@@ -126,7 +127,7 @@ class UTF8Encoding extends Encoding {
checkMinimal(ch, MIN_4_BYTES);
} else {
throw new IOException(GT.tr("Illegal UTF-8 sequence: initial byte is {0}: {1}",
- new Object[]{"11111xxx", ch}));
+ "11111xxx", ch));
}
if (ch > MAX_CODE_POINT) {
diff --git a/pgjdbc/src/main/java/org/postgresql/core/Utils.java b/pgjdbc/src/main/java/org/postgresql/core/Utils.java
index 880f8dc..f945c84 100644
--- a/pgjdbc/src/main/java/org/postgresql/core/Utils.java
+++ b/pgjdbc/src/main/java/org/postgresql/core/Utils.java
@@ -22,7 +22,7 @@ public class Utils {
* Turn a bytearray into a printable form, representing each byte in hex.
*
* @param data the bytearray to stringize
- * @return a hex-encoded printable representation of <code>data</code>
+ * @return a hex-encoded printable representation of {@code data}
*/
public static String toHexString(byte[] data) {
StringBuilder sb = new StringBuilder(data.length * 2);
@@ -37,13 +37,13 @@ public class Utils {
* Keep a local copy of the UTF-8 Charset so we can avoid synchronization overhead from looking up
* the Charset by name as String.getBytes(String) requires.
*/
- private final static Charset utf8Charset = Charset.forName("UTF-8");
+ private static final Charset utf8Charset = Charset.forName("UTF-8");
/**
* Encode a string as UTF-8.
*
* @param str the string to encode
- * @return the UTF-8 representation of <code>str</code>
+ * @return the UTF-8 representation of {@code str}
*/
public static byte[] encodeUTF8(String str) {
// See org.postgresql.benchmark.encoding.UTF8Encoding#string_getBytes
@@ -54,28 +54,6 @@ public class Utils {
}
/**
- * Escape the given literal <tt>value</tt> and append it to the string buffer <tt>sbuf</tt>. If
- * <tt>sbuf</tt> is <tt>null</tt>, a new StringBuffer will be returned. The argument
- * <tt>standardConformingStrings</tt> defines whether the backend expects standard-conforming
- * string literals or allows backslash escape sequences.
- *
- * @param sbuf the string buffer to append to; or <tt>null</tt>
- * @param value the string value
- * @param standardConformingStrings if standard conforming strings should be used
- * @return the sbuf argument; or a new string buffer for sbuf == null
- * @throws SQLException if the string contains a <tt>\0</tt> character
- * @deprecated use {@link #escapeLiteral(StringBuilder, String, boolean)} instead
- */
- public static StringBuffer appendEscapedLiteral(StringBuffer sbuf, String value,
- boolean standardConformingStrings) throws SQLException {
- if (sbuf == null) {
- sbuf = new StringBuffer(value.length() * 11 / 10); // Add 10% for escaping.
- }
- doAppendEscapedLiteral(sbuf, value, standardConformingStrings);
- return sbuf;
- }
-
- /**
* Escape the given literal <tt>value</tt> and append it to the string builder <tt>sbuf</tt>. If
* <tt>sbuf</tt> is <tt>null</tt>, a new StringBuilder will be returned. The argument
* <tt>standardConformingStrings</tt> defines whether the backend expects standard-conforming
@@ -90,15 +68,14 @@ public class Utils {
public static StringBuilder escapeLiteral(StringBuilder sbuf, String value,
boolean standardConformingStrings) throws SQLException {
if (sbuf == null) {
- sbuf = new StringBuilder(value.length() * 11 / 10); // Add 10% for escaping.
+ sbuf = new StringBuilder((value.length() + 10) / 10 * 11); // Add 10% for escaping.
}
doAppendEscapedLiteral(sbuf, value, standardConformingStrings);
return sbuf;
}
/**
- * Common part for {@link #appendEscapedLiteral(StringBuffer, String, boolean)} and
- * {@link #escapeLiteral(StringBuilder, String, boolean)}
+ * Common part for {@link #escapeLiteral(StringBuilder, String, boolean)}
*
* @param sbuf Either StringBuffer or StringBuilder as we do not expect any IOException to be
* thrown
@@ -146,27 +123,6 @@ public class Utils {
}
/**
- * Escape the given identifier <tt>value</tt> and append it to the string buffer <tt>sbuf</tt>. If
- * <tt>sbuf</tt> is <tt>null</tt>, a new StringBuffer will be returned. This method is different
- * from appendEscapedLiteral in that it includes the quoting required for the identifier while
- * appendEscapedLiteral does not.
- *
- * @param sbuf the string buffer to append to; or <tt>null</tt>
- * @param value the string value
- * @return the sbuf argument; or a new string buffer for sbuf == null
- * @throws SQLException if the string contains a <tt>\0</tt> character
- * @deprecated use {@link #escapeIdentifier(StringBuilder, String)} instead
- */
- public static StringBuffer appendEscapedIdentifier(StringBuffer sbuf, String value)
- throws SQLException {
- if (sbuf == null) {
- sbuf = new StringBuffer(2 + value.length() * 11 / 10); // Add 10% for escaping.
- }
- doAppendEscapedIdentifier(sbuf, value);
- return sbuf;
- }
-
- /**
* Escape the given identifier <tt>value</tt> and append it to the string builder <tt>sbuf</tt>.
* If <tt>sbuf</tt> is <tt>null</tt>, a new StringBuilder will be returned. This method is
* different from appendEscapedLiteral in that it includes the quoting required for the identifier
@@ -180,7 +136,7 @@ public class Utils {
public static StringBuilder escapeIdentifier(StringBuilder sbuf, String value)
throws SQLException {
if (sbuf == null) {
- sbuf = new StringBuilder(2 + value.length() * 11 / 10); // Add 10% for escaping.
+ sbuf = new StringBuilder(2 + (value.length() + 10) / 10 * 11); // Add 10% for escaping.
}
doAppendEscapedIdentifier(sbuf, value);
return sbuf;
diff --git a/pgjdbc/src/main/java/org/postgresql/core/VisibleBufferedInputStream.java b/pgjdbc/src/main/java/org/postgresql/core/VisibleBufferedInputStream.java
index c11aab9..d80ebe1 100644
--- a/pgjdbc/src/main/java/org/postgresql/core/VisibleBufferedInputStream.java
+++ b/pgjdbc/src/main/java/org/postgresql/core/VisibleBufferedInputStream.java
@@ -177,7 +177,7 @@ public class VisibleBufferedInputStream extends InputStream {
/**
* {@inheritDoc}
*/
- public int read(byte to[], int off, int len) throws IOException {
+ public int read(byte[] to, int off, int len) throws IOException {
if ((off | len | (off + len) | (to.length - (off + len))) < 0) {
throw new IndexOutOfBoundsException();
} else if (len == 0) {
diff --git a/pgjdbc/src/main/java/org/postgresql/core/v3/CompositeParameterList.java b/pgjdbc/src/main/java/org/postgresql/core/v3/CompositeParameterList.java
index 4b3666c..438c312 100644
--- a/pgjdbc/src/main/java/org/postgresql/core/v3/CompositeParameterList.java
+++ b/pgjdbc/src/main/java/org/postgresql/core/v3/CompositeParameterList.java
@@ -64,9 +64,9 @@ class CompositeParameterList implements V3ParameterList {
}
public int[] getTypeOIDs() {
- int oids[] = new int[total];
+ int[] oids = new int[total];
for (int i = 0; i < offsets.length; i++) {
- int subOids[] = subparams[i].getTypeOIDs();
+ int[] subOids = subparams[i].getTypeOIDs();
System.arraycopy(subOids, 0, oids, offsets[i], subOids.length);
}
return oids;
@@ -107,6 +107,11 @@ class CompositeParameterList implements V3ParameterList {
subparams[sub].setBytea(index - offsets[sub], stream);
}
+ public void setText(int index, InputStream stream) throws SQLException {
+ int sub = findSubParam(index);
+ subparams[sub].setText(index - offsets[sub], stream);
+ }
+
public void setNull(int index, int oid) throws SQLException {
int sub = findSubParam(index);
subparams[sub].setNull(index - offsets[sub], oid);
diff --git a/pgjdbc/src/main/java/org/postgresql/core/v3/CompositeQuery.java b/pgjdbc/src/main/java/org/postgresql/core/v3/CompositeQuery.java
index 345e39f..789979b 100644
--- a/pgjdbc/src/main/java/org/postgresql/core/v3/CompositeQuery.java
+++ b/pgjdbc/src/main/java/org/postgresql/core/v3/CompositeQuery.java
@@ -44,7 +44,7 @@ class CompositeQuery implements Query {
@Override
public String getNativeSql() {
- StringBuilder sbuf = new StringBuilder(subqueries[0].toString());
+ StringBuilder sbuf = new StringBuilder(subqueries[0].getNativeSql());
for (int i = 1; i < subqueries.length; ++i) {
sbuf.append(';');
sbuf.append(subqueries[i].getNativeSql());
diff --git a/pgjdbc/src/main/java/org/postgresql/core/v3/ConnectionFactoryImpl.java b/pgjdbc/src/main/java/org/postgresql/core/v3/ConnectionFactoryImpl.java
index d5a09cd..a797495 100644
--- a/pgjdbc/src/main/java/org/postgresql/core/v3/ConnectionFactoryImpl.java
+++ b/pgjdbc/src/main/java/org/postgresql/core/v3/ConnectionFactoryImpl.java
@@ -8,13 +8,14 @@ package org.postgresql.core.v3;
import org.postgresql.PGProperty;
import org.postgresql.core.ConnectionFactory;
-import org.postgresql.core.Logger;
import org.postgresql.core.PGStream;
import org.postgresql.core.QueryExecutor;
import org.postgresql.core.ServerVersion;
import org.postgresql.core.SetupQueryRunner;
import org.postgresql.core.SocketFactoryFactory;
import org.postgresql.core.Utils;
+import org.postgresql.core.Version;
+import org.postgresql.hostchooser.CandidateHost;
import org.postgresql.hostchooser.GlobalHostStatusTracker;
import org.postgresql.hostchooser.HostChooser;
import org.postgresql.hostchooser.HostChooserFactory;
@@ -27,16 +28,21 @@ import org.postgresql.util.MD5Digest;
import org.postgresql.util.PSQLException;
import org.postgresql.util.PSQLState;
import org.postgresql.util.ServerErrorMessage;
-import org.postgresql.util.UnixCrypt;
import java.io.IOException;
import java.net.ConnectException;
import java.sql.SQLException;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
+import java.util.Map;
import java.util.Properties;
import java.util.TimeZone;
+import java.util.logging.Level;
+import java.util.logging.LogRecord;
+import java.util.logging.Logger;
+
import javax.net.SocketFactory;
/**
@@ -45,6 +51,8 @@ import javax.net.SocketFactory;
* @author Oliver Jowett (oliver at opencloud.com), based on the previous implementation
*/
public class ConnectionFactoryImpl extends ConnectionFactory {
+
+ private static final Logger LOGGER = Logger.getLogger(ConnectionFactoryImpl.class.getName());
private static final int AUTH_REQ_OK = 0;
private static final int AUTH_REQ_KRB4 = 1;
private static final int AUTH_REQ_KRB5 = 2;
@@ -55,6 +63,9 @@ public class ConnectionFactoryImpl extends ConnectionFactory {
private static final int AUTH_REQ_GSS = 7;
private static final int AUTH_REQ_GSS_CONTINUE = 8;
private static final int AUTH_REQ_SSPI = 9;
+ private static final int AUTH_REQ_SASL = 10;
+ private static final int AUTH_REQ_SASL_CONTINUE = 11;
+ private static final int AUTH_REQ_SASL_FINAL = 12;
/**
* Marker exception; thrown when we want to fall back to using V2.
@@ -64,13 +75,12 @@ public class ConnectionFactoryImpl extends ConnectionFactory {
private ISSPIClient createSSPI(PGStream pgStream,
String spnServiceClass,
- boolean enableNegotiate,
- Logger logger) {
+ boolean enableNegotiate) {
try {
- Class c = Class.forName("org.postgresql.sspi.SSPIClient");
- Class[] cArg = new Class[]{PGStream.class, String.class, boolean.class, Logger.class};
- return (ISSPIClient) c.getDeclaredConstructor(cArg)
- .newInstance(pgStream, spnServiceClass, enableNegotiate, logger);
+ @SuppressWarnings("unchecked")
+ Class<ISSPIClient> c = (Class<ISSPIClient>) Class.forName("org.postgresql.sspi.SSPIClient");
+ return c.getDeclaredConstructor(PGStream.class, String.class, boolean.class)
+ .newInstance(pgStream, spnServiceClass, enableNegotiate);
} catch (Exception e) {
// This catched quite a lot exceptions, but until Java 7 there is no ReflectiveOperationException
throw new IllegalStateException("Unable to load org.postgresql.sspi.SSPIClient."
@@ -78,8 +88,9 @@ public class ConnectionFactoryImpl extends ConnectionFactory {
}
}
+ @Override
public QueryExecutor openConnectionImpl(HostSpec[] hostSpecs, String user, String database,
- Properties info, Logger logger) throws SQLException {
+ Properties info) throws SQLException {
// Extract interesting values from the info properties:
// - the SSL setting
boolean requireSSL;
@@ -100,26 +111,17 @@ public class ConnectionFactoryImpl extends ConnectionFactory {
}
}
- // - the TCP keep alive setting
boolean requireTCPKeepAlive = PGProperty.TCP_KEEP_ALIVE.getBoolean(info);
- // NOTE: To simplify this code, it is assumed that if we are
- // using the V3 protocol, then the database is at least 7.4. That
- // eliminates the need to check database versions and maintain
- // backward-compatible code here.
- //
- // Change by Chris Smith <cdsmith at twu.net>
-
int connectTimeout = PGProperty.CONNECT_TIMEOUT.getInt(info) * 1000;
- // - the targetServerType setting
HostRequirement targetServerType;
+ String targetServerTypeStr = PGProperty.TARGET_SERVER_TYPE.get(info);
try {
- targetServerType =
- HostRequirement.valueOf(info.getProperty("targetServerType", HostRequirement.any.name()));
+ targetServerType = HostRequirement.getTargetServerType(targetServerTypeStr);
} catch (IllegalArgumentException ex) {
throw new PSQLException(
- GT.tr("Invalid targetServerType value: {0}", info.getProperty("targetServerType")),
+ GT.tr("Invalid targetServerType value: {0}", targetServerTypeStr),
PSQLState.CONNECTION_UNABLE_TO_CONNECT);
}
@@ -127,12 +129,22 @@ public class ConnectionFactoryImpl extends ConnectionFactory {
HostChooser hostChooser =
HostChooserFactory.createHostChooser(hostSpecs, targetServerType, info);
- Iterator<HostSpec> hostIter = hostChooser.iterator();
+ Iterator<CandidateHost> hostIter = hostChooser.iterator();
+ Map<HostSpec, HostStatus> knownStates = new HashMap<HostSpec, HostStatus>();
while (hostIter.hasNext()) {
- HostSpec hostSpec = hostIter.next();
-
- if (logger.logDebug()) {
- logger.debug("Trying to establish a protocol version 3 connection to " + hostSpec);
+ CandidateHost candidateHost = hostIter.next();
+ HostSpec hostSpec = candidateHost.hostSpec;
+ LOGGER.log(Level.FINE, "Trying to establish a protocol version 3 connection to {0}", hostSpec);
+
+ // Note: per-connect-attempt status map is used here instead of GlobalHostStatusTracker
+ // for the case when "no good hosts" match (e.g. all the hosts are known as "connectfail")
+ // In that case, the system tries to connect to each host in order, thus it should not look into
+ // GlobalHostStatusTracker
+ HostStatus knownStatus = knownStates.get(hostSpec);
+ if (knownStatus != null && !candidateHost.targetServerType.allowConnectingTo(knownStatus)) {
+ LOGGER.log(Level.FINER, "Known status of host {0} is {1}, and required status was {2}. Will try next host",
+ new Object[]{hostSpec, knownStatus, candidateHost.targetServerType});
+ continue;
}
//
@@ -145,7 +157,7 @@ public class ConnectionFactoryImpl extends ConnectionFactory {
// Construct and send an ssl startup packet if requested.
if (trySSL) {
- newStream = enableSSL(newStream, requireSSL, info, logger, connectTimeout);
+ newStream = enableSSL(newStream, requireSSL, info, connectTimeout);
}
// Set the socket timeout if the "socketTimeout" property has been set.
@@ -169,7 +181,7 @@ public class ConnectionFactoryImpl extends ConnectionFactory {
if (receiveBufferSize > 0) {
newStream.getSocket().setReceiveBufferSize(receiveBufferSize);
} else {
- logger.info("Ignore invalid value for receiveBufferSize: " + receiveBufferSize);
+ LOGGER.log(Level.WARNING, "Ignore invalid value for receiveBufferSize: {0}", receiveBufferSize);
}
}
@@ -179,75 +191,44 @@ public class ConnectionFactoryImpl extends ConnectionFactory {
if (sendBufferSize > 0) {
newStream.getSocket().setSendBufferSize(sendBufferSize);
} else {
- logger.info("Ignore invalid value for sendBufferSize: " + sendBufferSize);
+ LOGGER.log(Level.WARNING, "Ignore invalid value for sendBufferSize: {0}", sendBufferSize);
}
}
- logger.info("Receive Buffer Size is " + newStream.getSocket().getReceiveBufferSize());
- logger.info("Send Buffer Size is " + newStream.getSocket().getSendBufferSize());
-
- List<String[]> paramList = new ArrayList<String[]>();
- paramList.add(new String[]{"user", user});
- paramList.add(new String[]{"database", database});
- paramList.add(new String[]{"client_encoding", "UTF8"});
- paramList.add(new String[]{"DateStyle", "ISO"});
- paramList.add(new String[]{"TimeZone", createPostgresTimeZone()});
- String assumeMinServerVersion = PGProperty.ASSUME_MIN_SERVER_VERSION.get(info);
- if (Utils.parseServerVersionStr(assumeMinServerVersion)
- >= ServerVersion.v9_0.getVersionNum()) {
- // User is explicitly telling us this is a 9.0+ server so set properties here:
- paramList.add(new String[]{"extra_float_digits", "3"});
- String appName = PGProperty.APPLICATION_NAME.get(info);
- if (appName != null) {
- paramList.add(new String[]{"application_name", appName});
- }
- } else {
- // User has not explicitly told us that this is a 9.0+ server so stick to old default:
- paramList.add(new String[]{"extra_float_digits", "2"});
- }
-
- String currentSchema = PGProperty.CURRENT_SCHEMA.get(info);
- if (currentSchema != null) {
- paramList.add(new String[]{"search_path", currentSchema});
- }
+ LOGGER.log(Level.FINE, "Receive Buffer Size is {0}", newStream.getSocket().getReceiveBufferSize());
+ LOGGER.log(Level.FINE, "Send Buffer Size is {0}", newStream.getSocket().getSendBufferSize());
- sendStartupPacket(newStream, paramList, logger);
+ List<String[]> paramList = getParametersForStartup(user, database, info);
+ sendStartupPacket(newStream, paramList);
// Do authentication (until AuthenticationOk).
- doAuthentication(newStream, hostSpec.getHost(), user, info, logger);
+ doAuthentication(newStream, hostSpec.getHost(), user, info);
int cancelSignalTimeout = PGProperty.CANCEL_SIGNAL_TIMEOUT.getInt(info) * 1000;
// Do final startup.
QueryExecutor queryExecutor = new QueryExecutorImpl(newStream, user, database,
- cancelSignalTimeout, info, logger);
+ cancelSignalTimeout, info);
- // Check Master or Slave
+ // Check Master or Secondary
HostStatus hostStatus = HostStatus.ConnectOK;
- if (targetServerType != HostRequirement.any) {
- hostStatus = isMaster(queryExecutor, logger) ? HostStatus.Master : HostStatus.Slave;
+ if (candidateHost.targetServerType != HostRequirement.any) {
+ hostStatus = isMaster(queryExecutor) ? HostStatus.Master : HostStatus.Secondary;
}
GlobalHostStatusTracker.reportHostStatus(hostSpec, hostStatus);
- if (!targetServerType.allowConnectingTo(hostStatus)) {
+ knownStates.put(hostSpec, hostStatus);
+ if (!candidateHost.targetServerType.allowConnectingTo(hostStatus)) {
queryExecutor.close();
- if (hostIter.hasNext()) {
- // still more addresses to try
- continue;
- }
- throw new PSQLException(GT
- .tr("Could not find a server with specified targetServerType: {0}", targetServerType),
- PSQLState.CONNECTION_UNABLE_TO_CONNECT);
+ continue;
}
- runInitialQueries(queryExecutor, info, logger);
+ runInitialQueries(queryExecutor, info);
// And we're done.
return queryExecutor;
} catch (UnsupportedProtocolException upe) {
// Swallow this and return null so ConnectionFactory tries the next protocol.
- if (logger.logDebug()) {
- logger.debug("Protocol not supported, abandoning connection.");
- }
+ LOGGER.log(Level.SEVERE, "Protocol not supported, abandoning connection.", upe);
closeStream(newStream);
return null;
} catch (ConnectException cex) {
@@ -255,6 +236,8 @@ public class ConnectionFactoryImpl extends ConnectionFactory {
// ConnectException is thrown when the connection cannot be made.
// we trap this an return a more meaningful message for the end user
GlobalHostStatusTracker.reportHostStatus(hostSpec, HostStatus.ConnectFail);
+ knownStates.put(hostSpec, HostStatus.ConnectFail);
+ log(Level.WARNING, "ConnectException occurred while connecting to {0}", cex, hostSpec);
if (hostIter.hasNext()) {
// still more addresses to try
continue;
@@ -265,6 +248,8 @@ public class ConnectionFactoryImpl extends ConnectionFactory {
} catch (IOException ioe) {
closeStream(newStream);
GlobalHostStatusTracker.reportHostStatus(hostSpec, HostStatus.ConnectFail);
+ knownStates.put(hostSpec, HostStatus.ConnectFail);
+ log(Level.WARNING, "IOException occurred while connecting to {0}", ioe, hostSpec);
if (hostIter.hasNext()) {
// still more addresses to try
continue;
@@ -273,6 +258,9 @@ public class ConnectionFactoryImpl extends ConnectionFactory {
PSQLState.CONNECTION_UNABLE_TO_CONNECT, ioe);
} catch (SQLException se) {
closeStream(newStream);
+ log(Level.WARNING, "SQLException occurred while connecting to {0}", se, hostSpec);
+ GlobalHostStatusTracker.reportHostStatus(hostSpec, HostStatus.ConnectFail);
+ knownStates.put(hostSpec, HostStatus.ConnectFail);
if (hostIter.hasNext()) {
// still more addresses to try
continue;
@@ -280,10 +268,55 @@ public class ConnectionFactoryImpl extends ConnectionFactory {
throw se;
}
}
- throw new PSQLException(GT.tr("The connection url is invalid."),
+ throw new PSQLException(GT
+ .tr("Could not find a server with specified targetServerType: {0}", targetServerType),
PSQLState.CONNECTION_UNABLE_TO_CONNECT);
}
+ private List<String[]> getParametersForStartup(String user, String database, Properties info) {
+ List<String[]> paramList = new ArrayList<String[]>();
+ paramList.add(new String[]{"user", user});
+ paramList.add(new String[]{"database", database});
+ paramList.add(new String[]{"client_encoding", "UTF8"});
+ paramList.add(new String[]{"DateStyle", "ISO"});
+ paramList.add(new String[]{"TimeZone", createPostgresTimeZone()});
+
+ Version assumeVersion = ServerVersion.from(PGProperty.ASSUME_MIN_SERVER_VERSION.get(info));
+
+ if (assumeVersion.getVersionNum() >= ServerVersion.v9_0.getVersionNum()) {
+ // User is explicitly telling us this is a 9.0+ server so set properties here:
+ paramList.add(new String[]{"extra_float_digits", "3"});
+ String appName = PGProperty.APPLICATION_NAME.get(info);
+ if (appName != null) {
+ paramList.add(new String[]{"application_name", appName});
+ }
+ } else {
+ // User has not explicitly told us that this is a 9.0+ server so stick to old default:
+ paramList.add(new String[]{"extra_float_digits", "2"});
+ }
+
+ String replication = PGProperty.REPLICATION.get(info);
+ if (replication != null && assumeVersion.getVersionNum() >= ServerVersion.v9_4.getVersionNum()) {
+ paramList.add(new String[]{"replication", replication});
+ }
+
+ String currentSchema = PGProperty.CURRENT_SCHEMA.get(info);
+ if (currentSchema != null) {
+ paramList.add(new String[]{"search_path", currentSchema});
+ }
+ return paramList;
+ }
+
+ private static void log(Level level, String msg, Throwable thrown, Object... params) {
+ if (!LOGGER.isLoggable(level)) {
+ return;
+ }
+ LogRecord rec = new LogRecord(level, msg);
+ rec.setParameters(params);
+ rec.setThrown(thrown);
+ LOGGER.log(rec);
+ }
+
/**
* Convert Java time zone to postgres time zone. All others stay the same except that GMT+nn
* changes to GMT-nn and vise versa.
@@ -297,23 +330,24 @@ public class ConnectionFactoryImpl extends ConnectionFactory {
}
char sign = tz.charAt(3);
String start;
- if (sign == '+') {
- start = "GMT-";
- } else if (sign == '-') {
- start = "GMT+";
- } else {
- // unknown type
- return tz;
+ switch (sign) {
+ case '+':
+ start = "GMT-";
+ break;
+ case '-':
+ start = "GMT+";
+ break;
+ default:
+ // unknown type
+ return tz;
}
return start + tz.substring(4);
}
- private PGStream enableSSL(PGStream pgStream, boolean requireSSL, Properties info, Logger logger,
- int connectTimeout) throws IOException, SQLException {
- if (logger.logDebug()) {
- logger.debug(" FE=> SSLRequest");
- }
+ private PGStream enableSSL(PGStream pgStream, boolean requireSSL, Properties info, int connectTimeout)
+ throws IOException, SQLException {
+ LOGGER.log(Level.FINEST, " FE=> SSLRequest");
// Send SSL request packet
pgStream.sendInteger4(8);
@@ -325,9 +359,7 @@ public class ConnectionFactoryImpl extends ConnectionFactory {
int beresp = pgStream.receiveChar();
switch (beresp) {
case 'E':
- if (logger.logDebug()) {
- logger.debug(" <=BE SSLError");
- }
+ LOGGER.log(Level.FINEST, " <=BE SSLError");
// Server doesn't even know about the SSL handshake protocol
if (requireSSL) {
@@ -340,9 +372,7 @@ public class ConnectionFactoryImpl extends ConnectionFactory {
return new PGStream(pgStream.getSocketFactory(), pgStream.getHostSpec(), connectTimeout);
case 'N':
- if (logger.logDebug()) {
- logger.debug(" <=BE SSLRefused");
- }
+ LOGGER.log(Level.FINEST, " <=BE SSLRefused");
// Server does not support ssl
if (requireSSL) {
@@ -353,12 +383,10 @@ public class ConnectionFactoryImpl extends ConnectionFactory {
return pgStream;
case 'S':
- if (logger.logDebug()) {
- logger.debug(" <=BE SSLOk");
- }
+ LOGGER.log(Level.FINEST, " <=BE SSLOk");
// Server supports ssl
- org.postgresql.ssl.MakeSSL.convert(pgStream, info, logger);
+ org.postgresql.ssl.MakeSSL.convert(pgStream, info);
return pgStream;
default:
@@ -367,9 +395,9 @@ public class ConnectionFactoryImpl extends ConnectionFactory {
}
}
- private void sendStartupPacket(PGStream pgStream, List<String[]> params, Logger logger)
+ private void sendStartupPacket(PGStream pgStream, List<String[]> params)
throws IOException {
- if (logger.logDebug()) {
+ if (LOGGER.isLoggable(Level.FINEST)) {
StringBuilder details = new StringBuilder();
for (int i = 0; i < params.size(); ++i) {
if (i != 0) {
@@ -379,7 +407,7 @@ public class ConnectionFactoryImpl extends ConnectionFactory {
details.append("=");
details.append(params.get(i)[1]);
}
- logger.debug(" FE=> StartupPacket(" + details + ")");
+ LOGGER.log(Level.FINEST, " FE=> StartupPacket({0})", details);
}
// Precalculate message length and encode params.
@@ -406,8 +434,7 @@ public class ConnectionFactoryImpl extends ConnectionFactory {
pgStream.flush();
}
- private void doAuthentication(PGStream pgStream, String host, String user, Properties info,
- Logger logger) throws IOException, SQLException {
+ private void doAuthentication(PGStream pgStream, String host, String user, Properties info) throws IOException, SQLException {
// Now get the response from the backend, either an error message
// or an authentication request
@@ -416,6 +443,11 @@ public class ConnectionFactoryImpl extends ConnectionFactory {
/* SSPI negotiation state, if used */
ISSPIClient sspiClient = null;
+ //#if mvn.project.property.postgresql.jdbc.spec >= "JDBC4.2"
+ /* SCRAM authentication state, if used */
+ org.postgresql.jre8.sasl.ScramAuthenticator scramAuthenticator = null;
+ //#endif
+
try {
authloop: while (true) {
int beresp = pgStream.receiveChar();
@@ -436,10 +468,8 @@ public class ConnectionFactoryImpl extends ConnectionFactory {
}
ServerErrorMessage errorMsg =
- new ServerErrorMessage(pgStream.receiveErrorString(l_elen - 4), logger.getLogLevel());
- if (logger.logDebug()) {
- logger.debug(" <=BE ErrorMessage(" + errorMsg + ")");
- }
+ new ServerErrorMessage(pgStream.receiveErrorString(l_elen - 4));
+ LOGGER.log(Level.FINEST, " <=BE ErrorMessage({0})", errorMsg);
throw new PSQLException(errorMsg);
case 'R':
@@ -452,42 +482,10 @@ public class ConnectionFactoryImpl extends ConnectionFactory {
// Process the request.
switch (areq) {
- case AUTH_REQ_CRYPT: {
- byte[] salt = pgStream.receive(2);
-
- if (logger.logDebug()) {
- logger.debug(
- " <=BE AuthenticationReqCrypt(salt='" + new String(salt, "US-ASCII") + "')");
- }
-
- if (password == null) {
- throw new PSQLException(
- GT.tr(
- "The server requested password-based authentication, but no password was provided."),
- PSQLState.CONNECTION_REJECTED);
- }
-
- byte[] encodedResult = UnixCrypt.crypt(salt, password.getBytes("UTF-8"));
-
- if (logger.logDebug()) {
- logger.debug(
- " FE=> Password(crypt='" + new String(encodedResult, "US-ASCII") + "')");
- }
-
- pgStream.sendChar('p');
- pgStream.sendInteger4(4 + encodedResult.length + 1);
- pgStream.send(encodedResult);
- pgStream.sendChar(0);
- pgStream.flush();
-
- break;
- }
-
case AUTH_REQ_MD5: {
byte[] md5Salt = pgStream.receive(4);
- if (logger.logDebug()) {
- logger
- .debug(" <=BE AuthenticationReqMD5(salt=" + Utils.toHexString(md5Salt) + ")");
+ if (LOGGER.isLoggable(Level.FINEST)) {
+ LOGGER.log(Level.FINEST, " <=BE AuthenticationReqMD5(salt={0})", Utils.toHexString(md5Salt));
}
if (password == null) {
@@ -500,8 +498,8 @@ public class ConnectionFactoryImpl extends ConnectionFactory {
byte[] digest =
MD5Digest.encode(user.getBytes("UTF-8"), password.getBytes("UTF-8"), md5Salt);
- if (logger.logDebug()) {
- logger.debug(" FE=> Password(md5digest=" + new String(digest, "US-ASCII") + ")");
+ if (LOGGER.isLoggable(Level.FINEST)) {
+ LOGGER.log(Level.FINEST, " FE=> Password(md5digest={0})", new String(digest, "US-ASCII"));
}
pgStream.sendChar('p');
@@ -514,10 +512,8 @@ public class ConnectionFactoryImpl extends ConnectionFactory {
}
case AUTH_REQ_PASSWORD: {
- if (logger.logDebug()) {
- logger.debug(" <=BE AuthenticationReqPassword");
- logger.debug(" FE=> Password(password=<not shown>)");
- }
+ LOGGER.log(Level.FINEST, "<=BE AuthenticationReqPassword");
+ LOGGER.log(Level.FINEST, " FE=> Password(password=<not shown>)");
if (password == null) {
throw new PSQLException(
@@ -567,20 +563,18 @@ public class ConnectionFactoryImpl extends ConnectionFactory {
* name we'll always use JSSE GSSAPI.
*/
if (gsslib.equals("gssapi")) {
- logger.debug("Using JSSE GSSAPI, param gsslib=gssapi");
+ LOGGER.log(Level.FINE, "Using JSSE GSSAPI, param gsslib=gssapi");
} else if (areq == AUTH_REQ_GSS && !gsslib.equals("sspi")) {
- logger.debug(
+ LOGGER.log(Level.FINE,
"Using JSSE GSSAPI, gssapi requested by server and gsslib=sspi not forced");
} else {
/* Determine if SSPI is supported by the client */
sspiClient = createSSPI(pgStream, PGProperty.SSPI_SERVICE_CLASS.get(info),
/* Use negotiation for SSPI, or if explicitly requested for GSS */
- areq == AUTH_REQ_SSPI || (areq == AUTH_REQ_GSS && usespnego), logger);
+ areq == AUTH_REQ_SSPI || (areq == AUTH_REQ_GSS && usespnego));
useSSPI = sspiClient.isSSPISupported();
- if (logger.logDebug()) {
- logger.debug("SSPI support detected: " + useSSPI);
- }
+ LOGGER.log(Level.FINE, "SSPI support detected: {0}", useSSPI);
if (!useSSPI) {
/* No need to dispose() if no SSPI used */
@@ -593,9 +587,8 @@ public class ConnectionFactoryImpl extends ConnectionFactory {
}
}
- if (logger.logDebug()) {
- logger.debug("Using SSPI: " + useSSPI + ", gsslib=" + gsslib
- + " and SSPI support detected");
+ if (LOGGER.isLoggable(Level.FINE)) {
+ LOGGER.log(Level.FINE, "Using SSPI: {0}, gsslib={1} and SSPI support detected", new Object[]{useSSPI, gsslib});
}
}
@@ -606,9 +599,9 @@ public class ConnectionFactoryImpl extends ConnectionFactory {
/* Use JGSS's GSSAPI for this request */
org.postgresql.gss.MakeGSS.authenticate(pgStream, host, user, password,
PGProperty.JAAS_APPLICATION_NAME.get(info),
- PGProperty.KERBEROS_SERVER_NAME.get(info), logger, usespnego);
+ PGProperty.KERBEROS_SERVER_NAME.get(info), usespnego,
+ PGProperty.JAAS_LOGIN.getBoolean(info));
}
-
break;
case AUTH_REQ_GSS_CONTINUE:
@@ -618,19 +611,39 @@ public class ConnectionFactoryImpl extends ConnectionFactory {
sspiClient.continueSSPI(l_msgLen - 8);
break;
- case AUTH_REQ_OK:
- /* Cleanup after successful authentication */
- if (logger.logDebug()) {
- logger.debug(" <=BE AuthenticationOk");
+ case AUTH_REQ_SASL:
+ LOGGER.log(Level.FINEST, " <=BE AuthenticationSASL");
+
+ //#if mvn.project.property.postgresql.jdbc.spec >= "JDBC4.2"
+ scramAuthenticator = new org.postgresql.jre8.sasl.ScramAuthenticator(user, password, pgStream);
+ scramAuthenticator.processServerMechanismsAndInit();
+ scramAuthenticator.sendScramClientFirstMessage();
+ //#else
+ if (true) {
+ throw new PSQLException(GT.tr(
+ "SCRAM authentication is not supported by this driver. You need JDK >= 8 and pgjdbc >= 42.2.0 (not \".jre\" vesions)",
+ areq), PSQLState.CONNECTION_REJECTED);
}
+ //#endif
+ break;
+ //#if mvn.project.property.postgresql.jdbc.spec >= "JDBC4.2"
+ case AUTH_REQ_SASL_CONTINUE:
+ scramAuthenticator.processServerFirstMessage(l_msgLen - 4 - 4);
+ break;
+
+ case AUTH_REQ_SASL_FINAL:
+ scramAuthenticator.verifyServerSignature(l_msgLen - 4 - 4);
+ break;
+ //#endif
+
+ case AUTH_REQ_OK:
+ /* Cleanup after successful authentication */
+ LOGGER.log(Level.FINEST, " <=BE AuthenticationOk");
break authloop; // We're done.
default:
- if (logger.logDebug()) {
- logger.debug(" <=BE AuthenticationReq (unsupported type " + (areq) + ")");
- }
-
+ LOGGER.log(Level.FINEST, " <=BE AuthenticationReq (unsupported type {0})", areq);
throw new PSQLException(GT.tr(
"The authentication type {0} is not supported. Check that you have configured the pg_hba.conf file to include the client''s IP address or subnet, and that it is using an authentication scheme supported by the driver.",
areq), PSQLState.CONNECTION_REJECTED);
@@ -649,7 +662,7 @@ public class ConnectionFactoryImpl extends ConnectionFactory {
try {
sspiClient.dispose();
} catch (RuntimeException ex) {
- logger.log("Unexpected error during SSPI context disposal", ex);
+ LOGGER.log(Level.WARNING, "Unexpected error during SSPI context disposal", ex);
}
}
@@ -657,7 +670,7 @@ public class ConnectionFactoryImpl extends ConnectionFactory {
}
- private void runInitialQueries(QueryExecutor queryExecutor, Properties info, Logger logger)
+ private void runInitialQueries(QueryExecutor queryExecutor, Properties info)
throws SQLException {
String assumeMinServerVersion = PGProperty.ASSUME_MIN_SERVER_VERSION.get(info);
if (Utils.parseServerVersionStr(assumeMinServerVersion) >= ServerVersion.v9_0.getVersionNum()) {
@@ -682,8 +695,7 @@ public class ConnectionFactoryImpl extends ConnectionFactory {
}
- private boolean isMaster(QueryExecutor queryExecutor, Logger logger)
- throws SQLException, IOException {
+ private boolean isMaster(QueryExecutor queryExecutor) throws SQLException, IOException {
byte[][] results = SetupQueryRunner.run(queryExecutor, "show transaction_read_only", true);
String value = queryExecutor.getEncoding().decode(results[0]);
return value.equalsIgnoreCase("off");
diff --git a/pgjdbc/src/main/java/org/postgresql/core/v3/CopyDualImpl.java b/pgjdbc/src/main/java/org/postgresql/core/v3/CopyDualImpl.java
new file mode 100644
index 0000000..8ff5cf8
--- /dev/null
+++ b/pgjdbc/src/main/java/org/postgresql/core/v3/CopyDualImpl.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 2016, PostgreSQL Global Development Group
+ * See the LICENSE file in the project root for more information.
+ */
+
+package org.postgresql.core.v3;
+
+import org.postgresql.copy.CopyDual;
+import org.postgresql.util.PSQLException;
+
+import java.sql.SQLException;
+import java.util.LinkedList;
+import java.util.Queue;
+
+public class CopyDualImpl extends CopyOperationImpl implements CopyDual {
+ private Queue<byte[]> received = new LinkedList<byte[]>();
+
+ public void writeToCopy(byte[] data, int off, int siz) throws SQLException {
+ queryExecutor.writeToCopy(this, data, off, siz);
+ }
+
+ public void flushCopy() throws SQLException {
+ queryExecutor.flushCopy(this);
+ }
+
+ public long endCopy() throws SQLException {
+ return queryExecutor.endCopy(this);
+ }
+
+ public byte[] readFromCopy() throws SQLException {
+ if (received.isEmpty()) {
+ queryExecutor.readFromCopy(this, true);
+ }
+
+ return received.poll();
+ }
+
+ @Override
+ public byte[] readFromCopy(boolean block) throws SQLException {
+ if (received.isEmpty()) {
+ queryExecutor.readFromCopy(this, block);
+ }
+
+ return received.poll();
+ }
+
+ @Override
+ public void handleCommandStatus(String status) throws PSQLException {
+ }
+
+ protected void handleCopydata(byte[] data) {
+ received.add(data);
+ }
+}
diff --git a/pgjdbc/src/main/java/org/postgresql/core/v3/CopyInImpl.java b/pgjdbc/src/main/java/org/postgresql/core/v3/CopyInImpl.java
index 1570a69..ffac1e8 100644
--- a/pgjdbc/src/main/java/org/postgresql/core/v3/CopyInImpl.java
+++ b/pgjdbc/src/main/java/org/postgresql/core/v3/CopyInImpl.java
@@ -6,6 +6,9 @@
package org.postgresql.core.v3;
import org.postgresql.copy.CopyIn;
+import org.postgresql.util.GT;
+import org.postgresql.util.PSQLException;
+import org.postgresql.util.PSQLState;
import java.sql.SQLException;
@@ -39,4 +42,9 @@ public class CopyInImpl extends CopyOperationImpl implements CopyIn {
public long endCopy() throws SQLException {
return queryExecutor.endCopy(this);
}
+
+ protected void handleCopydata(byte[] data) throws PSQLException {
+ throw new PSQLException(GT.tr("CopyIn copy direction can't receive data"),
+ PSQLState.PROTOCOL_VIOLATION);
+ }
}
diff --git a/pgjdbc/src/main/java/org/postgresql/core/v3/CopyOperationImpl.java b/pgjdbc/src/main/java/org/postgresql/core/v3/CopyOperationImpl.java
index 4149c42..7676117 100644
--- a/pgjdbc/src/main/java/org/postgresql/core/v3/CopyOperationImpl.java
+++ b/pgjdbc/src/main/java/org/postgresql/core/v3/CopyOperationImpl.java
@@ -12,7 +12,7 @@ import org.postgresql.util.PSQLState;
import java.sql.SQLException;
-public class CopyOperationImpl implements CopyOperation {
+public abstract class CopyOperationImpl implements CopyOperation {
QueryExecutorImpl queryExecutor;
int rowFormat;
int[] fieldFormats;
@@ -56,6 +56,14 @@ public class CopyOperationImpl implements CopyOperation {
}
}
+ /**
+ * Consume received copy data
+ *
+ * @param data data that was receive by copy protocol
+ * @throws PSQLException if some internal problem occurs
+ */
+ protected abstract void handleCopydata(byte[] data) throws PSQLException;
+
public long getHandledRowCount() {
return handledRowCount;
}
diff --git a/pgjdbc/src/main/java/org/postgresql/core/v3/CopyOutImpl.java b/pgjdbc/src/main/java/org/postgresql/core/v3/CopyOutImpl.java
index 96481dd..a90ac6f 100644
--- a/pgjdbc/src/main/java/org/postgresql/core/v3/CopyOutImpl.java
+++ b/pgjdbc/src/main/java/org/postgresql/core/v3/CopyOutImpl.java
@@ -27,12 +27,17 @@ public class CopyOutImpl extends CopyOperationImpl implements CopyOut {
private byte[] currentDataRow;
public byte[] readFromCopy() throws SQLException {
+ return readFromCopy(true);
+ }
+
+ @Override
+ public byte[] readFromCopy(boolean block) throws SQLException {
currentDataRow = null;
- queryExecutor.readFromCopy(this);
+ queryExecutor.readFromCopy(this, block);
return currentDataRow;
}
- void handleCopydata(byte[] data) {
+ protected void handleCopydata(byte[] data) {
currentDataRow = data;
}
}
diff --git a/pgjdbc/src/main/java/org/postgresql/core/v3/DescribeRequest.java b/pgjdbc/src/main/java/org/postgresql/core/v3/DescribeRequest.java
index 9d5d0ca..05cc7be 100644
--- a/pgjdbc/src/main/java/org/postgresql/core/v3/DescribeRequest.java
+++ b/pgjdbc/src/main/java/org/postgresql/core/v3/DescribeRequest.java
@@ -16,7 +16,7 @@ class DescribeRequest {
public final boolean describeOnly;
public final String statementName;
- public DescribeRequest(SimpleQuery query, SimpleParameterList parameterList,
+ DescribeRequest(SimpleQuery query, SimpleParameterList parameterList,
boolean describeOnly, String statementName) {
this.query = query;
this.parameterList = parameterList;
diff --git a/pgjdbc/src/main/java/org/postgresql/core/v3/ExecuteRequest.java b/pgjdbc/src/main/java/org/postgresql/core/v3/ExecuteRequest.java
index 1127d0c..41a5831 100644
--- a/pgjdbc/src/main/java/org/postgresql/core/v3/ExecuteRequest.java
+++ b/pgjdbc/src/main/java/org/postgresql/core/v3/ExecuteRequest.java
@@ -15,7 +15,7 @@ class ExecuteRequest {
public final Portal portal;
public final boolean asSimple;
- public ExecuteRequest(SimpleQuery query, Portal portal, boolean asSimple) {
+ ExecuteRequest(SimpleQuery query, Portal portal, boolean asSimple) {
this.query = query;
this.portal = portal;
this.asSimple = asSimple;
diff --git a/pgjdbc/src/main/java/org/postgresql/core/v3/QueryExecutorImpl.java b/pgjdbc/src/main/java/org/postgresql/core/v3/QueryExecutorImpl.java
index 026f34c..e15e57e 100644
--- a/pgjdbc/src/main/java/org/postgresql/core/v3/QueryExecutorImpl.java
+++ b/pgjdbc/src/main/java/org/postgresql/core/v3/QueryExecutorImpl.java
@@ -7,11 +7,12 @@
package org.postgresql.core.v3;
import org.postgresql.PGProperty;
+import org.postgresql.copy.CopyIn;
import org.postgresql.copy.CopyOperation;
+import org.postgresql.copy.CopyOut;
import org.postgresql.core.Encoding;
import org.postgresql.core.EncodingPredictor;
import org.postgresql.core.Field;
-import org.postgresql.core.Logger;
import org.postgresql.core.NativeQuery;
import org.postgresql.core.Oid;
import org.postgresql.core.PGBindException;
@@ -21,6 +22,7 @@ import org.postgresql.core.Parser;
import org.postgresql.core.Query;
import org.postgresql.core.QueryExecutor;
import org.postgresql.core.QueryExecutorBase;
+import org.postgresql.core.ReplicationProtocol;
import org.postgresql.core.ResultCursor;
import org.postgresql.core.ResultHandler;
import org.postgresql.core.ResultHandlerBase;
@@ -29,6 +31,7 @@ import org.postgresql.core.SqlCommand;
import org.postgresql.core.SqlCommandType;
import org.postgresql.core.TransactionState;
import org.postgresql.core.Utils;
+import org.postgresql.core.v3.replication.V3ReplicationProtocol;
import org.postgresql.jdbc.AutoSave;
import org.postgresql.jdbc.BatchResultHandler;
import org.postgresql.jdbc.TimestampUtils;
@@ -42,11 +45,15 @@ import java.io.IOException;
import java.lang.ref.PhantomReference;
import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue;
+import java.net.Socket;
+import java.net.SocketException;
+import java.net.SocketTimeoutException;
import java.sql.SQLException;
import java.sql.SQLWarning;
import java.sql.Statement;
import java.util.ArrayDeque;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.Deque;
import java.util.HashMap;
import java.util.HashSet;
@@ -54,11 +61,20 @@ import java.util.List;
import java.util.Properties;
import java.util.Set;
import java.util.TimeZone;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
/**
* QueryExecutor implementation for the V3 protocol.
*/
public class QueryExecutorImpl extends QueryExecutorBase {
+
+ private static final Logger LOGGER = Logger.getLogger(QueryExecutorImpl.class.getName());
+ private static final Pattern COMMAND_COMPLETE_PATTERN = Pattern.compile("^([A-Za-z]++)(?: (\\d++))?+(?: (\\d++))?+$");
+
/**
* TimeZone of the current connection (TimeZone backend parameter)
*/
@@ -104,12 +120,14 @@ public class QueryExecutorImpl extends QueryExecutorBase {
*/
private SQLException transactionFailCause;
+ private final ReplicationProtocol replicationProtocol;
+
public QueryExecutorImpl(PGStream pgStream, String user, String database,
- int cancelSignalTimeout, Properties info, Logger logger) throws SQLException, IOException {
- super(logger, pgStream, user, database, cancelSignalTimeout, info);
+ int cancelSignalTimeout, Properties info) throws SQLException, IOException {
+ super(pgStream, user, database, cancelSignalTimeout, info);
this.allowEncodingChanges = PGProperty.ALLOW_ENCODING_CHANGES.getBoolean(info);
-
+ this.replicationProtocol = new V3ReplicationProtocol(this, pgStream);
readStartupMessages();
}
@@ -252,9 +270,9 @@ public class QueryExecutorImpl extends QueryExecutorBase {
public synchronized void execute(Query query, ParameterList parameters, ResultHandler handler,
int maxRows, int fetchSize, int flags) throws SQLException {
waitOnLock();
- if (logger.logDebug()) {
- logger.debug("simple execute, handler=" + handler + ", maxRows=" + maxRows + ", fetchSize="
- + fetchSize + ", flags=" + flags);
+ if (LOGGER.isLoggable(Level.FINEST)) {
+ LOGGER.log(Level.FINEST, " simple execute, handler={0}, maxRows={1}, fetchSize={2}, flags={3}",
+ new Object[]{handler, maxRows, fetchSize, flags});
}
if (parameters == null) {
@@ -335,10 +353,10 @@ public class QueryExecutorImpl extends QueryExecutorBase {
|| !(query instanceof SimpleQuery)
|| ((SimpleQuery) query).getFields() != null)) {
sendOneQuery(autoSaveQuery, SimpleQuery.NO_PARAMETERS, 1, 0,
- updateQueryMode(QUERY_NO_RESULTS | QUERY_NO_METADATA)
+ QUERY_NO_RESULTS | QUERY_NO_METADATA
// PostgreSQL does not support bind, exec, simple, sync message flow,
// so we force autosavepoint to use simple if the main query is using simple
- | (flags & QueryExecutor.QUERY_EXECUTE_AS_SIMPLE));
+ | QUERY_EXECUTE_AS_SIMPLE);
return true;
}
return false;
@@ -349,8 +367,9 @@ public class QueryExecutorImpl extends QueryExecutorBase {
&& getTransactionState() == TransactionState.FAILED
&& (getAutoSave() == AutoSave.ALWAYS || willHealOnRetry(e))) {
try {
+ // ROLLBACK and AUTOSAVE are executed as simple always to overcome "statement no longer exists S_xx"
execute(restoreToAutoSave, SimpleQuery.NO_PARAMETERS, new ResultHandlerDelegate(null),
- 1, 0, updateQueryMode(QUERY_NO_RESULTS | QUERY_NO_METADATA));
+ 1, 0, QUERY_NO_RESULTS | QUERY_NO_METADATA | QUERY_EXECUTE_AS_SIMPLE);
} catch (SQLException e2) {
// That's O(N), sorry
e.setNextException(e2);
@@ -412,9 +431,9 @@ public class QueryExecutorImpl extends QueryExecutorBase {
public synchronized void execute(Query[] queries, ParameterList[] parameterLists,
BatchResultHandler batchHandler, int maxRows, int fetchSize, int flags) throws SQLException {
waitOnLock();
- if (logger.logDebug()) {
- logger.debug("batch execute " + queries.length + " queries, handler=" + batchHandler + ", maxRows="
- + maxRows + ", fetchSize=" + fetchSize + ", flags=" + flags);
+ if (LOGGER.isLoggable(Level.FINEST)) {
+ LOGGER.log(Level.FINEST, " batch execute {0} queries, handler={1}, maxRows={2}, fetchSize={3}, flags={4}",
+ new Object[]{queries.length, batchHandler, maxRows, fetchSize, flags});
}
flags = updateQueryMode(flags);
@@ -545,9 +564,7 @@ public class QueryExecutorImpl extends QueryExecutorBase {
public void doSubprotocolBegin() throws SQLException {
if (getTransactionState() == TransactionState.IDLE) {
- if (logger.logDebug()) {
- logger.debug("Issuing BEGIN before fastpath or copy call.");
- }
+ LOGGER.log(Level.FINEST, "Issuing BEGIN before fastpath or copy call.");
ResultHandler handler = new ResultHandlerBase() {
private boolean sawBegin = false;
@@ -595,8 +612,8 @@ public class QueryExecutorImpl extends QueryExecutorBase {
private void sendFastpathCall(int fnid, SimpleParameterList params)
throws SQLException, IOException {
- if (logger.logDebug()) {
- logger.debug(" FE=> FunctionCall(" + fnid + ", " + params.getParameterCount() + " params)");
+ if (LOGGER.isLoggable(Level.FINEST)) {
+ LOGGER.log(Level.FINEST, " FE=> FunctionCall({0}, {1} params)", new Object[]{fnid, params.getParameterCount()});
}
//
@@ -637,35 +654,96 @@ public class QueryExecutorImpl extends QueryExecutorBase {
pgStream.flush();
}
+ // Just for API compatibility with previous versions.
public synchronized void processNotifies() throws SQLException {
+ processNotifies(-1);
+ }
+
+ /**
+ * @param timeoutMillis when > 0, block for this time
+ * when =0, block forever
+ * when < 0, don't block
+ */
+ public synchronized void processNotifies(int timeoutMillis) throws SQLException {
waitOnLock();
// Asynchronous notifies only arrive when we are not in a transaction
if (getTransactionState() != TransactionState.IDLE) {
return;
}
+ if (hasNotifications()) {
+ // No need to timeout when there are already notifications. We just check for more in this case.
+ timeoutMillis = -1;
+ }
+
+ boolean useTimeout = timeoutMillis > 0;
+ long startTime = 0;
+ int oldTimeout = 0;
+ if (useTimeout) {
+ startTime = System.currentTimeMillis();
+ try {
+ oldTimeout = pgStream.getSocket().getSoTimeout();
+ } catch (SocketException e) {
+ throw new PSQLException(GT.tr("An error occurred while trying to get the socket "
+ + "timeout."), PSQLState.CONNECTION_FAILURE, e);
+ }
+ }
+
try {
- while (pgStream.hasMessagePending()) {
+ while (pgStream.hasMessagePending() || timeoutMillis >= 0 ) {
+ if (useTimeout && timeoutMillis >= 0) {
+ setSocketTimeout(timeoutMillis);
+ }
int c = pgStream.receiveChar();
+ if (useTimeout && timeoutMillis >= 0) {
+ setSocketTimeout(0); // Don't timeout after first char
+ }
switch (c) {
case 'A': // Asynchronous Notify
receiveAsyncNotify();
- break;
+ timeoutMillis = -1;
+ continue;
case 'E':
// Error Response (response to pretty much everything; backend then skips until Sync)
throw receiveErrorResponse();
case 'N': // Notice Response (warnings / info)
SQLWarning warning = receiveNoticeResponse();
addWarning(warning);
+ if (useTimeout) {
+ long newTimeMillis = System.currentTimeMillis();
+ timeoutMillis += startTime - newTimeMillis; // Overflows after 49 days, ignore that
+ startTime = newTimeMillis;
+ if (timeoutMillis == 0) {
+ timeoutMillis = -1; // Don't accidentially wait forever
+ }
+ }
break;
default:
throw new PSQLException(GT.tr("Unknown Response Type {0}.", (char) c),
PSQLState.CONNECTION_FAILURE);
}
}
+ } catch (SocketTimeoutException ioe) {
+ // No notifications this time...
} catch (IOException ioe) {
throw new PSQLException(GT.tr("An I/O error occurred while sending to the backend."),
PSQLState.CONNECTION_FAILURE, ioe);
+ } finally {
+ if (useTimeout) {
+ setSocketTimeout(oldTimeout);
+ }
+ }
+ }
+
+ private void setSocketTimeout(int millis) throws PSQLException {
+ try {
+ Socket s = pgStream.getSocket();
+ if (!s.isClosed()) { // Is this check required?
+ pgStream.getSocket().setSoTimeout(millis);
+ }
+ } catch (SocketException e) {
+ throw new PSQLException(GT.tr("An error occurred while trying to reset the socket timeout."),
+ PSQLState.CONNECTION_FAILURE, e);
}
}
@@ -706,12 +784,10 @@ public class QueryExecutorImpl extends QueryExecutorBase {
int msgLen = pgStream.receiveInteger4();
int valueLen = pgStream.receiveInteger4();
- if (logger.logDebug()) {
- logger.debug(" <=BE FunctionCallResponse(" + valueLen + " bytes)");
- }
+ LOGGER.log(Level.FINEST, " <=BE FunctionCallResponse({0} bytes)", valueLen);
if (valueLen != -1) {
- byte buf[] = new byte[valueLen];
+ byte[] buf = new byte[valueLen];
pgStream.receive(buf, 0, valueLen);
returnValue = buf;
}
@@ -750,12 +826,10 @@ public class QueryExecutorImpl extends QueryExecutorBase {
if (!suppressBegin) {
doSubprotocolBegin();
}
- byte buf[] = Utils.encodeUTF8(sql);
+ byte[] buf = Utils.encodeUTF8(sql);
try {
- if (logger.logDebug()) {
- logger.debug(" FE=> Query(CopyStart)");
- }
+ LOGGER.log(Level.FINEST, " FE=> Query(CopyStart)");
pgStream.sendChar('Q');
pgStream.sendInteger4(buf.length + 4 + 1);
@@ -809,11 +883,9 @@ public class QueryExecutorImpl extends QueryExecutorBase {
int errors = 0;
try {
- if (op instanceof CopyInImpl) {
+ if (op instanceof CopyIn) {
synchronized (this) {
- if (logger.logDebug()) {
- logger.debug("FE => CopyFail");
- }
+ LOGGER.log(Level.FINEST, "FE => CopyFail");
final byte[] msg = Utils.encodeUTF8("Copy cancel requested");
pgStream.sendChar('f'); // CopyFail
pgStream.sendInteger4(5 + msg.length);
@@ -837,7 +909,7 @@ public class QueryExecutorImpl extends QueryExecutorBase {
}
} while (hasLock(op));
}
- } else if (op instanceof CopyOutImpl) {
+ } else if (op instanceof CopyOut) {
sendQueryCancel();
}
@@ -856,7 +928,7 @@ public class QueryExecutorImpl extends QueryExecutorBase {
}
}
- if (op instanceof CopyInImpl) {
+ if (op instanceof CopyIn) {
if (errors < 1) {
throw new PSQLException(GT.tr("Missing expected error response to copy cancel request"),
PSQLState.COMMUNICATION_ERROR);
@@ -875,21 +947,21 @@ public class QueryExecutorImpl extends QueryExecutorBase {
* @return number of rows updated for server versions 8.2 or newer
* @throws SQLException on failure
*/
- public synchronized long endCopy(CopyInImpl op) throws SQLException {
+ public synchronized long endCopy(CopyOperationImpl op) throws SQLException {
if (!hasLock(op)) {
throw new PSQLException(GT.tr("Tried to end inactive copy"), PSQLState.OBJECT_NOT_IN_STATE);
}
try {
- if (logger.logDebug()) {
- logger.debug(" FE=> CopyDone");
- }
+ LOGGER.log(Level.FINEST, " FE=> CopyDone");
pgStream.sendChar('c'); // CopyDone
pgStream.sendInteger4(4);
pgStream.flush();
- processCopyResults(op, true);
+ do {
+ processCopyResults(op, true);
+ } while (hasLock(op));
return op.getHandledRowCount();
} catch (IOException ioe) {
throw new PSQLException(GT.tr("Database connection failed when ending copy"),
@@ -907,16 +979,14 @@ public class QueryExecutorImpl extends QueryExecutorBase {
* @param siz number of bytes to send (usually data.length)
* @throws SQLException on failure
*/
- public synchronized void writeToCopy(CopyInImpl op, byte[] data, int off, int siz)
+ public synchronized void writeToCopy(CopyOperationImpl op, byte[] data, int off, int siz)
throws SQLException {
if (!hasLock(op)) {
throw new PSQLException(GT.tr("Tried to write to an inactive copy operation"),
PSQLState.OBJECT_NOT_IN_STATE);
}
- if (logger.logDebug()) {
- logger.debug(" FE=> CopyData(" + siz + ")");
- }
+ LOGGER.log(Level.FINEST, " FE=> CopyData({0})", siz);
try {
pgStream.sendChar('d');
@@ -930,7 +1000,7 @@ public class QueryExecutorImpl extends QueryExecutorBase {
}
}
- public synchronized void flushCopy(CopyInImpl op) throws SQLException {
+ public synchronized void flushCopy(CopyOperationImpl op) throws SQLException {
if (!hasLock(op)) {
throw new PSQLException(GT.tr("Tried to write to an inactive copy operation"),
PSQLState.OBJECT_NOT_IN_STATE);
@@ -946,20 +1016,21 @@ public class QueryExecutorImpl extends QueryExecutorBase {
}
/**
- * Blocks to wait for a row of data to be received from server on an active copy operation
+ * Wait for a row of data to be received from server on an active copy operation
* Connection gets unlocked by processCopyResults() at end of operation
*
* @param op the copy operation presumably currently holding lock on this connection
+ * @param block whether to block waiting for input
* @throws SQLException on any failure
*/
- synchronized void readFromCopy(CopyOutImpl op) throws SQLException {
+ synchronized void readFromCopy(CopyOperationImpl op, boolean block) throws SQLException {
if (!hasLock(op)) {
throw new PSQLException(GT.tr("Tried to read from inactive copy"),
PSQLState.OBJECT_NOT_IN_STATE);
}
try {
- processCopyResults(op, true); // expect a call to handleCopydata() to store the data
+ processCopyResults(op, block); // expect a call to handleCopydata() to store the data
} catch (IOException ioe) {
throw new PSQLException(GT.tr("Database connection failed when reading from copy"),
PSQLState.CONNECTION_FAILURE, ioe);
@@ -998,9 +1069,7 @@ public class QueryExecutorImpl extends QueryExecutorBase {
int c = pgStream.peekChar();
if (c == 'C') {
// CommandComplete
- if (logger.logDebug()) {
- logger.debug(" <=BE CommandStatus, Ignored until CopyDone");
- }
+ LOGGER.log(Level.FINEST, " <=BE CommandStatus, Ignored until CopyDone");
break;
}
}
@@ -1010,18 +1079,14 @@ public class QueryExecutorImpl extends QueryExecutorBase {
case 'A': // Asynchronous Notify
- if (logger.logDebug()) {
- logger.debug(" <=BE Asynchronous Notification while copying");
- }
+ LOGGER.log(Level.FINEST, " <=BE Asynchronous Notification while copying");
receiveAsyncNotify();
break;
case 'N': // Notice Response
- if (logger.logDebug()) {
- logger.debug(" <=BE Notification while copying");
- }
+ LOGGER.log(Level.FINEST, " <=BE Notification while copying");
addWarning(receiveNoticeResponse());
break;
@@ -1055,9 +1120,7 @@ public class QueryExecutorImpl extends QueryExecutorBase {
case 'G': // CopyInResponse
- if (logger.logDebug()) {
- logger.debug(" <=BE CopyInResponse");
- }
+ LOGGER.log(Level.FINEST, " <=BE CopyInResponse");
if (op != null) {
error = new PSQLException(GT.tr("Got CopyInResponse from server during an active {0}",
@@ -1071,9 +1134,7 @@ public class QueryExecutorImpl extends QueryExecutorBase {
case 'H': // CopyOutResponse
- if (logger.logDebug()) {
- logger.debug(" <=BE CopyOutResponse");
- }
+ LOGGER.log(Level.FINEST, " <=BE CopyOutResponse");
if (op != null) {
error = new PSQLException(GT.tr("Got CopyOutResponse from server during an active {0}",
@@ -1085,39 +1146,49 @@ public class QueryExecutorImpl extends QueryExecutorBase {
endReceiving = true;
break;
- case 'd': // CopyData
+ case 'W': // CopyBothResponse
- if (logger.logDebug()) {
- logger.debug(" <=BE CopyData");
+ LOGGER.log(Level.FINEST, " <=BE CopyBothResponse");
+
+ if (op != null) {
+ error = new PSQLException(GT.tr("Got CopyBothResponse from server during an active {0}",
+ op.getClass().getName()), PSQLState.OBJECT_NOT_IN_STATE);
}
+ op = new CopyDualImpl();
+ initCopy(op);
+ endReceiving = true;
+ break;
+
+ case 'd': // CopyData
+
+ LOGGER.log(Level.FINEST, " <=BE CopyData");
+
len = pgStream.receiveInteger4() - 4;
byte[] buf = pgStream.receive(len);
if (op == null) {
error = new PSQLException(GT.tr("Got CopyData without an active copy operation"),
PSQLState.OBJECT_NOT_IN_STATE);
- } else if (!(op instanceof CopyOutImpl)) {
+ } else if (!(op instanceof CopyOut)) {
error = new PSQLException(
GT.tr("Unexpected copydata from server for {0}", op.getClass().getName()),
PSQLState.COMMUNICATION_ERROR);
} else {
- ((CopyOutImpl) op).handleCopydata(buf);
+ op.handleCopydata(buf);
}
endReceiving = true;
break;
case 'c': // CopyDone (expected after all copydata received)
- if (logger.logDebug()) {
- logger.debug(" <=BE CopyDone");
- }
+ LOGGER.log(Level.FINEST, " <=BE CopyDone");
len = pgStream.receiveInteger4() - 4;
if (len > 0) {
pgStream.receive(len); // not in specification; should never appear
}
- if (!(op instanceof CopyOutImpl)) {
+ if (!(op instanceof CopyOut)) {
error = new PSQLException("Got CopyDone while not copying from server",
PSQLState.OBJECT_NOT_IN_STATE);
}
@@ -1126,47 +1197,13 @@ public class QueryExecutorImpl extends QueryExecutorBase {
block = true;
break;
case 'S': // Parameter Status
- {
- int l_len = pgStream.receiveInteger4();
- String name = pgStream.receiveString();
- String value = pgStream.receiveString();
- if (logger.logDebug()) {
- logger.debug(" <=BE ParameterStatus(" + name + " = " + value + ")");
- }
-
- if (name.equals("client_encoding") && !value.equalsIgnoreCase("UTF8")
- && !allowEncodingChanges) {
- close(); // we're screwed now; we can't trust any subsequent string.
- error = new PSQLException(GT.tr(
- "The server''s client_encoding parameter was changed to {0}. The JDBC driver requires client_encoding to be UTF8 for correct operation.",
- value), PSQLState.CONNECTION_FAILURE);
- endReceiving = true;
- }
-
- if (name.equals("DateStyle") && !value.startsWith("ISO,")) {
- close(); // we're screwed now; we can't trust any subsequent date.
- error = new PSQLException(GT.tr(
- "The server''s DateStyle parameter was changed to {0}. The JDBC driver requires DateStyle to begin with ISO for correct operation.",
- value), PSQLState.CONNECTION_FAILURE);
+ try {
+ receiveParameterStatus();
+ } catch (SQLException e) {
+ error = e;
endReceiving = true;
}
-
- if (name.equals("standard_conforming_strings")) {
- if (value.equals("on")) {
- setStandardConformingStrings(true);
- } else if (value.equals("off")) {
- setStandardConformingStrings(false);
- } else {
- close();
- // we're screwed now; we don't know how to escape string literals
- error = new PSQLException(GT.tr(
- "The server''s standard_conforming_strings parameter was reported as {0}. The JDBC driver expected on or off.",
- value), PSQLState.CONNECTION_FAILURE);
- endReceiving = true;
- }
- }
break;
- }
case 'Z': // ReadyForQuery: After FE:CopyDone => BE:CommandComplete
@@ -1181,18 +1218,13 @@ public class QueryExecutorImpl extends QueryExecutorBase {
// If the user sends a non-copy query, we've got to handle some additional things.
//
case 'T': // Row Description (response to Describe)
- if (logger.logDebug()) {
- logger.debug(" <=BE RowDescription (during copy ignored)");
- }
-
+ LOGGER.log(Level.FINEST, " <=BE RowDescription (during copy ignored)");
skipMessage();
break;
case 'D': // DataRow
- if (logger.logDebug()) {
- logger.debug(" <=BE DataRow (during copy ignored)");
- }
+ LOGGER.log(Level.FINEST, " <=BE DataRow (during copy ignored)");
skipMessage();
break;
@@ -1246,7 +1278,7 @@ public class QueryExecutorImpl extends QueryExecutorBase {
if (maxResultRowSize >= 0) {
estimatedReceiveBufferBytes += maxResultRowSize;
} else {
- logger.debug("Couldn't estimate result size or result size unbounded, "
+ LOGGER.log(Level.FINEST, "Couldn't estimate result size or result size unbounded, "
+ "disabling batching for this query.");
disallowBatching = true;
}
@@ -1260,7 +1292,7 @@ public class QueryExecutorImpl extends QueryExecutorBase {
}
if (disallowBatching || estimatedReceiveBufferBytes >= MAX_BUFFERED_RECV_BYTES) {
- logger.debug("Forcing Sync, receive buffer full or batching disallowed");
+ LOGGER.log(Level.FINEST, "Forcing Sync, receive buffer full or batching disallowed");
sendSync();
processResults(resultHandler, flags);
estimatedReceiveBufferBytes = 0;
@@ -1324,13 +1356,12 @@ public class QueryExecutorImpl extends QueryExecutorBase {
//
private void sendSync() throws IOException {
- if (logger.logDebug()) {
- logger.debug(" FE=> Sync");
- }
+ LOGGER.log(Level.FINEST, " FE=> Sync");
pgStream.sendChar('S'); // Sync
pgStream.sendInteger4(4); // Length
pgStream.flush();
+ // Below "add queues" are likely not required at all
pendingExecuteQueue.add(new ExecuteRequest(sync, null, true));
pendingDescribePortalQueue.add(sync);
}
@@ -1362,14 +1393,14 @@ public class QueryExecutorImpl extends QueryExecutorBase {
// the SimpleParameterList's internal array that might be modified
// under us.
query.setStatementName(statementName, deallocateEpoch);
- query.setStatementTypes(typeOIDs.clone());
+ query.setPrepareTypes(typeOIDs);
registerParsedQuery(query, statementName);
}
byte[] encodedStatementName = query.getEncodedStatementName();
String nativeSql = query.getNativeSql();
- if (logger.logDebug()) {
+ if (LOGGER.isLoggable(Level.FINEST)) {
StringBuilder sbuf = new StringBuilder(" FE=> Parse(stmt=" + statementName + ",query=\"");
sbuf.append(nativeSql);
sbuf.append("\",oids={");
@@ -1380,7 +1411,7 @@ public class QueryExecutorImpl extends QueryExecutorBase {
sbuf.append(params.getTypeOID(i));
}
sbuf.append("})");
- logger.debug(sbuf.toString());
+ LOGGER.log(Level.FINEST, sbuf.toString());
}
//
@@ -1424,16 +1455,15 @@ public class QueryExecutorImpl extends QueryExecutorBase {
byte[] encodedStatementName = query.getEncodedStatementName();
byte[] encodedPortalName = (portal == null ? null : portal.getEncodedPortalName());
- if (logger.logDebug()) {
- StringBuilder sbuf =
- new StringBuilder(" FE=> Bind(stmt=" + statementName + ",portal=" + portal);
+ if (LOGGER.isLoggable(Level.FINEST)) {
+ StringBuilder sbuf = new StringBuilder(" FE=> Bind(stmt=" + statementName + ",portal=" + portal);
for (int i = 1; i <= params.getParameterCount(); ++i) {
sbuf.append(",$").append(i).append("=<")
.append(params.toString(i,true))
- .append(">");
+ .append(">,type=").append(Oid.toString(params.getTypeOID(i)));
}
sbuf.append(")");
- logger.debug(sbuf.toString());
+ LOGGER.log(Level.FINEST, sbuf.toString());
}
// Total size = 4 (size field) + N + 1 (destination portal)
@@ -1459,6 +1489,17 @@ public class QueryExecutorImpl extends QueryExecutorBase {
}
}
}
+ // If text-only results are required (e.g. updateable resultset), and the query has binary columns,
+ // flip to text format.
+ if (noBinaryTransfer && query.hasBinaryFields()) {
+ for (Field field : fields) {
+ if (field.getFormat() != Field.TEXT_FORMAT) {
+ field.setFormat(Field.TEXT_FORMAT);
+ }
+ }
+ query.resetNeedUpdateFieldFormats();
+ query.setHasBinaryFields(false);
+ }
// This is not the number of binary fields, but the total number
// of fields if any of them are binary or zero if all of them
@@ -1474,7 +1515,7 @@ public class QueryExecutorImpl extends QueryExecutorBase {
// backend's MaxAllocSize is the largest message that can
// be received from a client. If we have a bigger value
- // from either very large parameters or incorrent length
+ // from either very large parameters or incorrect length
// descriptions of setXXXStream we do not send the bind
// messsage.
//
@@ -1553,9 +1594,7 @@ public class QueryExecutorImpl extends QueryExecutorBase {
// Send Describe.
//
- if (logger.logDebug()) {
- logger.debug(" FE=> Describe(portal=" + portal + ")");
- }
+ LOGGER.log(Level.FINEST, " FE=> Describe(portal={0})", portal);
byte[] encodedPortalName = (portal == null ? null : portal.getEncodedPortalName());
@@ -1578,9 +1617,7 @@ public class QueryExecutorImpl extends QueryExecutorBase {
boolean describeOnly) throws IOException {
// Send Statement Describe
- if (logger.logDebug()) {
- logger.debug(" FE=> Describe(statement=" + query.getStatementName() + ")");
- }
+ LOGGER.log(Level.FINEST, " FE=> Describe(statement={0})", query.getStatementName());
byte[] encodedStatementName = query.getEncodedStatementName();
@@ -1608,9 +1645,8 @@ public class QueryExecutorImpl extends QueryExecutorBase {
//
// Send Execute.
//
-
- if (logger.logDebug()) {
- logger.debug(" FE=> Execute(portal=" + portal + ",limit=" + limit + ")");
+ if (LOGGER.isLoggable(Level.FINEST)) {
+ LOGGER.log(Level.FINEST, " FE=> Execute(portal={0},limit={1})", new Object[]{portal, limit});
}
byte[] encodedPortalName = (portal == null ? null : portal.getEncodedPortalName());
@@ -1633,9 +1669,7 @@ public class QueryExecutorImpl extends QueryExecutorBase {
// Send Close.
//
- if (logger.logDebug()) {
- logger.debug(" FE=> ClosePortal(" + portalName + ")");
- }
+ LOGGER.log(Level.FINEST, " FE=> ClosePortal({0})", portalName);
byte[] encodedPortalName = (portalName == null ? null : Utils.encodeUTF8(portalName));
int encodedSize = (encodedPortalName == null ? 0 : encodedPortalName.length);
@@ -1655,9 +1689,7 @@ public class QueryExecutorImpl extends QueryExecutorBase {
// Send Close.
//
- if (logger.logDebug()) {
- logger.debug(" FE=> CloseStatement(" + statementName + ")");
- }
+ LOGGER.log(Level.FINEST, " FE=> CloseStatement({0})", statementName);
byte[] encodedStatementName = Utils.encodeUTF8(statementName);
@@ -1699,16 +1731,17 @@ public class QueryExecutorImpl extends QueryExecutorBase {
: "Queries that might contain ; must be executed with QueryExecutor.QUERY_EXECUTE_AS_SIMPLE mode. "
+ "Given query is " + query.getNativeSql();
- // nb: if we decide to use a portal (usePortal == true) we must also use a named statement
- // (oneShot == false) as otherwise the portal will be closed under us unexpectedly when
- // the unnamed statement is next reused.
+ // As per "46.2. Message Flow" documentation (quote from 9.1):
+ // If successfully created, a named portal object lasts till the end of the current transaction, unless explicitly destroyed
+ //
+ // That is named portals do not require to use named statements.
boolean noResults = (flags & QueryExecutor.QUERY_NO_RESULTS) != 0;
boolean noMeta = (flags & QueryExecutor.QUERY_NO_METADATA) != 0;
boolean describeOnly = (flags & QueryExecutor.QUERY_DESCRIBE_ONLY) != 0;
boolean usePortal = (flags & QueryExecutor.QUERY_FORWARD_CURSOR) != 0 && !noResults && !noMeta
&& fetchSize > 0 && !describeOnly;
- boolean oneShot = (flags & QueryExecutor.QUERY_ONESHOT) != 0 && !usePortal;
+ boolean oneShot = (flags & QueryExecutor.QUERY_ONESHOT) != 0;
boolean noBinaryTransfer = (flags & QUERY_NO_BINARY_TRANSFER) != 0;
boolean forceDescribePortal = (flags & QUERY_FORCE_DESCRIBE_PORTAL) != 0;
@@ -1738,8 +1771,8 @@ public class QueryExecutorImpl extends QueryExecutorBase {
|| (!oneShot && paramsHasUnknown && queryHasUnknown && !query.isStatementDescribed());
if (!describeStatement && paramsHasUnknown && !queryHasUnknown) {
- int queryOIDs[] = query.getStatementTypes();
- int paramOIDs[] = params.getTypeOIDs();
+ int[] queryOIDs = query.getPrepareTypes();
+ int[] paramOIDs = params.getTypeOIDs();
for (int i = 0; i < paramOIDs.length; i++) {
// Only supply type information when there isn't any
// already, don't arbitrarily overwrite user supplied
@@ -1796,9 +1829,7 @@ public class QueryExecutorImpl extends QueryExecutorBase {
private void sendSimpleQuery(SimpleQuery query, SimpleParameterList params) throws IOException {
String nativeSql = query.toString(params);
- if (logger.logDebug()) {
- logger.debug(" FE=> SimpleQuery(query=\"" + nativeSql + "\")");
- }
+ LOGGER.log(Level.FINEST, " FE=> SimpleQuery(query=\"{0}\")", nativeSql);
Encoding encoding = pgStream.getEncoding();
byte[] encoded = encoding.encode(nativeSql);
@@ -1925,20 +1956,16 @@ public class QueryExecutorImpl extends QueryExecutorBase {
SimpleQuery parsedQuery = pendingParseQueue.removeFirst();
String parsedStatementName = parsedQuery.getStatementName();
- if (logger.logDebug()) {
- logger.debug(" <=BE ParseComplete [" + parsedStatementName + "]");
- }
+ LOGGER.log(Level.FINEST, " <=BE ParseComplete [{0}]", parsedStatementName);
break;
- case 't': // ParameterDescription
+ case 't': { // ParameterDescription
pgStream.receiveInteger4(); // len, discarded
- if (logger.logDebug()) {
- logger.debug(" <=BE ParameterDescription");
- }
+ LOGGER.log(Level.FINEST, " <=BE ParameterDescription");
+
- {
DescribeRequest describeData = pendingDescribeStatementQueue.getFirst();
SimpleQuery query = describeData.query;
SimpleParameterList params = describeData.parameterList;
@@ -1961,7 +1988,7 @@ public class QueryExecutorImpl extends QueryExecutorBase {
if ((origStatementName == null && query.getStatementName() == null)
|| (origStatementName != null
&& origStatementName.equals(query.getStatementName()))) {
- query.setStatementTypes(params.getTypeOIDs().clone());
+ query.setPrepareTypes(params.getTypeOIDs());
}
if (describeOnly) {
@@ -1976,25 +2003,19 @@ public class QueryExecutorImpl extends QueryExecutorBase {
pgStream.receiveInteger4(); // len, discarded
Portal boundPortal = pendingBindQueue.removeFirst();
- if (logger.logDebug()) {
- logger.debug(" <=BE BindComplete [" + boundPortal + "]");
- }
+ LOGGER.log(Level.FINEST, " <=BE BindComplete [{0}]", boundPortal);
registerOpenPortal(boundPortal);
break;
case '3': // Close Complete (response to Close)
pgStream.receiveInteger4(); // len, discarded
- if (logger.logDebug()) {
- logger.debug(" <=BE CloseComplete");
- }
+ LOGGER.log(Level.FINEST, " <=BE CloseComplete");
break;
case 'n': // No Data (response to Describe)
pgStream.receiveInteger4(); // len, discarded
- if (logger.logDebug()) {
- logger.debug(" <=BE NoData");
- }
+ LOGGER.log(Level.FINEST, " <=BE NoData");
pendingDescribePortalQueue.removeFirst();
@@ -2012,23 +2033,23 @@ public class QueryExecutorImpl extends QueryExecutorBase {
}
break;
- case 's': // Portal Suspended (end of Execute)
+ case 's': { // Portal Suspended (end of Execute)
// nb: this appears *instead* of CommandStatus.
// Must be a SELECT if we suspended, so don't worry about it.
pgStream.receiveInteger4(); // len, discarded
- if (logger.logDebug()) {
- logger.debug(" <=BE PortalSuspended");
- }
+ LOGGER.log(Level.FINEST, " <=BE PortalSuspended");
+
- {
ExecuteRequest executeData = pendingExecuteQueue.removeFirst();
SimpleQuery currentQuery = executeData.query;
Portal currentPortal = executeData.portal;
Field[] fields = currentQuery.getFields();
- if (fields != null && !noResults && tuples == null) {
- tuples = new ArrayList<byte[][]>();
+ if (fields != null && tuples == null) {
+ // When no results expected, pretend an empty resultset was returned
+ // Not sure if new ArrayList can be always replaced with emptyList
+ tuples = noResults ? Collections.<byte[][]>emptyList() : new ArrayList<byte[][]>();
}
handler.handleResultRows(currentQuery, fields, tuples, currentPortal);
@@ -2036,7 +2057,7 @@ public class QueryExecutorImpl extends QueryExecutorBase {
break;
}
- case 'C': // Command Status (end of Execute)
+ case 'C': { // Command Status (end of Execute)
// Handle status.
String status = receiveCommandStatus();
if (isFlushCacheOnDeallocate()
@@ -2046,7 +2067,7 @@ public class QueryExecutorImpl extends QueryExecutorBase {
doneAfterRowDescNoData = false;
- {
+
ExecuteRequest executeData = pendingExecuteQueue.peekFirst();
SimpleQuery currentQuery = executeData.query;
Portal currentPortal = executeData.portal;
@@ -2075,8 +2096,10 @@ public class QueryExecutorImpl extends QueryExecutorBase {
}
Field[] fields = currentQuery.getFields();
- if (fields != null && !noResults && tuples == null) {
- tuples = new ArrayList<byte[][]>();
+ if (fields != null && tuples == null) {
+ // When no results expected, pretend an empty resultset was returned
+ // Not sure if new ArrayList can be always replaced with emptyList
+ tuples = noResults ? Collections.<byte[][]>emptyList() : new ArrayList<byte[][]>();
}
// If we received tuples we must know the structure of the
@@ -2132,7 +2155,7 @@ public class QueryExecutorImpl extends QueryExecutorBase {
tuples.add(tuple);
}
- if (logger.logDebug()) {
+ if (LOGGER.isLoggable(Level.FINEST)) {
int length;
if (tuple == null) {
length = -1;
@@ -2145,7 +2168,7 @@ public class QueryExecutorImpl extends QueryExecutorBase {
length += aTuple.length;
}
}
- logger.debug(" <=BE DataRow(len=" + length + ")");
+ LOGGER.log(Level.FINEST, " <=BE DataRow(len={0})", length);
}
break;
@@ -2159,22 +2182,19 @@ public class QueryExecutorImpl extends QueryExecutorBase {
// Technically speaking, the error is unexpected, thus we invalidate other
// server-prepared statements just in case.
deallocateEpoch++;
- if (logger.logDebug()) {
- logger.debug(" FE: received " + error.getSQLState() + ", will invalidate statements. "
- + "deallocateEpoch is now " + deallocateEpoch);
+ if (LOGGER.isLoggable(Level.FINEST)) {
+ LOGGER.log(Level.FINEST, " FE: received {0}, will invalidate statements. deallocateEpoch is now {1}",
+ new Object[]{error.getSQLState(), deallocateEpoch});
}
}
// keep processing
break;
- case 'I': // Empty Query (end of Execute)
+ case 'I': { // Empty Query (end of Execute)
pgStream.receiveInteger4();
- if (logger.logDebug()) {
- logger.debug(" <=BE EmptyQuery");
- }
+ LOGGER.log(Level.FINEST, " <=BE EmptyQuery");
- {
ExecuteRequest executeData = pendingExecuteQueue.removeFirst();
Portal currentPortal = executeData.portal;
handler.handleCommandStatus("EMPTY", 0, 0);
@@ -2190,54 +2210,13 @@ public class QueryExecutorImpl extends QueryExecutorBase {
break;
case 'S': // Parameter Status
- {
- int l_len = pgStream.receiveInteger4();
- String name = pgStream.receiveString();
- String value = pgStream.receiveString();
- if (logger.logDebug()) {
- logger.debug(" <=BE ParameterStatus(" + name + " = " + value + ")");
- }
-
- if (name.equals("client_encoding") && !value.equalsIgnoreCase("UTF8")
- && !allowEncodingChanges) {
- close(); // we're screwed now; we can't trust any subsequent string.
- handler.handleError(new PSQLException(GT.tr(
- "The server''s client_encoding parameter was changed to {0}. The JDBC driver requires client_encoding to be UTF8 for correct operation.",
- value), PSQLState.CONNECTION_FAILURE));
- endQuery = true;
- }
-
- if (name.equals("DateStyle") && !value.startsWith("ISO,")) {
- close(); // we're screwed now; we can't trust any subsequent date.
- handler.handleError(new PSQLException(GT.tr(
- "The server''s DateStyle parameter was changed to {0}. The JDBC driver requires DateStyle to begin with ISO for correct operation.",
- value), PSQLState.CONNECTION_FAILURE));
+ try {
+ receiveParameterStatus();
+ } catch (SQLException e) {
+ handler.handleError(e);
endQuery = true;
}
-
- if (name.equals("standard_conforming_strings")) {
- if (value.equals("on")) {
- setStandardConformingStrings(true);
- } else if (value.equals("off")) {
- setStandardConformingStrings(false);
- } else {
- close();
- // we're screwed now; we don't know how to escape string literals
- handler.handleError(new PSQLException(GT.tr(
- "The server''s standard_conforming_strings parameter was reported as {0}. The JDBC driver expected on or off.",
- value), PSQLState.CONNECTION_FAILURE));
- endQuery = true;
- }
- }
-
- if ("TimeZone".equals(name)) {
- setTimeZone(TimestampUtils.parseBackendTimeZone(value));
- }
- if ("application_name".equals(name)) {
- setApplicationName(value);
- }
break;
- }
case 'T': // Row Description (response to Describe)
Field[] fields = receiveFields();
@@ -2288,17 +2267,26 @@ public class QueryExecutorImpl extends QueryExecutorBase {
}
pendingParseQueue.clear(); // No more ParseComplete messages expected.
- pendingDescribeStatementQueue.clear(); // No more ParameterDescription messages expected.
- pendingDescribePortalQueue.clear(); // No more RowDescription messages expected.
+ // Pending "describe" requests might be there in case of error
+ // If that is the case, reset "described" status, so the statement is properly
+ // described on next execution
+ while (!pendingDescribeStatementQueue.isEmpty()) {
+ DescribeRequest request = pendingDescribeStatementQueue.removeFirst();
+ LOGGER.log(Level.FINEST, " FE marking setStatementDescribed(false) for query {0}", request.query);
+ request.query.setStatementDescribed(false);
+ }
+ while (!pendingDescribePortalQueue.isEmpty()) {
+ SimpleQuery describePortalQuery = pendingDescribePortalQueue.removeFirst();
+ LOGGER.log(Level.FINEST, " FE marking setPortalDescribed(false) for query {0}", describePortalQuery);
+ describePortalQuery.setPortalDescribed(false);
+ }
pendingBindQueue.clear(); // No more BindComplete messages expected.
pendingExecuteQueue.clear(); // No more query executions expected.
break;
case 'G': // CopyInResponse
- if (logger.logDebug()) {
- logger.debug(" <=BE CopyInResponse");
- logger.debug(" FE=> CopyFail");
- }
+ LOGGER.log(Level.FINEST, " <=BE CopyInResponse");
+ LOGGER.log(Level.FINEST, " FE=> CopyFail");
// COPY sub-protocol is not implemented yet
// We'll send a CopyFail message for COPY FROM STDIN so that
@@ -2316,9 +2304,7 @@ public class QueryExecutorImpl extends QueryExecutorBase {
break;
case 'H': // CopyOutResponse
- if (logger.logDebug()) {
- logger.debug(" <=BE CopyOutResponse");
- }
+ LOGGER.log(Level.FINEST, " <=BE CopyOutResponse");
skipMessage();
// In case of CopyOutResponse, we cannot abort data transfer,
@@ -2330,16 +2316,12 @@ public class QueryExecutorImpl extends QueryExecutorBase {
case 'c': // CopyDone
skipMessage();
- if (logger.logDebug()) {
- logger.debug(" <=BE CopyDone");
- }
+ LOGGER.log(Level.FINEST, " <=BE CopyDone");
break;
case 'd': // CopyData
skipMessage();
- if (logger.logDebug()) {
- logger.debug(" <=BE CopyData");
- }
+ LOGGER.log(Level.FINEST, " <=BE CopyData");
break;
default:
@@ -2402,9 +2384,7 @@ public class QueryExecutorImpl extends QueryExecutorBase {
int size = pgStream.receiveInteger2();
Field[] fields = new Field[size];
- if (logger.logDebug()) {
- logger.debug(" <=BE RowDescription(" + size + ")");
- }
+ LOGGER.log(Level.FINEST, " <=BE RowDescription({0})", size);
for (int i = 0; i < fields.length; i++) {
String columnLabel = pgStream.receiveString();
@@ -2418,9 +2398,7 @@ public class QueryExecutorImpl extends QueryExecutorBase {
typeOid, typeLength, typeModifier, tableOid, positionInTable);
fields[i].setFormat(formatType);
- if (logger.logDebug()) {
- logger.debug(" " + fields[i]);
- }
+ LOGGER.log(Level.FINEST, " {0}", fields[i]);
}
return fields;
@@ -2433,8 +2411,8 @@ public class QueryExecutorImpl extends QueryExecutorBase {
String param = pgStream.receiveString();
addNotification(new org.postgresql.core.Notification(msg, pid, param));
- if (logger.logDebug()) {
- logger.debug(" <=BE AsyncNotify(" + pid + "," + msg + "," + param + ")");
+ if (LOGGER.isLoggable(Level.FINEST)) {
+ LOGGER.log(Level.FINEST, " <=BE AsyncNotify({0},{1},{2})", new Object[]{pid, msg, param});
}
}
@@ -2446,10 +2424,10 @@ public class QueryExecutorImpl extends QueryExecutorBase {
int elen = pgStream.receiveInteger4();
EncodingPredictor.DecodeResult totalMessage = pgStream.receiveErrorString(elen - 4);
- ServerErrorMessage errorMsg = new ServerErrorMessage(totalMessage, logger.getLogLevel());
+ ServerErrorMessage errorMsg = new ServerErrorMessage(totalMessage);
- if (logger.logDebug()) {
- logger.debug(" <=BE ErrorMessage(" + errorMsg.toString() + ")");
+ if (LOGGER.isLoggable(Level.FINEST)) {
+ LOGGER.log(Level.FINEST, " <=BE ErrorMessage({0})", errorMsg.toString());
}
PSQLException error = new PSQLException(errorMsg);
@@ -2463,11 +2441,10 @@ public class QueryExecutorImpl extends QueryExecutorBase {
private SQLWarning receiveNoticeResponse() throws IOException {
int nlen = pgStream.receiveInteger4();
- ServerErrorMessage warnMsg =
- new ServerErrorMessage(pgStream.receiveString(nlen - 4), logger.getLogLevel());
+ ServerErrorMessage warnMsg = new ServerErrorMessage(pgStream.receiveString(nlen - 4));
- if (logger.logDebug()) {
- logger.debug(" <=BE NoticeResponse(" + warnMsg.toString() + ")");
+ if (LOGGER.isLoggable(Level.FINEST)) {
+ LOGGER.log(Level.FINEST, " <=BE NoticeResponse({0})", warnMsg.toString());
}
return new PSQLWarning(warnMsg);
@@ -2481,42 +2458,47 @@ public class QueryExecutorImpl extends QueryExecutorBase {
// now read and discard the trailing \0
pgStream.receiveChar(); // Receive(1) would allocate new byte[1], so avoid it
- if (logger.logDebug()) {
- logger.debug(" <=BE CommandStatus(" + status + ")");
- }
+ LOGGER.log(Level.FINEST, " <=BE CommandStatus({0})", status);
return status;
}
private void interpretCommandStatus(String status, ResultHandler handler) {
- int update_count = 0;
- long insert_oid = 0;
-
- if (status.startsWith("INSERT") || status.startsWith("UPDATE") || status.startsWith("DELETE")
- || status.startsWith("MOVE")) {
+ long oid = 0;
+ long count = 0;
+ Matcher matcher = COMMAND_COMPLETE_PATTERN.matcher(status);
+ if (matcher.matches()) {
+ // String command = matcher.group(1);
+ String group2 = matcher.group(2);
+ String group3 = matcher.group(3);
try {
- long updates = Long.parseLong(status.substring(1 + status.lastIndexOf(' ')));
-
- // deal with situations where the update modifies more than 2^32 rows
- if (updates > Integer.MAX_VALUE) {
- update_count = Statement.SUCCESS_NO_INFO;
- } else {
- update_count = (int) updates;
+ if (group3 != null) {
+ // COMMAND OID ROWS
+ oid = Long.parseLong(group2);
+ count = Long.parseLong(group3);
+ } else if (group2 != null) {
+ // COMMAND ROWS
+ count = Long.parseLong(group2);
}
-
- if (status.startsWith("INSERT")) {
- insert_oid =
- Long.parseLong(status.substring(1 + status.indexOf(' '), status.lastIndexOf(' ')));
- }
- } catch (NumberFormatException nfe) {
+ } catch (NumberFormatException e) {
+ // As we're performing a regex validation prior to parsing, this should only
+ // occurr if the oid or count are out of range.
handler.handleError(new PSQLException(
- GT.tr("Unable to interpret the update count in command completion tag: {0}.", status),
+ GT.tr("Unable to parse the count in command completion tag: {0}.", status),
PSQLState.CONNECTION_FAILURE));
return;
}
}
-
- handler.handleCommandStatus(status, update_count, insert_oid);
+ int countAsInt = 0;
+ if (count > Integer.MAX_VALUE) {
+ // If command status indicates that we've modified more than Integer.MAX_VALUE rows
+ // then we set the result count to reflect that we cannot provide the actual number
+ // due to the JDBC field being an int rather than a long.
+ countAsInt = Statement.SUCCESS_NO_INFO;
+ } else if (count > 0) {
+ countAsInt = (int) count;
+ }
+ handler.handleCommandStatus(status, countAsInt, oid);
}
private void receiveRFQ() throws IOException {
@@ -2525,9 +2507,7 @@ public class QueryExecutorImpl extends QueryExecutorBase {
}
char tStatus = (char) pgStream.receiveChar();
- if (logger.logDebug()) {
- logger.debug(" <=BE ReadyForQuery(" + tStatus + ")");
- }
+ LOGGER.log(Level.FINEST, " <=BE ReadyForQuery({0})", tStatus);
// Update connection state.
switch (tStatus) {
@@ -2574,8 +2554,8 @@ public class QueryExecutorImpl extends QueryExecutorBase {
int pid = pgStream.receiveInteger4();
int ckey = pgStream.receiveInteger4();
- if (logger.logDebug()) {
- logger.debug(" <=BE BackendKeyData(pid=" + pid + ",ckey=" + ckey + ")");
+ if (LOGGER.isLoggable(Level.FINEST)) {
+ LOGGER.log(Level.FINEST, " <=BE BackendKeyData(pid={0},ckey={1})", new Object[]{pid, ckey});
}
setBackendKeyData(pid, ckey);
@@ -2592,50 +2572,12 @@ public class QueryExecutorImpl extends QueryExecutorBase {
case 'S':
// ParameterStatus
- int l_len = pgStream.receiveInteger4();
- String name = pgStream.receiveString();
- String value = pgStream.receiveString();
-
- if (logger.logDebug()) {
- logger.debug(" <=BE ParameterStatus(" + name + " = " + value + ")");
- }
-
- if ("server_version_num".equals(name)) {
- setServerVersionNum(Integer.parseInt(value));
- } else if ("server_version".equals(name)) {
- setServerVersion(value);
- } else if ("client_encoding".equals(name)) {
- if (!"UTF8".equals(value)) {
- throw new PSQLException(GT.tr("Protocol error. Session setup failed."),
- PSQLState.PROTOCOL_VIOLATION);
- }
- pgStream.setEncoding(Encoding.getDatabaseEncoding("UTF8"));
- } else if ("standard_conforming_strings".equals(name)) {
- if ("on".equals(value)) {
- setStandardConformingStrings(true);
- } else if ("off".equals(value)) {
- setStandardConformingStrings(false);
- } else {
- throw new PSQLException(GT.tr("Protocol error. Session setup failed."),
- PSQLState.PROTOCOL_VIOLATION);
- }
- } else if ("integer_datetimes".equals(name)) {
- if ("on".equals(value)) {
- setIntegerDateTimes(true);
- } else if ("off".equals(value)) {
- setIntegerDateTimes(false);
- } else {
- throw new PSQLException(GT.tr("Protocol error. Session setup failed."),
- PSQLState.PROTOCOL_VIOLATION);
- }
- }
+ receiveParameterStatus();
break;
default:
- if (logger.logDebug()) {
- logger.debug("invalid message type=" + (char) beresp);
- }
+ LOGGER.log(Level.FINEST, " invalid message type={0}", (char) beresp);
throw new PSQLException(GT.tr("Protocol error. Session setup failed."),
PSQLState.PROTOCOL_VIOLATION);
}
@@ -2644,7 +2586,75 @@ public class QueryExecutorImpl extends QueryExecutorBase {
PSQLState.PROTOCOL_VIOLATION);
}
+ public void receiveParameterStatus() throws IOException, SQLException {
+ // ParameterStatus
+ int l_len = pgStream.receiveInteger4();
+ String name = pgStream.receiveString();
+ String value = pgStream.receiveString();
+
+ if (LOGGER.isLoggable(Level.FINEST)) {
+ LOGGER.log(Level.FINEST, " <=BE ParameterStatus({0} = {1})", new Object[]{name, value});
+ }
+ if (name.equals("client_encoding")) {
+ if (allowEncodingChanges) {
+ if (!value.equalsIgnoreCase("UTF8") && !value.equalsIgnoreCase("UTF-8")) {
+ LOGGER.log(Level.WARNING,
+ "pgjdbc expects client_encoding to be UTF8 for proper operation. Actual encoding is {0}",
+ value);
+ }
+ pgStream.setEncoding(Encoding.getDatabaseEncoding(value));
+ } else if (!value.equalsIgnoreCase("UTF8") && !value.equalsIgnoreCase("UTF-8")) {
+ close(); // we're screwed now; we can't trust any subsequent string.
+ throw new PSQLException(GT.tr(
+ "The server''s client_encoding parameter was changed to {0}. The JDBC driver requires client_encoding to be UTF8 for correct operation.",
+ value), PSQLState.CONNECTION_FAILURE);
+
+ }
+ }
+
+ if (name.equals("DateStyle") && !value.startsWith("ISO")
+ && !value.toUpperCase().startsWith("ISO")) {
+ close(); // we're screwed now; we can't trust any subsequent date.
+ throw new PSQLException(GT.tr(
+ "The server''s DateStyle parameter was changed to {0}. The JDBC driver requires DateStyle to begin with ISO for correct operation.",
+ value), PSQLState.CONNECTION_FAILURE);
+ }
+
+ if (name.equals("standard_conforming_strings")) {
+ if (value.equals("on")) {
+ setStandardConformingStrings(true);
+ } else if (value.equals("off")) {
+ setStandardConformingStrings(false);
+ } else {
+ close();
+ // we're screwed now; we don't know how to escape string literals
+ throw new PSQLException(GT.tr(
+ "The server''s standard_conforming_strings parameter was reported as {0}. The JDBC driver expected on or off.",
+ value), PSQLState.CONNECTION_FAILURE);
+ }
+ return;
+ }
+
+ if ("TimeZone".equals(name)) {
+ setTimeZone(TimestampUtils.parseBackendTimeZone(value));
+ } else if ("application_name".equals(name)) {
+ setApplicationName(value);
+ } else if ("server_version_num".equals(name)) {
+ setServerVersionNum(Integer.parseInt(value));
+ } else if ("server_version".equals(name)) {
+ setServerVersion(value);
+ } else if ("integer_datetimes".equals(name)) {
+ if ("on".equals(value)) {
+ setIntegerDateTimes(true);
+ } else if ("off".equals(value)) {
+ setIntegerDateTimes(false);
+ } else {
+ throw new PSQLException(GT.tr("Protocol error. Session setup failed."),
+ PSQLState.PROTOCOL_VIOLATION);
+ }
+ }
+ }
public void setTimeZone(TimeZone timeZone) {
this.timeZone = timeZone;
@@ -2666,6 +2676,11 @@ public class QueryExecutorImpl extends QueryExecutorBase {
}
@Override
+ public ReplicationProtocol getReplicationProtocol() {
+ return replicationProtocol;
+ }
+
+ @Override
public boolean useBinaryForReceive(int oid) {
return useBinaryReceiveForOids.contains(oid);
}
diff --git a/pgjdbc/src/main/java/org/postgresql/core/v3/SimpleParameterList.java b/pgjdbc/src/main/java/org/postgresql/core/v3/SimpleParameterList.java
index 5f21706..1a1ddee 100644
--- a/pgjdbc/src/main/java/org/postgresql/core/v3/SimpleParameterList.java
+++ b/pgjdbc/src/main/java/org/postgresql/core/v3/SimpleParameterList.java
@@ -32,12 +32,12 @@ import java.util.Arrays;
*/
class SimpleParameterList implements V3ParameterList {
- private final static byte IN = 1;
- private final static byte OUT = 2;
- private final static byte INOUT = IN | OUT;
+ private static final byte IN = 1;
+ private static final byte OUT = 2;
+ private static final byte INOUT = IN | OUT;
- private final static byte TEXT = 0;
- private final static byte BINARY = 4;
+ private static final byte TEXT = 0;
+ private static final byte BINARY = 4;
SimpleParameterList(int paramCount, TypeTransferModeRegistry transferModeRegistry) {
this.paramValues = new Object[paramCount];
@@ -132,18 +132,27 @@ class SimpleParameterList implements V3ParameterList {
bind(index, value, oid, BINARY);
}
+ @Override
public void setBytea(int index, byte[] data, int offset, int length) throws SQLException {
bind(index, new StreamWrapper(data, offset, length), Oid.BYTEA, BINARY);
}
+ @Override
public void setBytea(int index, InputStream stream, int length) throws SQLException {
bind(index, new StreamWrapper(stream, length), Oid.BYTEA, BINARY);
}
+ @Override
public void setBytea(int index, InputStream stream) throws SQLException {
bind(index, new StreamWrapper(stream), Oid.BYTEA, BINARY);
}
+ @Override
+ public void setText(int index, InputStream stream) throws SQLException {
+ bind(index, new StreamWrapper(stream), Oid.TEXT, TEXT);
+ }
+
+ @Override
public void setNull(int index, int oid) throws SQLException {
byte binaryTransfer = TEXT;
@@ -154,6 +163,7 @@ class SimpleParameterList implements V3ParameterList {
bind(index, NULL_OBJECT, oid, binaryTransfer);
}
+ @Override
public String toString(int index, boolean standardConformingStrings) {
--index;
if (paramValues[index] == null) {
@@ -204,7 +214,7 @@ class SimpleParameterList implements V3ParameterList {
String param = paramValues[index].toString();
// add room for quotes + potential escaping.
- StringBuilder p = new StringBuilder(3 + param.length() * 11 / 10);
+ StringBuilder p = new StringBuilder(3 + (param.length() + 10) / 10 * 11);
// No E'..' here since escapeLiteral escapes all things and it does not use \123 kind of
// escape codes
@@ -240,6 +250,7 @@ class SimpleParameterList implements V3ParameterList {
}
}
+ @Override
public void checkAllParametersSet() throws SQLException {
for (int i = 0; i < paramTypes.length; ++i) {
if (direction(i) != OUT && paramValues[i] == null) {
@@ -249,6 +260,7 @@ class SimpleParameterList implements V3ParameterList {
}
}
+ @Override
public void convertFunctionOutParameters() {
for (int i = 0; i < paramTypes.length; ++i) {
if (direction(i) == OUT) {
@@ -455,7 +467,7 @@ class SimpleParameterList implements V3ParameterList {
* Marker object representing NULL; this distinguishes "parameter never set" from "parameter set
* to null".
*/
- private final static Object NULL_OBJECT = new Object();
+ private static final Object NULL_OBJECT = new Object();
private int pos = 0;
}
diff --git a/pgjdbc/src/main/java/org/postgresql/core/v3/SimpleQuery.java b/pgjdbc/src/main/java/org/postgresql/core/v3/SimpleQuery.java
index 6c30222..f35f3a1 100644
--- a/pgjdbc/src/main/java/org/postgresql/core/v3/SimpleQuery.java
+++ b/pgjdbc/src/main/java/org/postgresql/core/v3/SimpleQuery.java
@@ -16,7 +16,10 @@ import org.postgresql.core.Utils;
import org.postgresql.jdbc.PgResultSet;
import java.lang.ref.PhantomReference;
+import java.util.BitSet;
import java.util.Map;
+import java.util.logging.Level;
+import java.util.logging.Logger;
/**
* V3 Query implementation for a single-statement query. This also holds the state of any associated
@@ -26,6 +29,7 @@ import java.util.Map;
* @author Oliver Jowett (oliver at opencloud.com)
*/
class SimpleQuery implements Query {
+ private static final Logger LOGGER = Logger.getLogger(SimpleQuery.class.getName());
SimpleQuery(SimpleQuery src) {
this(src.nativeQuery, src.transferModeRegistry, src.sanitiserDisabled);
@@ -114,11 +118,29 @@ class SimpleQuery implements Query {
this.deallocateEpoch = deallocateEpoch;
}
- void setStatementTypes(int[] paramTypes) {
- this.preparedTypes = paramTypes;
+ void setPrepareTypes(int[] paramTypes) {
+ // Remember which parameters were unspecified since the parameters will be overriden later by
+ // ParameterDescription message
+ for (int i = 0; i < paramTypes.length; i++) {
+ int paramType = paramTypes[i];
+ if (paramType == Oid.UNSPECIFIED) {
+ if (this.unspecifiedParams == null) {
+ this.unspecifiedParams = new BitSet();
+ }
+ this.unspecifiedParams.set(i);
+ }
+ }
+
+ // paramTypes is changed by "describe statement" response, so we clone the array
+ // However, we can reuse array if there is one
+ if (this.preparedTypes == null) {
+ this.preparedTypes = paramTypes.clone();
+ return;
+ }
+ System.arraycopy(paramTypes, 0, this.preparedTypes, 0, paramTypes.length);
}
- int[] getStatementTypes() {
+ int[] getPrepareTypes() {
return preparedTypes;
}
@@ -127,19 +149,46 @@ class SimpleQuery implements Query {
}
boolean isPreparedFor(int[] paramTypes, short deallocateEpoch) {
- if (statementName == null) {
+ if (statementName == null || preparedTypes == null) {
return false; // Not prepared.
}
if (this.deallocateEpoch != deallocateEpoch) {
return false;
}
- assert preparedTypes == null || paramTypes.length == preparedTypes.length
+ assert paramTypes.length == preparedTypes.length
: String.format("paramTypes:%1$d preparedTypes:%2$d", paramTypes.length,
- paramTypes == null ? -1 : preparedTypes.length);
+ preparedTypes.length);
// Check for compatible types.
+ BitSet unspecified = this.unspecifiedParams;
for (int i = 0; i < paramTypes.length; ++i) {
- if (paramTypes[i] != Oid.UNSPECIFIED && paramTypes[i] != preparedTypes[i]) {
+ int paramType = paramTypes[i];
+ // Either paramType should match prepared type
+ // Or paramType==UNSPECIFIED and the prepare type was UNSPECIFIED
+
+ // Note: preparedTypes can be updated by "statement describe"
+ // 1) parse(name="S_01", sql="select ?::timestamp", types={UNSPECIFIED})
+ // 2) statement describe: bind 1 type is TIMESTAMP
+ // 3) SimpleQuery.preparedTypes is updated to TIMESTAMP
+ // ...
+ // 4.1) bind(name="S_01", ..., types={TIMESTAMP}) -> OK (since preparedTypes is equal to TIMESTAMP)
+ // 4.2) bind(name="S_01", ..., types={UNSPECIFIED}) -> OK (since the query was initially parsed with UNSPECIFIED)
+ // 4.3) bind(name="S_01", ..., types={DATE}) -> KO, unprepare and parse required
+
+ int preparedType = preparedTypes[i];
+ if (paramType != preparedType
+ && (paramType != Oid.UNSPECIFIED
+ || unspecified == null
+ || !unspecified.get(i))) {
+ if (LOGGER.isLoggable(Level.FINER)) {
+ LOGGER.log(Level.FINER,
+ "Statement {0} does not match new parameter types. Will have to un-prepare it and parse once again."
+ + " To avoid performance issues, use the same data type for the same bind position. Bind index (1-based) is {1},"
+ + " preparedType was {2} (after describe {3}), current bind type is {4}",
+ new Object[]{statementName, i + 1,
+ Oid.toString(unspecified != null && unspecified.get(i) ? 0 : preparedType),
+ Oid.toString(preparedType), Oid.toString(paramType)});
+ }
return false;
}
}
@@ -152,13 +201,7 @@ class SimpleQuery implements Query {
return true;
}
- for (int preparedType : preparedTypes) {
- if (preparedType == Oid.UNSPECIFIED) {
- return true;
- }
- }
-
- return false;
+ return this.unspecifiedParams != null && !this.unspecifiedParams.isEmpty();
}
byte[] getEncodedStatementName() {
@@ -204,6 +247,9 @@ class SimpleQuery implements Query {
return false;
}
+ public void resetNeedUpdateFieldFormats() {
+ needUpdateFieldFormats = fields != null;
+ }
public boolean hasBinaryFields() {
return hasBinaryFields;
@@ -252,6 +298,9 @@ class SimpleQuery implements Query {
cleanupRef.enqueue();
cleanupRef = null;
}
+ if (this.unspecifiedParams != null) {
+ this.unspecifiedParams.clear();
+ }
statementName = null;
encodedStatementName = null;
@@ -312,9 +361,10 @@ class SimpleQuery implements Query {
private final boolean sanitiserDisabled;
private PhantomReference<?> cleanupRef;
private int[] preparedTypes;
+ private BitSet unspecifiedParams;
private short deallocateEpoch;
private Integer cachedMaxResultRowSize;
- final static SimpleParameterList NO_PARAMETERS = new SimpleParameterList(0, null);
+ static final SimpleParameterList NO_PARAMETERS = new SimpleParameterList(0, null);
}
diff --git a/pgjdbc/src/main/java/org/postgresql/core/v3/replication/V3PGReplicationStream.java b/pgjdbc/src/main/java/org/postgresql/core/v3/replication/V3PGReplicationStream.java
new file mode 100644
index 0000000..1ffdbba
--- /dev/null
+++ b/pgjdbc/src/main/java/org/postgresql/core/v3/replication/V3PGReplicationStream.java
@@ -0,0 +1,285 @@
+/*
+ * Copyright (c) 2016, PostgreSQL Global Development Group
+ * See the LICENSE file in the project root for more information.
+ */
+
+package org.postgresql.core.v3.replication;
+
+import org.postgresql.copy.CopyDual;
+import org.postgresql.replication.LogSequenceNumber;
+import org.postgresql.replication.PGReplicationStream;
+import org.postgresql.replication.ReplicationType;
+import org.postgresql.util.GT;
+import org.postgresql.util.PSQLException;
+import org.postgresql.util.PSQLState;
+
+import java.net.SocketTimeoutException;
+import java.nio.ByteBuffer;
+import java.sql.SQLException;
+import java.util.Date;
+import java.util.concurrent.TimeUnit;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+public class V3PGReplicationStream implements PGReplicationStream {
+
+ private static final Logger LOGGER = Logger.getLogger(V3PGReplicationStream.class.getName());
+ public static final long POSTGRES_EPOCH_2000_01_01 = 946684800000L;
+ private final CopyDual copyDual;
+ private final long updateInterval;
+ private final ReplicationType replicationType;
+ private long lastStatusUpdate;
+ private boolean closeFlag = false;
+
+ private LogSequenceNumber lastServerLSN = LogSequenceNumber.INVALID_LSN;
+ /**
+ * Last receive LSN + payload size
+ */
+ private LogSequenceNumber lastReceiveLSN = LogSequenceNumber.INVALID_LSN;
+ private LogSequenceNumber lastAppliedLSN = LogSequenceNumber.INVALID_LSN;
+ private LogSequenceNumber lastFlushedLSN = LogSequenceNumber.INVALID_LSN;
+
+ /**
+ * @param copyDual bidirectional copy protocol
+ * @param startLSN the position in the WAL that we want to initiate replication from
+ * usually the currentLSN returned by calling pg_current_wal_lsn()for v10
+ * above or pg_current_xlog_location() depending on the version of the
+ * server
+ * @param updateIntervalMs the number of millisecond between status packets sent back to the
+ * server. A value of zero disables the periodic status updates
+ * completely, although an update will still be sent when requested by the
+ * server, to avoid timeout disconnect.
+ * @param replicationType LOGICAL or PHYSICAL
+ */
+ public V3PGReplicationStream(CopyDual copyDual, LogSequenceNumber startLSN, long updateIntervalMs,
+ ReplicationType replicationType
+ ) {
+ this.copyDual = copyDual;
+ this.updateInterval = updateIntervalMs;
+ this.lastStatusUpdate = System.currentTimeMillis() - updateIntervalMs;
+ this.lastReceiveLSN = startLSN;
+ this.replicationType = replicationType;
+ }
+
+ @Override
+ public ByteBuffer read() throws SQLException {
+ checkClose();
+
+ ByteBuffer payload = null;
+ while (payload == null && copyDual.isActive()) {
+ payload = readInternal(true);
+ }
+
+ return payload;
+ }
+
+ public ByteBuffer readPending() throws SQLException {
+ checkClose();
+ return readInternal(false);
+ }
+
+ @Override
+ public LogSequenceNumber getLastReceiveLSN() {
+ return lastReceiveLSN;
+ }
+
+ @Override
+ public LogSequenceNumber getLastFlushedLSN() {
+ return lastFlushedLSN;
+ }
+
+ @Override
+ public LogSequenceNumber getLastAppliedLSN() {
+ return lastAppliedLSN;
+ }
+
+ @Override
+ public void setFlushedLSN(LogSequenceNumber flushed) {
+ this.lastFlushedLSN = flushed;
+ }
+
+ @Override
+ public void setAppliedLSN(LogSequenceNumber applied) {
+ this.lastAppliedLSN = applied;
+ }
+
+ @Override
+ public void forceUpdateStatus() throws SQLException {
+ checkClose();
+ updateStatusInternal(lastReceiveLSN, lastFlushedLSN, lastAppliedLSN, true);
+ }
+
+ @Override
+ public boolean isClosed() {
+ return closeFlag || !copyDual.isActive();
+ }
+
+ private ByteBuffer readInternal(boolean block) throws SQLException {
+ boolean updateStatusRequired = false;
+ while (copyDual.isActive()) {
+ if (updateStatusRequired || isTimeUpdate()) {
+ timeUpdateStatus();
+ }
+
+ ByteBuffer buffer = receiveNextData(block);
+
+ if (buffer == null) {
+ return null;
+ }
+
+ int code = buffer.get();
+
+ switch (code) {
+
+ case 'k': //KeepAlive message
+ updateStatusRequired = processKeepAliveMessage(buffer);
+ updateStatusRequired |= updateInterval == 0;
+ break;
+
+ case 'w': //XLogData
+ return processXLogData(buffer);
+
+ default:
+ throw new PSQLException(
+ GT.tr("Unexpected packet type during replication: {0}", Integer.toString(code)),
+ PSQLState.PROTOCOL_VIOLATION
+ );
+ }
+ }
+
+ return null;
+ }
+
+ private ByteBuffer receiveNextData(boolean block) throws SQLException {
+ try {
+ byte[] message = copyDual.readFromCopy(block);
+ if (message != null) {
+ return ByteBuffer.wrap(message);
+ } else {
+ return null;
+ }
+ } catch (PSQLException e) { //todo maybe replace on thread sleep?
+ if (e.getCause() instanceof SocketTimeoutException) {
+ //signal for keep alive
+ return null;
+ }
+
+ throw e;
+ }
+ }
+
+ private boolean isTimeUpdate() {
+ /* a value of 0 disables automatic updates */
+ if ( updateInterval == 0 ) {
+ return false;
+ }
+ long diff = System.currentTimeMillis() - lastStatusUpdate;
+ return diff >= updateInterval;
+ }
+
+ private void timeUpdateStatus() throws SQLException {
+ updateStatusInternal(lastReceiveLSN, lastFlushedLSN, lastAppliedLSN, false);
+ }
+
+ private void updateStatusInternal(
+ LogSequenceNumber received, LogSequenceNumber flushed, LogSequenceNumber applied,
+ boolean replyRequired)
+ throws SQLException {
+ byte[] reply = prepareUpdateStatus(received, flushed, applied, replyRequired);
+ copyDual.writeToCopy(reply, 0, reply.length);
+ copyDual.flushCopy();
+
+ lastStatusUpdate = System.currentTimeMillis();
+ }
+
+ private byte[] prepareUpdateStatus(LogSequenceNumber received, LogSequenceNumber flushed,
+ LogSequenceNumber applied, boolean replyRequired) {
+ ByteBuffer byteBuffer = ByteBuffer.allocate(1 + 8 + 8 + 8 + 8 + 1);
+
+ long now = System.currentTimeMillis();
+ long systemClock = TimeUnit.MICROSECONDS.convert((now - POSTGRES_EPOCH_2000_01_01),
+ TimeUnit.MICROSECONDS);
+
+ if (LOGGER.isLoggable(Level.FINEST)) {
+ LOGGER.log(Level.FINEST, " FE=> StandbyStatusUpdate(received: {0}, flushed: {1}, applied: {2}, clock: {3})",
+ new Object[]{received.asString(), flushed.asString(), applied.asString(), new Date(now)});
+ }
+
+ byteBuffer.put((byte) 'r');
+ byteBuffer.putLong(received.asLong());
+ byteBuffer.putLong(flushed.asLong());
+ byteBuffer.putLong(applied.asLong());
+ byteBuffer.putLong(systemClock);
+ if (replyRequired) {
+ byteBuffer.put((byte) 1);
+ } else {
+ byteBuffer.put(received == LogSequenceNumber.INVALID_LSN ? (byte) 1 : (byte) 0);
+ }
+
+ lastStatusUpdate = now;
+ return byteBuffer.array();
+ }
+
+ private boolean processKeepAliveMessage(ByteBuffer buffer) {
+ lastServerLSN = LogSequenceNumber.valueOf(buffer.getLong());
+ if (lastServerLSN.asLong() > lastReceiveLSN.asLong()) {
+ lastReceiveLSN = lastServerLSN;
+ }
+
+ long lastServerClock = buffer.getLong();
+
+ boolean replyRequired = buffer.get() != 0;
+
+ if (LOGGER.isLoggable(Level.FINEST)) {
+ Date clockTime = new Date(
+ TimeUnit.MILLISECONDS.convert(lastServerClock, TimeUnit.MICROSECONDS)
+ + POSTGRES_EPOCH_2000_01_01);
+ LOGGER.log(Level.FINEST, " <=BE Keepalive(lastServerWal: {0}, clock: {1} needReply: {2})",
+ new Object[]{lastServerLSN.asString(), clockTime, replyRequired});
+ }
+
+ return replyRequired;
+ }
+
+ private ByteBuffer processXLogData(ByteBuffer buffer) {
+ long startLsn = buffer.getLong();
+ lastServerLSN = LogSequenceNumber.valueOf(buffer.getLong());
+ long systemClock = buffer.getLong();
+
+ switch (replicationType) {
+ case LOGICAL:
+ lastReceiveLSN = LogSequenceNumber.valueOf(startLsn);
+ break;
+ case PHYSICAL:
+ int payloadSize = buffer.limit() - buffer.position();
+ lastReceiveLSN = LogSequenceNumber.valueOf(startLsn + payloadSize);
+ break;
+ }
+
+ if (LOGGER.isLoggable(Level.FINEST)) {
+ LOGGER.log(Level.FINEST, " <=BE XLogData(currWal: {0}, lastServerWal: {1}, clock: {2})",
+ new Object[]{lastReceiveLSN.asString(), lastServerLSN.asString(), systemClock});
+ }
+
+ return buffer.slice();
+ }
+
+ private void checkClose() throws PSQLException {
+ if (isClosed()) {
+ throw new PSQLException(GT.tr("This replication stream has been closed."),
+ PSQLState.CONNECTION_DOES_NOT_EXIST);
+ }
+ }
+
+ public void close() throws SQLException {
+ if (isClosed()) {
+ return;
+ }
+
+ LOGGER.log(Level.FINEST, " FE=> StopReplication");
+
+ copyDual.endCopy();
+
+ closeFlag = true;
+ }
+}
diff --git a/pgjdbc/src/main/java/org/postgresql/core/v3/replication/V3ReplicationProtocol.java b/pgjdbc/src/main/java/org/postgresql/core/v3/replication/V3ReplicationProtocol.java
new file mode 100644
index 0000000..b61caf0
--- /dev/null
+++ b/pgjdbc/src/main/java/org/postgresql/core/v3/replication/V3ReplicationProtocol.java
@@ -0,0 +1,139 @@
+/*
+ * Copyright (c) 2016, PostgreSQL Global Development Group
+ * See the LICENSE file in the project root for more information.
+ */
+
+package org.postgresql.core.v3.replication;
+
+import org.postgresql.copy.CopyDual;
+import org.postgresql.core.PGStream;
+import org.postgresql.core.QueryExecutor;
+import org.postgresql.core.ReplicationProtocol;
+import org.postgresql.replication.PGReplicationStream;
+import org.postgresql.replication.ReplicationType;
+import org.postgresql.replication.fluent.CommonOptions;
+import org.postgresql.replication.fluent.logical.LogicalReplicationOptions;
+import org.postgresql.replication.fluent.physical.PhysicalReplicationOptions;
+import org.postgresql.util.GT;
+import org.postgresql.util.PSQLException;
+import org.postgresql.util.PSQLState;
+
+import java.io.IOException;
+import java.sql.SQLException;
+import java.util.Properties;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+public class V3ReplicationProtocol implements ReplicationProtocol {
+
+ private static final Logger LOGGER = Logger.getLogger(V3ReplicationProtocol.class.getName());
+ private final QueryExecutor queryExecutor;
+ private final PGStream pgStream;
+
+ public V3ReplicationProtocol(QueryExecutor queryExecutor, PGStream pgStream) {
+ this.queryExecutor = queryExecutor;
+ this.pgStream = pgStream;
+ }
+
+ public PGReplicationStream startLogical(LogicalReplicationOptions options)
+ throws SQLException {
+
+ String query = createStartLogicalQuery(options);
+ return initializeReplication(query, options, ReplicationType.LOGICAL);
+ }
+
+ public PGReplicationStream startPhysical(PhysicalReplicationOptions options)
+ throws SQLException {
+
+ String query = createStartPhysicalQuery(options);
+ return initializeReplication(query, options, ReplicationType.PHYSICAL);
+ }
+
+ private PGReplicationStream initializeReplication(String query, CommonOptions options,
+ ReplicationType replicationType)
+ throws SQLException {
+ LOGGER.log(Level.FINEST, " FE=> StartReplication(query: {0})", query);
+
+ configureSocketTimeout(options);
+ CopyDual copyDual = (CopyDual) queryExecutor.startCopy(query, true);
+
+ return new V3PGReplicationStream(
+ copyDual,
+ options.getStartLSNPosition(),
+ options.getStatusInterval(),
+ replicationType
+ );
+ }
+
+ /**
+ * START_REPLICATION [SLOT slot_name] [PHYSICAL] XXX/XXX
+ */
+ private String createStartPhysicalQuery(PhysicalReplicationOptions options) {
+ StringBuilder builder = new StringBuilder();
+ builder.append("START_REPLICATION");
+
+ if (options.getSlotName() != null) {
+ builder.append(" SLOT ").append(options.getSlotName());
+ }
+
+ builder.append(" PHYSICAL ").append(options.getStartLSNPosition().asString());
+
+ return builder.toString();
+ }
+
+ /**
+ * START_REPLICATION SLOT slot_name LOGICAL XXX/XXX [ ( option_name [option_value] [, ... ] ) ]
+ */
+ private String createStartLogicalQuery(LogicalReplicationOptions options) {
+ StringBuilder builder = new StringBuilder();
+ builder.append("START_REPLICATION SLOT ")
+ .append(options.getSlotName())
+ .append(" LOGICAL ")
+ .append(options.getStartLSNPosition().asString());
+
+ Properties slotOptions = options.getSlotOptions();
+ if (slotOptions.isEmpty()) {
+ return builder.toString();
+ }
+
+ //todo replace on java 8
+ builder.append(" (");
+ boolean isFirst = true;
+ for (String name : slotOptions.stringPropertyNames()) {
+ if (isFirst) {
+ isFirst = false;
+ } else {
+ builder.append(", ");
+ }
+ builder.append('\"').append(name).append('\"').append(" ")
+ .append('\'').append(slotOptions.getProperty(name)).append('\'');
+ }
+ builder.append(")");
+
+ return builder.toString();
+ }
+
+ private void configureSocketTimeout(CommonOptions options) throws PSQLException {
+ if (options.getStatusInterval() == 0) {
+ return;
+ }
+
+ try {
+ int previousTimeOut = pgStream.getSocket().getSoTimeout();
+
+ int minimalTimeOut;
+ if (previousTimeOut > 0) {
+ minimalTimeOut = Math.min(previousTimeOut, options.getStatusInterval());
+ } else {
+ minimalTimeOut = options.getStatusInterval();
+ }
+
+ pgStream.getSocket().setSoTimeout(minimalTimeOut);
+ } catch (IOException ioe) {
+ throw new PSQLException(GT.tr("The connection attempt failed."),
+ PSQLState.CONNECTION_UNABLE_TO_CONNECT, ioe);
+ }
+ }
+
+
+}
diff --git a/pgjdbc/src/main/java/org/postgresql/ds/PGConnectionPoolDataSource.java b/pgjdbc/src/main/java/org/postgresql/ds/PGConnectionPoolDataSource.java
index 8afcedb..42368ea 100644
--- a/pgjdbc/src/main/java/org/postgresql/ds/PGConnectionPoolDataSource.java
+++ b/pgjdbc/src/main/java/org/postgresql/ds/PGConnectionPoolDataSource.java
@@ -44,7 +44,7 @@ public class PGConnectionPoolDataSource extends BaseDataSource
* Gets a description of this DataSource.
*/
public String getDescription() {
- return "ConnectionPoolDataSource from " + org.postgresql.Driver.getVersion();
+ return "ConnectionPoolDataSource from " + org.postgresql.util.DriverInfo.DRIVER_FULL_NAME;
}
/**
@@ -98,10 +98,4 @@ public class PGConnectionPoolDataSource extends BaseDataSource
readBaseObject(in);
defaultAutoCommit = in.readBoolean();
}
-
- public java.util.logging.Logger getParentLogger()
- throws java.sql.SQLFeatureNotSupportedException {
- throw org.postgresql.Driver.notImplemented(this.getClass(), "getParentLogger()");
- }
-
}
diff --git a/pgjdbc/src/main/java/org/postgresql/ds/PGPooledConnection.java b/pgjdbc/src/main/java/org/postgresql/ds/PGPooledConnection.java
index 3abb8be..64b1b40 100644
--- a/pgjdbc/src/main/java/org/postgresql/ds/PGPooledConnection.java
+++ b/pgjdbc/src/main/java/org/postgresql/ds/PGPooledConnection.java
@@ -18,7 +18,6 @@ import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
-import java.sql.SQLFeatureNotSupportedException;
import java.sql.Statement;
import java.util.LinkedList;
import java.util.List;
@@ -63,6 +62,7 @@ public class PGPooledConnection implements PooledConnection {
/**
* Adds a listener for close or fatal error events on the connection handed out to a client.
*/
+ @Override
public void addConnectionEventListener(ConnectionEventListener connectionEventListener) {
listeners.add(connectionEventListener);
}
@@ -70,6 +70,7 @@ public class PGPooledConnection implements PooledConnection {
/**
* Removes a listener for close or fatal error events on the connection handed out to a client.
*/
+ @Override
public void removeConnectionEventListener(ConnectionEventListener connectionEventListener) {
listeners.remove(connectionEventListener);
}
@@ -78,6 +79,7 @@ public class PGPooledConnection implements PooledConnection {
* Closes the physical database connection represented by this PooledConnection. If any client has
* a connection based on this PooledConnection, it is forcibly closed as well.
*/
+ @Override
public void close() throws SQLException {
if (last != null) {
last.close();
@@ -108,6 +110,7 @@ public class PGPooledConnection implements PooledConnection {
* called, the previous one is forcibly closed and its work rolled back.
* </p>
*/
+ @Override
public Connection getConnection() throws SQLException {
if (con == null) {
// Before throwing the exception, let's notify the registered listeners about the error
@@ -249,10 +252,11 @@ public class PGPooledConnection implements PooledConnection {
private Connection proxy; // the Connection the client is currently using, which is a proxy
private boolean automatic = false;
- public ConnectionHandler(Connection con) {
+ ConnectionHandler(Connection con) {
this.con = con;
}
+ @Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
final String methodName = method.getName();
// From Object
@@ -376,11 +380,12 @@ public class PGPooledConnection implements PooledConnection {
private ConnectionHandler con;
private Statement st;
- public StatementHandler(ConnectionHandler con, Statement st) {
+ StatementHandler(ConnectionHandler con, Statement st) {
this.con = con;
this.st = st;
}
+ @Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
final String methodName = method.getName();
// From Object
@@ -431,13 +436,12 @@ public class PGPooledConnection implements PooledConnection {
}
}
+ @Override
public void removeStatementEventListener(StatementEventListener listener) {
}
+ @Override
public void addStatementEventListener(StatementEventListener listener) {
}
- public java.util.logging.Logger getParentLogger() throws SQLFeatureNotSupportedException {
- throw org.postgresql.Driver.notImplemented(this.getClass(), "getParentLogger()");
- }
}
diff --git a/pgjdbc/src/main/java/org/postgresql/ds/PGPoolingDataSource.java b/pgjdbc/src/main/java/org/postgresql/ds/PGPoolingDataSource.java
index 6dddc57..c8c4ce4 100644
--- a/pgjdbc/src/main/java/org/postgresql/ds/PGPoolingDataSource.java
+++ b/pgjdbc/src/main/java/org/postgresql/ds/PGPoolingDataSource.java
@@ -12,7 +12,6 @@ import org.postgresql.util.PSQLState;
import java.sql.Connection;
import java.sql.SQLException;
-import java.sql.SQLFeatureNotSupportedException;
import java.util.Stack;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
@@ -54,7 +53,11 @@ import javax.sql.PooledConnection;
* </p>
*
* @author Aaron Mulder (ammulder at chariotsolutions.com)
+ *
+ * @deprecated Since 42.0.0, instead of this class you should use a fully featured connection pool
+ * like HikariCP, vibur-dbcp, commons-dbcp, c3p0, etc.
*/
+ at Deprecated
public class PGPoolingDataSource extends BaseDataSource implements DataSource {
protected static ConcurrentMap<String, PGPoolingDataSource> dataSources =
new ConcurrentHashMap<String, PGPoolingDataSource>();
@@ -78,7 +81,7 @@ public class PGPoolingDataSource extends BaseDataSource implements DataSource {
* Gets a description of this DataSource.
*/
public String getDescription() {
- return "Pooling DataSource '" + dataSourceName + " from " + org.postgresql.Driver.getVersion();
+ return "Pooling DataSource '" + dataSourceName + " from " + org.postgresql.util.DriverInfo.DRIVER_FULL_NAME;
}
/**
@@ -455,8 +458,4 @@ public class PGPoolingDataSource extends BaseDataSource implements DataSource {
}
throw new SQLException("Cannot unwrap to " + iface.getName());
}
-
- public java.util.logging.Logger getParentLogger() throws SQLFeatureNotSupportedException {
- throw org.postgresql.Driver.notImplemented(this.getClass(), "getParentLogger()");
- }
}
diff --git a/pgjdbc/src/main/java/org/postgresql/ds/PGSimpleDataSource.java b/pgjdbc/src/main/java/org/postgresql/ds/PGSimpleDataSource.java
index c76c415..d7f3d88 100644
--- a/pgjdbc/src/main/java/org/postgresql/ds/PGSimpleDataSource.java
+++ b/pgjdbc/src/main/java/org/postgresql/ds/PGSimpleDataSource.java
@@ -12,7 +12,6 @@ import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.sql.SQLException;
-import java.sql.SQLFeatureNotSupportedException;
import javax.sql.DataSource;
@@ -28,7 +27,7 @@ public class PGSimpleDataSource extends BaseDataSource implements DataSource, Se
* Gets a description of this DataSource.
*/
public String getDescription() {
- return "Non-Pooling DataSource from " + org.postgresql.Driver.getVersion();
+ return "Non-Pooling DataSource from " + org.postgresql.util.DriverInfo.DRIVER_FULL_NAME;
}
private void writeObject(ObjectOutputStream out) throws IOException {
@@ -49,8 +48,4 @@ public class PGSimpleDataSource extends BaseDataSource implements DataSource, Se
}
throw new SQLException("Cannot unwrap to " + iface.getName());
}
-
- public java.util.logging.Logger getParentLogger() throws SQLFeatureNotSupportedException {
- throw org.postgresql.Driver.notImplemented(this.getClass(), "getParentLogger()");
- }
}
diff --git a/pgjdbc/src/main/java/org/postgresql/ds/common/BaseDataSource.java b/pgjdbc/src/main/java/org/postgresql/ds/common/BaseDataSource.java
index 7bf3e0b..0d5261a 100644
--- a/pgjdbc/src/main/java/org/postgresql/ds/common/BaseDataSource.java
+++ b/pgjdbc/src/main/java/org/postgresql/ds/common/BaseDataSource.java
@@ -8,6 +8,7 @@ package org.postgresql.ds.common;
import org.postgresql.PGProperty;
import org.postgresql.jdbc.AutoSave;
import org.postgresql.jdbc.PreferQueryMode;
+import org.postgresql.util.ExpressionProperties;
import org.postgresql.util.GT;
import org.postgresql.util.PSQLException;
import org.postgresql.util.PSQLState;
@@ -22,32 +23,24 @@ import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;
+import java.util.logging.Level;
+import java.util.logging.Logger;
import javax.naming.NamingException;
import javax.naming.RefAddr;
import javax.naming.Reference;
import javax.naming.Referenceable;
import javax.naming.StringRefAddr;
+import javax.sql.CommonDataSource;
/**
* Base class for data sources and related classes.
*
* @author Aaron Mulder (ammulder at chariotsolutions.com)
*/
-public abstract class BaseDataSource implements Referenceable {
- // Load the normal driver, since we'll use it to actually connect to the
- // database. That way we don't have to maintain the connecting code in
- // multiple places.
- static {
- try {
- Class.forName("org.postgresql.Driver");
- } catch (ClassNotFoundException e) {
- System.err.println("PostgreSQL DataSource unable to load PostgreSQL JDBC Driver");
- }
- }
+public abstract class BaseDataSource implements CommonDataSource, Referenceable {
- // Needed to implement the DataSource/ConnectionPoolDataSource interfaces
- private transient PrintWriter logger;
+ private static final Logger LOGGER = Logger.getLogger(BaseDataSource.class.getName());
// Standard properties, defined in the JDBC 2.0 Optional Package spec
private String serverName = "localhost";
@@ -59,6 +52,21 @@ public abstract class BaseDataSource implements Referenceable {
// Map for all other properties
private Properties properties = new Properties();
+ /*
+ * Ensure the driver is loaded as JDBC Driver might be invisible to Java's ServiceLoader.
+ * Usually, {@code Class.forName(...)} is not required as {@link DriverManager} detects JDBC drivers
+ * via {@code META-INF/services/java.sql.Driver} entries. However there might be cases when the driver
+ * is located at the application level classloader, thus it might be required to perform manual
+ * registration of the driver.
+ */
+ static {
+ try {
+ Class.forName("org.postgresql.Driver");
+ } catch (ClassNotFoundException e) {
+ throw new IllegalStateException("BaseDataSource is unable to load org.postgresql.Driver. Please check if you have proper PostgreSQL JDBC Driver jar on the classpath", e);
+ }
+ }
+
/**
* Gets a connection to the PostgreSQL database. The database is identified by the DataSource
* properties serverName, databaseName, and portNumber. The user to connect as is identified by
@@ -84,35 +92,32 @@ public abstract class BaseDataSource implements Referenceable {
public Connection getConnection(String user, String password) throws SQLException {
try {
Connection con = DriverManager.getConnection(getUrl(), user, password);
- if (logger != null) {
- logger.println("Created a non-pooled connection for " + user + " at " + getUrl());
+ if (LOGGER.isLoggable(Level.FINE)) {
+ LOGGER.log(Level.FINE, "Created a {0} for {1} at {2}", new Object[]{getDescription(), user, getUrl()});
}
return con;
} catch (SQLException e) {
- if (logger != null) {
- logger.println(
- "Failed to create a non-pooled connection for " + user + " at " + getUrl() + ": " + e);
- }
+ LOGGER.log(Level.SEVERE, "Failed to create a {0} for {1} at {2}: {3}",
+ new Object[]{getDescription(), user, getUrl(), e});
throw e;
}
}
/**
- * Gets the log writer used to log connections opened.
- *
- * @return log writer used to log connections opened
+ * This implementation don't use a LogWriter.
*/
+ @Override
public PrintWriter getLogWriter() {
- return logger;
+ return null;
}
/**
- * The DataSource will note every connection opened to the provided log writer.
- *
- * @param printWriter log writer used to log connections opened
+ * This implementation don't use a LogWriter.
+ * @param printWriter Not used
*/
+ @Override
public void setLogWriter(PrintWriter printWriter) {
- logger = printWriter;
+ // NOOP
}
/**
@@ -228,25 +233,10 @@ public abstract class BaseDataSource implements Referenceable {
}
/**
- * @return value of compatible parameter
- * @see PGProperty#COMPATIBLE
- */
- public String getCompatible() {
- return PGProperty.COMPATIBLE.get(properties);
- }
-
- /**
- * @param compatible value of compatible parameter
- * @see PGProperty#COMPATIBLE
- */
- public void setCompatible(String compatible) {
- PGProperty.COMPATIBLE.set(properties, compatible);
- }
-
- /**
* @return login timeout
* @see PGProperty#LOGIN_TIMEOUT
*/
+ @Override
public int getLoginTimeout() {
return PGProperty.LOGIN_TIMEOUT.getIntNoCheck(properties);
}
@@ -255,6 +245,7 @@ public abstract class BaseDataSource implements Referenceable {
* @param loginTimeout login timeout
* @see PGProperty#LOGIN_TIMEOUT
*/
+ @Override
public void setLoginTimeout(int loginTimeout) {
PGProperty.LOGIN_TIMEOUT.set(properties, loginTimeout);
}
@@ -276,22 +267,6 @@ public abstract class BaseDataSource implements Referenceable {
}
/**
- * @return log level
- * @see PGProperty#LOG_LEVEL
- */
- public int getLogLevel() {
- return PGProperty.LOG_LEVEL.getIntNoCheck(properties);
- }
-
- /**
- * @param logLevel log level
- * @see PGProperty#LOG_LEVEL
- */
- public void setLogLevel(int logLevel) {
- PGProperty.LOG_LEVEL.set(properties, logLevel);
- }
-
- /**
* @return protocol version
* @see PGProperty#PROTOCOL_VERSION
*/
@@ -906,6 +881,22 @@ public abstract class BaseDataSource implements Referenceable {
}
/**
+ * @return true if perform JAAS login before GSS authentication
+ * @see PGProperty#JAAS_LOGIN
+ */
+ public boolean getJaasLogin() {
+ return PGProperty.JAAS_LOGIN.getBoolean(properties);
+ }
+
+ /**
+ * @param doLogin true if perform JAAS login before GSS authentication
+ * @see PGProperty#JAAS_LOGIN
+ */
+ public void setJaasLogin(boolean doLogin) {
+ PGProperty.JAAS_LOGIN.set(properties, doLogin);
+ }
+
+ /**
* @return Kerberos server name
* @see PGProperty#KERBEROS_SERVER_NAME
*/
@@ -970,22 +961,6 @@ public abstract class BaseDataSource implements Referenceable {
}
/**
- * @return character set to use for data sent to the database or received
- * @see PGProperty#CHARSET
- */
- public String getCharset() {
- return PGProperty.CHARSET.get(properties);
- }
-
- /**
- * @param charset character set to use for data sent to the database or received
- * @see PGProperty#CHARSET
- */
- public void setCharset(String charset) {
- PGProperty.CHARSET.set(properties, charset);
- }
-
- /**
* @return if connection allows encoding changes
* @see PGProperty#ALLOW_ENCODING_CHANGES
*/
@@ -1034,6 +1009,55 @@ public abstract class BaseDataSource implements Referenceable {
}
/**
+ * @param replication set to 'database' for logical replication or 'true' for physical replication
+ * @see PGProperty#REPLICATION
+ */
+ public void setReplication(String replication) {
+ PGProperty.REPLICATION.set(properties, replication);
+ }
+
+ /**
+ * @return null, 'database', or 'true
+ * @see PGProperty#REPLICATION
+ */
+ public String getReplication() {
+ return PGProperty.REPLICATION.get(properties);
+ }
+
+ /**
+ * @return Logger Level of the JDBC Driver
+ * @see PGProperty#LOGGER_LEVEL
+ */
+ public String getLoggerLevel() {
+ return PGProperty.LOGGER_LEVEL.get(properties);
+ }
+
+ /**
+ * @param loggerLevel of the JDBC Driver
+ * @see PGProperty#LOGGER_LEVEL
+ */
+ public void setLoggerLevel(String loggerLevel) {
+ PGProperty.LOGGER_LEVEL.set(properties, loggerLevel);
+ }
+
+ /**
+ * @return File output of the Logger.
+ * @see PGProperty#LOGGER_FILE
+ */
+ public String getLoggerFile() {
+ ExpressionProperties exprProps = new ExpressionProperties(properties, System.getProperties());
+ return PGProperty.LOGGER_FILE.get(exprProps);
+ }
+
+ /**
+ * @param loggerFile File output of the Logger.
+ * @see PGProperty#LOGGER_LEVEL
+ */
+ public void setLoggerFile(String loggerFile) {
+ PGProperty.LOGGER_FILE.set(properties, loggerFile);
+ }
+
+ /**
* Generates a {@link DriverManager} URL from the other properties supplied.
*
* @return {@link DriverManager} URL from the other properties supplied
@@ -1068,6 +1092,15 @@ public abstract class BaseDataSource implements Referenceable {
}
/**
+ * Generates a {@link DriverManager} URL from the other properties supplied.
+ *
+ * @return {@link DriverManager} URL from the other properties supplied
+ */
+ public String getURL() {
+ return getUrl();
+ }
+
+ /**
* Sets properties from a {@link DriverManager} URL.
*
* @param url properties to set
@@ -1081,6 +1114,16 @@ public abstract class BaseDataSource implements Referenceable {
}
}
+ /**
+ * Sets properties from a {@link DriverManager} URL.
+ * Added to follow convention used in other DBMS.
+ *
+ * @param url properties to set
+ */
+ public void setURL(String url) {
+ setUrl(url);
+ }
+
public String getProperty(String name) throws SQLException {
PGProperty pgProperty = PGProperty.forName(name);
if (pgProperty != null) {
@@ -1219,14 +1262,6 @@ public abstract class BaseDataSource implements Referenceable {
readBaseObject(ois);
}
- public void setLoglevel(int logLevel) {
- PGProperty.LOG_LEVEL.set(properties, logLevel);
- }
-
- public int getLoglevel() {
- return PGProperty.LOG_LEVEL.getIntNoCheck(properties);
- }
-
/**
* @see PGProperty#PREFER_QUERY_MODE
* @return preferred query execution mode
@@ -1237,7 +1272,7 @@ public abstract class BaseDataSource implements Referenceable {
/**
* @see PGProperty#PREFER_QUERY_MODE
- * @param preferQueryMode extended, simple, extendedForPrepared, or extendedCacheEveryting
+ * @param preferQueryMode extended, simple, extendedForPrepared, or extendedCacheEverything
*/
public void setPreferQueryMode(PreferQueryMode preferQueryMode) {
PGProperty.PREFER_QUERY_MODE.set(properties, preferQueryMode.value());
@@ -1274,4 +1309,10 @@ public abstract class BaseDataSource implements Referenceable {
public void setReWriteBatchedInserts(boolean reWrite) {
PGProperty.REWRITE_BATCHED_INSERTS.set(properties, reWrite);
}
+
+ //#if mvn.project.property.postgresql.jdbc.spec >= "JDBC4.1"
+ public java.util.logging.Logger getParentLogger() {
+ return Logger.getLogger("org.postgresql");
+ }
+ //#endif
}
diff --git a/pgjdbc/src/main/java/org/postgresql/fastpath/Fastpath.java b/pgjdbc/src/main/java/org/postgresql/fastpath/Fastpath.java
index d259bb7..2833e8a 100644
--- a/pgjdbc/src/main/java/org/postgresql/fastpath/Fastpath.java
+++ b/pgjdbc/src/main/java/org/postgresql/fastpath/Fastpath.java
@@ -17,6 +17,7 @@ import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
+import java.util.logging.Level;
/**
* This class implements the Fastpath api.
@@ -31,7 +32,7 @@ public class Fastpath {
// Java passes oids around as longs, but in the backend
// it's an unsigned int, so we use this to make the conversion
// of long -> signed int which the backend interprets as unsigned.
- private final static long NUM_OIDS = 4294967296L; // 2^32
+ private static final long NUM_OIDS = 4294967296L; // 2^32
// This maps the functions names to their id's (possible unique just
// to a connection).
@@ -115,9 +116,7 @@ public class Fastpath {
*/
@Deprecated
public Object fastpath(String name, boolean resulttype, FastpathArg[] args) throws SQLException {
- if (connection.getLogger().logDebug()) {
- connection.getLogger().debug("Fastpath: calling " + name);
- }
+ connection.getLogger().log(Level.FINEST, "Fastpath: calling {0}", name);
return fastpath(getID(name), resulttype, args);
}
@@ -139,9 +138,7 @@ public class Fastpath {
* @see org.postgresql.largeobject.LargeObject
*/
public byte[] fastpath(String name, FastpathArg[] args) throws SQLException {
- if (connection.getLogger().logDebug()) {
- connection.getLogger().debug("Fastpath: calling " + name);
- }
+ connection.getLogger().log(Level.FINEST, "Fastpath: calling {0}", name);
return fastpath(getID(name), args);
}
diff --git a/pgjdbc/src/main/java/org/postgresql/fastpath/FastpathArg.java b/pgjdbc/src/main/java/org/postgresql/fastpath/FastpathArg.java
index 19c078f..b499785 100644
--- a/pgjdbc/src/main/java/org/postgresql/fastpath/FastpathArg.java
+++ b/pgjdbc/src/main/java/org/postgresql/fastpath/FastpathArg.java
@@ -65,7 +65,7 @@ public class FastpathArg {
*
* @param bytes array to store
*/
- public FastpathArg(byte bytes[]) {
+ public FastpathArg(byte[] bytes) {
this(bytes, 0, bytes.length);
}
@@ -76,7 +76,7 @@ public class FastpathArg {
* @param off offset within array
* @param len length of data to include
*/
- public FastpathArg(byte buf[], int off, int len) {
+ public FastpathArg(byte[] buf, int off, int len) {
this.bytes = buf;
this.bytesStart = off;
this.bytesLength = len;
diff --git a/pgjdbc/src/main/java/org/postgresql/geometric/PGbox.java b/pgjdbc/src/main/java/org/postgresql/geometric/PGbox.java
index 4abd01f..12d920b 100644
--- a/pgjdbc/src/main/java/org/postgresql/geometric/PGbox.java
+++ b/pgjdbc/src/main/java/org/postgresql/geometric/PGbox.java
@@ -22,7 +22,7 @@ public class PGbox extends PGobject implements PGBinaryObject, Serializable, Clo
/**
* These are the two points.
*/
- public PGpoint point[] = new PGpoint[2];
+ public PGpoint[] point = new PGpoint[2];
/**
* @param x1 first x coordinate
diff --git a/pgjdbc/src/main/java/org/postgresql/geometric/PGlseg.java b/pgjdbc/src/main/java/org/postgresql/geometric/PGlseg.java
index 45963f3..bc4fef8 100644
--- a/pgjdbc/src/main/java/org/postgresql/geometric/PGlseg.java
+++ b/pgjdbc/src/main/java/org/postgresql/geometric/PGlseg.java
@@ -21,7 +21,7 @@ public class PGlseg extends PGobject implements Serializable, Cloneable {
/**
* These are the two points.
*/
- public PGpoint point[] = new PGpoint[2];
+ public PGpoint[] point = new PGpoint[2];
/**
* @param x1 coordinate for first point
diff --git a/pgjdbc/src/main/java/org/postgresql/geometric/PGpath.java b/pgjdbc/src/main/java/org/postgresql/geometric/PGpath.java
index 4244614..1b013bd 100644
--- a/pgjdbc/src/main/java/org/postgresql/geometric/PGpath.java
+++ b/pgjdbc/src/main/java/org/postgresql/geometric/PGpath.java
@@ -26,7 +26,7 @@ public class PGpath extends PGobject implements Serializable, Cloneable {
/**
* The points defining this path
*/
- public PGpoint points[];
+ public PGpoint[] points;
/**
* @param points the PGpoints that define the path
diff --git a/pgjdbc/src/main/java/org/postgresql/geometric/PGpolygon.java b/pgjdbc/src/main/java/org/postgresql/geometric/PGpolygon.java
index 42eae23..079efb4 100644
--- a/pgjdbc/src/main/java/org/postgresql/geometric/PGpolygon.java
+++ b/pgjdbc/src/main/java/org/postgresql/geometric/PGpolygon.java
@@ -18,7 +18,7 @@ public class PGpolygon extends PGobject implements Serializable, Cloneable {
/**
* The points defining the polygon
*/
- public PGpoint points[];
+ public PGpoint[] points;
/**
* Creates a polygon using an array of PGpoints
diff --git a/pgjdbc/src/main/java/org/postgresql/gss/GssAction.java b/pgjdbc/src/main/java/org/postgresql/gss/GssAction.java
index 5ed6e4c..19b3e07 100644
--- a/pgjdbc/src/main/java/org/postgresql/gss/GssAction.java
+++ b/pgjdbc/src/main/java/org/postgresql/gss/GssAction.java
@@ -5,7 +5,6 @@
package org.postgresql.gss;
-import org.postgresql.core.Logger;
import org.postgresql.core.PGStream;
import org.postgresql.util.GT;
import org.postgresql.util.PSQLException;
@@ -21,32 +20,33 @@ import org.ietf.jgss.Oid;
import java.io.IOException;
import java.security.PrivilegedAction;
+import java.util.logging.Level;
+import java.util.logging.Logger;
class GssAction implements PrivilegedAction<Exception> {
+
+ private static final Logger LOGGER = Logger.getLogger(GssAction.class.getName());
private final PGStream pgStream;
private final String host;
private final String user;
private final String kerberosServerName;
- private final Logger logger;
private final boolean useSpnego;
private final GSSCredential clientCredentials;
- public GssAction(PGStream pgStream, GSSCredential clientCredentials, String host, String user,
- String kerberosServerName, Logger logger, boolean useSpnego) {
+ GssAction(PGStream pgStream, GSSCredential clientCredentials, String host, String user,
+ String kerberosServerName, boolean useSpnego) {
this.pgStream = pgStream;
this.clientCredentials = clientCredentials;
this.host = host;
this.user = user;
this.kerberosServerName = kerberosServerName;
- this.logger = logger;
this.useSpnego = useSpnego;
}
private static boolean hasSpnegoSupport(GSSManager manager) throws GSSException {
-
org.ietf.jgss.Oid spnego = new org.ietf.jgss.Oid("1.3.6.1.5.5.2");
- org.ietf.jgss.Oid mechs[] = manager.getMechs();
+ org.ietf.jgss.Oid[] mechs = manager.getMechs();
for (Oid mech : mechs) {
if (mech.equals(spnego)) {
@@ -63,7 +63,7 @@ class GssAction implements PrivilegedAction<Exception> {
GSSManager manager = GSSManager.getInstance();
GSSCredential clientCreds = null;
- Oid desiredMechs[] = new Oid[1];
+ Oid[] desiredMechs = new Oid[1];
if (clientCredentials == null) {
if (useSpnego && hasSpnegoSupport(manager)) {
desiredMechs[0] = new Oid("1.3.6.1.5.5.2");
@@ -85,8 +85,8 @@ class GssAction implements PrivilegedAction<Exception> {
GSSContext.DEFAULT_LIFETIME);
secContext.requestMutualAuth(true);
- byte inToken[] = new byte[0];
- byte outToken[] = null;
+ byte[] inToken = new byte[0];
+ byte[] outToken = null;
boolean established = false;
while (!established) {
@@ -94,9 +94,7 @@ class GssAction implements PrivilegedAction<Exception> {
if (outToken != null) {
- if (logger.logDebug()) {
- logger.debug(" FE=> Password(GSS Authentication Token)");
- }
+ LOGGER.log(Level.FINEST, " FE=> Password(GSS Authentication Token)");
pgStream.sendChar('p');
pgStream.sendInteger4(4 + outToken.length);
@@ -107,31 +105,26 @@ class GssAction implements PrivilegedAction<Exception> {
if (!secContext.isEstablished()) {
int response = pgStream.receiveChar();
// Error
- if (response == 'E') {
- int l_elen = pgStream.receiveInteger4();
- ServerErrorMessage l_errorMsg =
- new ServerErrorMessage(pgStream.receiveErrorString(l_elen - 4), logger.getLogLevel());
-
- if (logger.logDebug()) {
- logger.debug(" <=BE ErrorMessage(" + l_errorMsg + ")");
- }
-
- return new PSQLException(l_errorMsg);
-
- } else if (response == 'R') {
-
- if (logger.logDebug()) {
- logger.debug(" <=BE AuthenticationGSSContinue");
- }
-
- int len = pgStream.receiveInteger4();
- int type = pgStream.receiveInteger4();
- // should check type = 8
- inToken = pgStream.receive(len - 8);
- } else {
- // Unknown/unexpected message type.
- return new PSQLException(GT.tr("Protocol error. Session setup failed."),
- PSQLState.CONNECTION_UNABLE_TO_CONNECT);
+ switch (response) {
+ case 'E':
+ int l_elen = pgStream.receiveInteger4();
+ ServerErrorMessage l_errorMsg
+ = new ServerErrorMessage(pgStream.receiveErrorString(l_elen - 4));
+
+ LOGGER.log(Level.FINEST, " <=BE ErrorMessage({0})", l_errorMsg);
+
+ return new PSQLException(l_errorMsg);
+ case 'R':
+ LOGGER.log(Level.FINEST, " <=BE AuthenticationGSSContinue");
+ int len = pgStream.receiveInteger4();
+ int type = pgStream.receiveInteger4();
+ // should check type = 8
+ inToken = pgStream.receive(len - 8);
+ break;
+ default:
+ // Unknown/unexpected message type.
+ return new PSQLException(GT.tr("Protocol error. Session setup failed."),
+ PSQLState.CONNECTION_UNABLE_TO_CONNECT);
}
} else {
established = true;
diff --git a/pgjdbc/src/main/java/org/postgresql/gss/MakeGSS.java b/pgjdbc/src/main/java/org/postgresql/gss/MakeGSS.java
index 15de0da..af01f99 100644
--- a/pgjdbc/src/main/java/org/postgresql/gss/MakeGSS.java
+++ b/pgjdbc/src/main/java/org/postgresql/gss/MakeGSS.java
@@ -5,7 +5,6 @@
package org.postgresql.gss;
-import org.postgresql.core.Logger;
import org.postgresql.core.PGStream;
import org.postgresql.util.GT;
import org.postgresql.util.PSQLException;
@@ -18,6 +17,8 @@ import java.security.AccessController;
import java.security.PrivilegedAction;
import java.sql.SQLException;
import java.util.Set;
+import java.util.logging.Level;
+import java.util.logging.Logger;
import javax.security.auth.Subject;
import javax.security.auth.login.LoginContext;
@@ -25,12 +26,12 @@ import javax.security.auth.login.LoginContext;
public class MakeGSS {
+ private static final Logger LOGGER = Logger.getLogger(MakeGSS.class.getName());
+
public static void authenticate(PGStream pgStream, String host, String user, String password,
- String jaasApplicationName, String kerberosServerName, Logger logger, boolean useSpnego)
+ String jaasApplicationName, String kerberosServerName, boolean useSpnego, boolean jaasLogin)
throws IOException, SQLException {
- if (logger.logDebug()) {
- logger.debug(" <=BE AuthenticationReqGSS");
- }
+ LOGGER.log(Level.FINEST, " <=BE AuthenticationReqGSS");
if (jaasApplicationName == null) {
jaasApplicationName = "pgjdbc";
@@ -39,9 +40,9 @@ public class MakeGSS {
kerberosServerName = "postgres";
}
- Exception result = null;
+ Exception result;
try {
- boolean performAuthentication = true;
+ boolean performAuthentication = jaasLogin;
GSSCredential gssCredential = null;
Subject sub = Subject.getSubject(AccessController.getContext());
if (sub != null) {
@@ -58,7 +59,7 @@ public class MakeGSS {
sub = lc.getSubject();
}
PrivilegedAction<Exception> action = new GssAction(pgStream, gssCredential, host, user,
- kerberosServerName, logger, useSpnego);
+ kerberosServerName, useSpnego);
result = Subject.doAs(sub, action);
} catch (Exception e) {
diff --git a/pgjdbc/src/main/java/org/postgresql/hostchooser/CandidateHost.java b/pgjdbc/src/main/java/org/postgresql/hostchooser/CandidateHost.java
new file mode 100644
index 0000000..220ae1c
--- /dev/null
+++ b/pgjdbc/src/main/java/org/postgresql/hostchooser/CandidateHost.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (c) 2017, PostgreSQL Global Development Group
+ * See the LICENSE file in the project root for more information.
+ */
+
+package org.postgresql.hostchooser;
+
+import org.postgresql.util.HostSpec;
+
+
+/**
+ * Candidate host to be connected.
+ */
+public class CandidateHost {
+ public final HostSpec hostSpec;
+ public final HostRequirement targetServerType;
+
+ public CandidateHost(HostSpec hostSpec, HostRequirement targetServerType) {
+ this.hostSpec = hostSpec;
+ this.targetServerType = targetServerType;
+ }
+}
diff --git a/pgjdbc/src/main/java/org/postgresql/hostchooser/GlobalHostStatusTracker.java b/pgjdbc/src/main/java/org/postgresql/hostchooser/GlobalHostStatusTracker.java
index 6479a93..bd53ab9 100644
--- a/pgjdbc/src/main/java/org/postgresql/hostchooser/GlobalHostStatusTracker.java
+++ b/pgjdbc/src/main/java/org/postgresql/hostchooser/GlobalHostStatusTracker.java
@@ -30,23 +30,16 @@ public class GlobalHostStatusTracker {
public static void reportHostStatus(HostSpec hostSpec, HostStatus hostStatus) {
long now = currentTimeMillis();
synchronized (hostStatusMap) {
- HostSpecStatus oldStatus = hostStatusMap.get(hostSpec);
- if (oldStatus == null || updateStatusFromTo(oldStatus.status, hostStatus)) {
- hostStatusMap.put(hostSpec, new HostSpecStatus(hostSpec, hostStatus, now));
+ HostSpecStatus hostSpecStatus = hostStatusMap.get(hostSpec);
+ if (hostSpecStatus == null) {
+ hostSpecStatus = new HostSpecStatus(hostSpec);
+ hostStatusMap.put(hostSpec, hostSpecStatus);
}
+ hostSpecStatus.status = hostStatus;
+ hostSpecStatus.lastUpdated = now;
}
}
- private static boolean updateStatusFromTo(HostStatus oldStatus, HostStatus newStatus) {
- if (oldStatus == null) {
- return true;
- }
- if (newStatus == HostStatus.ConnectOK) {
- return oldStatus != HostStatus.Master && oldStatus != HostStatus.Slave;
- }
- return true;
- }
-
/**
* Returns a list of candidate hosts that have the required targetServerType.
*
@@ -55,38 +48,31 @@ public class GlobalHostStatusTracker {
* @param hostRecheckMillis How stale information is allowed.
* @return candidate hosts to connect to.
*/
- static List<HostSpecStatus> getCandidateHosts(HostSpec[] hostSpecs,
+ static List<HostSpec> getCandidateHosts(HostSpec[] hostSpecs,
HostRequirement targetServerType, long hostRecheckMillis) {
- List<HostSpecStatus> candidates = new ArrayList<HostSpecStatus>(hostSpecs.length);
+ List<HostSpec> candidates = new ArrayList<HostSpec>(hostSpecs.length);
long latestAllowedUpdate = currentTimeMillis() - hostRecheckMillis;
synchronized (hostStatusMap) {
for (HostSpec hostSpec : hostSpecs) {
HostSpecStatus hostInfo = hostStatusMap.get(hostSpec);
- // return null status wrapper if if the current value is not known or is too old
- if (hostInfo == null || hostInfo.lastUpdated < latestAllowedUpdate) {
- hostInfo = new HostSpecStatus(hostSpec, null, Long.MAX_VALUE);
- }
// candidates are nodes we do not know about and the nodes with correct type
- if (hostInfo.status == null || targetServerType.allowConnectingTo(hostInfo.status)) {
- candidates.add(hostInfo);
+ if (hostInfo == null
+ || hostInfo.lastUpdated < latestAllowedUpdate
+ || targetServerType.allowConnectingTo(hostInfo.status)) {
+ candidates.add(hostSpec);
}
}
}
return candidates;
}
- /**
- * Immutable structure of known status of one HostSpec.
- */
static class HostSpecStatus {
final HostSpec host;
- final HostStatus status;
- final long lastUpdated;
+ HostStatus status;
+ long lastUpdated;
- HostSpecStatus(HostSpec host, HostStatus hostStatus, long lastUpdated) {
+ HostSpecStatus(HostSpec host) {
this.host = host;
- this.status = hostStatus;
- this.lastUpdated = lastUpdated;
}
@Override
diff --git a/pgjdbc/src/main/java/org/postgresql/hostchooser/HostChooser.java b/pgjdbc/src/main/java/org/postgresql/hostchooser/HostChooser.java
index a4e25d2..a506b7b 100644
--- a/pgjdbc/src/main/java/org/postgresql/hostchooser/HostChooser.java
+++ b/pgjdbc/src/main/java/org/postgresql/hostchooser/HostChooser.java
@@ -5,18 +5,17 @@
package org.postgresql.hostchooser;
-import org.postgresql.util.HostSpec;
-
import java.util.Iterator;
/**
* Lists connections in preferred order.
*/
-public interface HostChooser {
+public interface HostChooser extends Iterable<CandidateHost> {
/**
* Lists connection hosts in preferred order.
*
* @return connection hosts in preferred order.
*/
- Iterator<HostSpec> iterator();
+ @Override
+ Iterator<CandidateHost> iterator();
}
diff --git a/pgjdbc/src/main/java/org/postgresql/hostchooser/HostChooserFactory.java b/pgjdbc/src/main/java/org/postgresql/hostchooser/HostChooserFactory.java
index 4fb27b1..4099fa0 100644
--- a/pgjdbc/src/main/java/org/postgresql/hostchooser/HostChooserFactory.java
+++ b/pgjdbc/src/main/java/org/postgresql/hostchooser/HostChooserFactory.java
@@ -17,7 +17,7 @@ public class HostChooserFactory {
public static HostChooser createHostChooser(HostSpec[] hostSpecs,
HostRequirement targetServerType, Properties info) {
if (hostSpecs.length == 1) {
- return new SingleHostChooser(hostSpecs[0]);
+ return new SingleHostChooser(hostSpecs[0], targetServerType);
}
return new MultiHostChooser(hostSpecs, targetServerType, info);
}
diff --git a/pgjdbc/src/main/java/org/postgresql/hostchooser/HostRequirement.java b/pgjdbc/src/main/java/org/postgresql/hostchooser/HostRequirement.java
index 798d365..6ffaa5e 100644
--- a/pgjdbc/src/main/java/org/postgresql/hostchooser/HostRequirement.java
+++ b/pgjdbc/src/main/java/org/postgresql/hostchooser/HostRequirement.java
@@ -19,16 +19,35 @@ public enum HostRequirement {
return status == HostStatus.Master || status == HostStatus.ConnectOK;
}
},
- slave {
+ secondary {
public boolean allowConnectingTo(HostStatus status) {
- return status == HostStatus.Slave || status == HostStatus.ConnectOK;
+ return status == HostStatus.Secondary || status == HostStatus.ConnectOK;
}
},
- preferSlave {
+ preferSecondary {
public boolean allowConnectingTo(HostStatus status) {
return status != HostStatus.ConnectFail;
}
};
public abstract boolean allowConnectingTo(HostStatus status);
+
+ /**
+ *
+ * The postgreSQL project has decided not to use the term slave to refer to alternate servers.
+ * secondary or standby is preferred. We have arbitrarily chosen secondary.
+ * As of Jan 2018 in order not to break existint code we are going to accept both slave or
+ * secondary for names of alternate servers.
+ *
+ * The current policy is to keep accepting this silently but not document slave, or slave preferSlave
+ *
+ * @param targetServerType the value of {@code targetServerType} connection property
+ * @return HostRequirement
+ */
+
+ public static HostRequirement getTargetServerType(String targetServerType) {
+ String allowSlave = targetServerType.replace("lave", "econdary");
+ return valueOf(allowSlave);
+ }
+
}
diff --git a/pgjdbc/src/main/java/org/postgresql/hostchooser/HostStatus.java b/pgjdbc/src/main/java/org/postgresql/hostchooser/HostStatus.java
index 921316d..cb72fda 100644
--- a/pgjdbc/src/main/java/org/postgresql/hostchooser/HostStatus.java
+++ b/pgjdbc/src/main/java/org/postgresql/hostchooser/HostStatus.java
@@ -12,5 +12,5 @@ public enum HostStatus {
ConnectFail,
ConnectOK,
Master,
- Slave
+ Secondary
}
diff --git a/pgjdbc/src/main/java/org/postgresql/hostchooser/MultiHostChooser.java b/pgjdbc/src/main/java/org/postgresql/hostchooser/MultiHostChooser.java
index 87256a5..3782e2e 100644
--- a/pgjdbc/src/main/java/org/postgresql/hostchooser/MultiHostChooser.java
+++ b/pgjdbc/src/main/java/org/postgresql/hostchooser/MultiHostChooser.java
@@ -5,17 +5,16 @@
package org.postgresql.hostchooser;
-import static java.lang.Boolean.parseBoolean;
-import static java.lang.Integer.parseInt;
-import static java.util.Arrays.asList;
import static java.util.Collections.shuffle;
-import static java.util.Collections.sort;
-import org.postgresql.hostchooser.GlobalHostStatusTracker.HostSpecStatus;
+import org.postgresql.PGProperty;
import org.postgresql.util.HostSpec;
+import org.postgresql.util.PSQLException;
+import java.util.AbstractList;
import java.util.ArrayList;
-import java.util.Comparator;
+import java.util.Arrays;
+import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
@@ -23,93 +22,117 @@ import java.util.Properties;
/**
* HostChooser that keeps track of known host statuses.
*/
-public class MultiHostChooser implements HostChooser {
+class MultiHostChooser implements HostChooser {
private HostSpec[] hostSpecs;
private final HostRequirement targetServerType;
private int hostRecheckTime;
private boolean loadBalance;
- protected MultiHostChooser(HostSpec[] hostSpecs, HostRequirement targetServerType,
+ MultiHostChooser(HostSpec[] hostSpecs, HostRequirement targetServerType,
Properties info) {
this.hostSpecs = hostSpecs;
this.targetServerType = targetServerType;
- hostRecheckTime = parseInt(info.getProperty("hostRecheckSeconds", "10")) * 1000;
- loadBalance = parseBoolean(info.getProperty("loadBalanceHosts", "false"));
+ try {
+ hostRecheckTime = PGProperty.HOST_RECHECK_SECONDS.getInt(info) * 1000;
+ loadBalance = PGProperty.LOAD_BALANCE_HOSTS.getBoolean(info);
+ } catch (PSQLException e) {
+ throw new RuntimeException(e);
+ }
}
- public Iterator<HostSpec> iterator() {
- List<HostSpecStatus> candidates =
- GlobalHostStatusTracker.getCandidateHosts(hostSpecs, targetServerType, hostRecheckTime);
- // if no candidates are suitable (all wrong type or unavailable) then we try original list in
- // order
- if (candidates.isEmpty()) {
- return asList(hostSpecs).iterator();
- }
- if (candidates.size() == 1) {
- return asList(candidates.get(0).host).iterator();
+ @Override
+ public Iterator<CandidateHost> iterator() {
+ Iterator<CandidateHost> res = candidateIterator();
+ if (!res.hasNext()) {
+ // In case all the candidate hosts are unavailable or do not match, try all the hosts just in case
+ List<HostSpec> allHosts = Arrays.asList(hostSpecs);
+ if (loadBalance) {
+ allHosts = new ArrayList<HostSpec>(allHosts);
+ Collections.shuffle(allHosts);
+ }
+ res = withReqStatus(targetServerType, allHosts).iterator();
}
- sortCandidates(candidates);
- shuffleGoodHosts(candidates);
- return extractHostSpecs(candidates).iterator();
+ return res;
}
- private void sortCandidates(List<HostSpecStatus> candidates) {
- if (targetServerType == HostRequirement.any) {
- return;
+ private Iterator<CandidateHost> candidateIterator() {
+ if (targetServerType != HostRequirement.preferSecondary) {
+ return getCandidateHosts(targetServerType).iterator();
}
- sort(candidates, new HostSpecByTargetServerTypeComparator());
- }
- private void shuffleGoodHosts(List<HostSpecStatus> candidates) {
- if (!loadBalance) {
- return;
+ // preferSecondary tries to find secondary hosts first
+ // Note: sort does not work here since there are "unknown" hosts,
+ // and that "unknown" might turn out to be master, so we should discard that
+ // if other secondaries exist
+ List<CandidateHost> secondaries = getCandidateHosts(HostRequirement.secondary);
+ List<CandidateHost> any = getCandidateHosts(HostRequirement.any);
+
+ if (secondaries.isEmpty()) {
+ return any.iterator();
}
- int count;
- for (count = 1; count < candidates.size(); count++) {
- HostSpecStatus hostSpecStatus = candidates.get(count);
- if (hostSpecStatus.status != null
- && !targetServerType.allowConnectingTo(hostSpecStatus.status)) {
- break;
- }
+
+ if (any.isEmpty()) {
+ return secondaries.iterator();
}
- if (count == 1) {
- return;
+
+ if (secondaries.get(secondaries.size() - 1).equals(any.get(0))) {
+ // When the last secondary's hostspec is the same as the first in "any" list, there's no need
+ // to attempt to connect it as "secondary"
+ // Note: this is only an optimization
+ secondaries = rtrim(1, secondaries);
}
- List<HostSpecStatus> goodHosts = candidates.subList(0, count);
- shuffle(goodHosts);
+ return append(secondaries, any).iterator();
}
- private List<HostSpec> extractHostSpecs(List<HostSpecStatus> hostSpecStatuses) {
- List<HostSpec> hostSpecs = new ArrayList<HostSpec>(hostSpecStatuses.size());
- for (HostSpecStatus hostSpecStatus : hostSpecStatuses) {
- hostSpecs.add(hostSpecStatus.host);
+ private List<CandidateHost> getCandidateHosts(HostRequirement hostRequirement) {
+ List<HostSpec> candidates =
+ GlobalHostStatusTracker.getCandidateHosts(hostSpecs, hostRequirement, hostRecheckTime);
+ if (loadBalance) {
+ shuffle(candidates);
}
- return hostSpecs;
+ return withReqStatus(hostRequirement, candidates);
}
- class HostSpecByTargetServerTypeComparator implements Comparator<HostSpecStatus> {
- @Override
- public int compare(HostSpecStatus o1, HostSpecStatus o2) {
- int r1 = rank(o1.status, targetServerType);
- int r2 = rank(o2.status, targetServerType);
- return r1 == r2 ? 0 : r1 > r2 ? -1 : 1;
- }
+ private List<CandidateHost> withReqStatus(final HostRequirement requirement, final List<HostSpec> hosts) {
+ return new AbstractList<CandidateHost>() {
+ @Override
+ public CandidateHost get(int index) {
+ return new CandidateHost(hosts.get(index), requirement);
+ }
- private int rank(HostStatus status, HostRequirement targetServerType) {
- if (status == HostStatus.ConnectFail) {
- return -1;
+ @Override
+ public int size() {
+ return hosts.size();
}
- switch (targetServerType) {
- case master:
- return status == HostStatus.Master || status == null ? 1 : 0;
- case slave:
- return status == HostStatus.Slave || status == null ? 1 : 0;
- case preferSlave:
- return status == HostStatus.Slave || status == null ? 2
- : status == HostStatus.Master ? 1 : 0;
- default:
- return 0;
+ };
+ }
+
+ private <T> List<T> append(final List<T> a, final List<T> b) {
+ return new AbstractList<T>() {
+ @Override
+ public T get(int index) {
+ return index < a.size() ? a.get(index) : b.get(index - a.size());
}
- }
+
+ @Override
+ public int size() {
+ return a.size() + b.size();
+ }
+ };
+ }
+
+ private <T> List<T> rtrim(final int size, final List<T> a) {
+ return new AbstractList<T>() {
+ @Override
+ public T get(int index) {
+ return a.get(index);
+ }
+
+ @Override
+ public int size() {
+ return Math.max(0, a.size() - size);
+ }
+ };
}
+
}
diff --git a/pgjdbc/src/main/java/org/postgresql/hostchooser/SingleHostChooser.java b/pgjdbc/src/main/java/org/postgresql/hostchooser/SingleHostChooser.java
index cec7d98..e79e834 100644
--- a/pgjdbc/src/main/java/org/postgresql/hostchooser/SingleHostChooser.java
+++ b/pgjdbc/src/main/java/org/postgresql/hostchooser/SingleHostChooser.java
@@ -14,14 +14,15 @@ import java.util.Iterator;
/**
* Host chooser that returns the single host.
*/
-public class SingleHostChooser implements HostChooser {
- private final Collection<HostSpec> hostSpec;
+class SingleHostChooser implements HostChooser {
+ private final Collection<CandidateHost> candidateHost;
- public SingleHostChooser(HostSpec hostSpec) {
- this.hostSpec = Collections.singletonList(hostSpec);
+ SingleHostChooser(HostSpec hostSpec, HostRequirement targetServerType) {
+ this.candidateHost = Collections.singletonList(new CandidateHost(hostSpec, targetServerType));
}
- public Iterator<HostSpec> iterator() {
- return hostSpec.iterator();
+ @Override
+ public Iterator<CandidateHost> iterator() {
+ return candidateHost.iterator();
}
}
diff --git a/pgjdbc/src/main/java/org/postgresql/jdbc/AbstractBlobClob.java b/pgjdbc/src/main/java/org/postgresql/jdbc/AbstractBlobClob.java
index 64cfb7b..90daeaa 100644
--- a/pgjdbc/src/main/java/org/postgresql/jdbc/AbstractBlobClob.java
+++ b/pgjdbc/src/main/java/org/postgresql/jdbc/AbstractBlobClob.java
@@ -165,13 +165,13 @@ public abstract class AbstractBlobClob {
/**
* Iterates over a large object returning byte values. Will buffer the data from the large object.
*/
- private class LOIterator {
+ private class LOIterator {
private static final int BUFFER_SIZE = 8096;
- private byte buffer[] = new byte[BUFFER_SIZE];
+ private byte[] buffer = new byte[BUFFER_SIZE];
private int idx = BUFFER_SIZE;
private int numBytes = BUFFER_SIZE;
- public LOIterator(long start) throws SQLException {
+ LOIterator(long start) throws SQLException {
getLo(false).seek((int) start);
}
diff --git a/pgjdbc/src/main/java/org/postgresql/jdbc/BooleanTypeUtil.java b/pgjdbc/src/main/java/org/postgresql/jdbc/BooleanTypeUtil.java
new file mode 100644
index 0000000..be37a17
--- /dev/null
+++ b/pgjdbc/src/main/java/org/postgresql/jdbc/BooleanTypeUtil.java
@@ -0,0 +1,103 @@
+/*
+ * Copyright (c) 2017, PostgreSQL Global Development Group
+ * See the LICENSE file in the project root for more information.
+ */
+
+package org.postgresql.jdbc;
+
+import org.postgresql.util.GT;
+import org.postgresql.util.PSQLException;
+import org.postgresql.util.PSQLState;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+/**
+ * Helper class to handle boolean type of PostgreSQL.
+ * <p>
+ * Based on values accepted by the PostgreSQL server:
+ * https://www.postgresql.org/docs/current/static/datatype-boolean.html
+ */
+class BooleanTypeUtil {
+
+ private static final Logger LOGGER = Logger.getLogger(BooleanTypeUtil.class.getName());
+
+ private BooleanTypeUtil() {
+ }
+
+ /**
+ * Cast an Object value to the corresponding boolean value.
+ *
+ * @param in Object to cast into boolean
+ * @return boolean value corresponding to the cast of the object
+ * @throws PSQLException PSQLState.CANNOT_COERCE
+ */
+ static boolean castToBoolean(final Object in) throws PSQLException {
+ if (LOGGER.isLoggable(Level.FINE)) {
+ LOGGER.log(Level.FINE, "Cast to boolean: \"{0}\"", String.valueOf(in));
+ }
+ if (in instanceof Boolean) {
+ return (Boolean) in;
+ }
+ if (in instanceof String) {
+ return fromString((String) in);
+ }
+ if (in instanceof Character) {
+ return fromCharacter((Character) in);
+ }
+ if (in instanceof Number) {
+ return fromNumber((Number) in);
+ }
+ throw new PSQLException("Cannot cast to boolean", PSQLState.CANNOT_COERCE);
+ }
+
+ private static boolean fromString(final String strval) throws PSQLException {
+ // Leading or trailing whitespace is ignored, and case does not matter.
+ final String val = strval.trim();
+ if ("1".equals(val) || "true".equalsIgnoreCase(val)
+ || "t".equalsIgnoreCase(val) || "yes".equalsIgnoreCase(val)
+ || "y".equalsIgnoreCase(val) || "on".equalsIgnoreCase(val)) {
+ return true;
+ }
+ if ("0".equals(val) || "false".equalsIgnoreCase(val)
+ || "f".equalsIgnoreCase(val) || "no".equalsIgnoreCase(val)
+ || "n".equalsIgnoreCase(val) || "off".equalsIgnoreCase(val)) {
+ return false;
+ }
+ throw cannotCoerceException(strval);
+ }
+
+ private static boolean fromCharacter(final Character charval) throws PSQLException {
+ if ('1' == charval || 't' == charval || 'T' == charval
+ || 'y' == charval || 'Y' == charval) {
+ return true;
+ }
+ if ('0' == charval || 'f' == charval || 'F' == charval
+ || 'n' == charval || 'N' == charval) {
+ return false;
+ }
+ throw cannotCoerceException(charval);
+ }
+
+ private static boolean fromNumber(final Number numval) throws PSQLException {
+ // Handles BigDecimal, Byte, Short, Integer, Long Float, Double
+ // based on the widening primitive conversions.
+ final double value = numval.doubleValue();
+ if (value == 1.0d) {
+ return true;
+ }
+ if (value == 0.0d) {
+ return false;
+ }
+ throw cannotCoerceException(numval);
+ }
+
+ private static PSQLException cannotCoerceException(final Object value) {
+ if (LOGGER.isLoggable(Level.FINE)) {
+ LOGGER.log(Level.FINE, "Cannot cast to boolean: \"{0}\"", String.valueOf(value));
+ }
+ return new PSQLException(GT.tr("Cannot cast to boolean: \"{0}\"", String.valueOf(value)),
+ PSQLState.CANNOT_COERCE);
+ }
+
+}
diff --git a/pgjdbc/src/main/java/org/postgresql/jdbc/EscapedFunctions.java b/pgjdbc/src/main/java/org/postgresql/jdbc/EscapedFunctions.java
index 0a050aa..c3b6073 100644
--- a/pgjdbc/src/main/java/org/postgresql/jdbc/EscapedFunctions.java
+++ b/pgjdbc/src/main/java/org/postgresql/jdbc/EscapedFunctions.java
@@ -23,47 +23,47 @@ import java.util.Map;
*/
public class EscapedFunctions {
// numeric functions names
- public final static String ABS = "abs";
- public final static String ACOS = "acos";
- public final static String ASIN = "asin";
- public final static String ATAN = "atan";
- public final static String ATAN2 = "atan2";
- public final static String CEILING = "ceiling";
- public final static String COS = "cos";
- public final static String COT = "cot";
- public final static String DEGREES = "degrees";
- public final static String EXP = "exp";
- public final static String FLOOR = "floor";
- public final static String LOG = "log";
- public final static String LOG10 = "log10";
- public final static String MOD = "mod";
- public final static String PI = "pi";
- public final static String POWER = "power";
- public final static String RADIANS = "radians";
- public final static String ROUND = "round";
- public final static String SIGN = "sign";
- public final static String SIN = "sin";
- public final static String SQRT = "sqrt";
- public final static String TAN = "tan";
- public final static String TRUNCATE = "truncate";
+ public static final String ABS = "abs";
+ public static final String ACOS = "acos";
+ public static final String ASIN = "asin";
+ public static final String ATAN = "atan";
+ public static final String ATAN2 = "atan2";
+ public static final String CEILING = "ceiling";
+ public static final String COS = "cos";
+ public static final String COT = "cot";
+ public static final String DEGREES = "degrees";
+ public static final String EXP = "exp";
+ public static final String FLOOR = "floor";
+ public static final String LOG = "log";
+ public static final String LOG10 = "log10";
+ public static final String MOD = "mod";
+ public static final String PI = "pi";
+ public static final String POWER = "power";
+ public static final String RADIANS = "radians";
+ public static final String ROUND = "round";
+ public static final String SIGN = "sign";
+ public static final String SIN = "sin";
+ public static final String SQRT = "sqrt";
+ public static final String TAN = "tan";
+ public static final String TRUNCATE = "truncate";
// string function names
- public final static String ASCII = "ascii";
- public final static String CHAR = "char";
- public final static String CONCAT = "concat";
- public final static String INSERT = "insert"; // change arguments order
- public final static String LCASE = "lcase";
- public final static String LEFT = "left";
- public final static String LENGTH = "length";
- public final static String LOCATE = "locate"; // the 3 args version duplicate args
- public final static String LTRIM = "ltrim";
- public final static String REPEAT = "repeat";
- public final static String REPLACE = "replace";
- public final static String RIGHT = "right"; // duplicate args
- public final static String RTRIM = "rtrim";
- public final static String SPACE = "space";
- public final static String SUBSTRING = "substring";
- public final static String UCASE = "ucase";
+ public static final String ASCII = "ascii";
+ public static final String CHAR = "char";
+ public static final String CONCAT = "concat";
+ public static final String INSERT = "insert"; // change arguments order
+ public static final String LCASE = "lcase";
+ public static final String LEFT = "left";
+ public static final String LENGTH = "length";
+ public static final String LOCATE = "locate"; // the 3 args version duplicate args
+ public static final String LTRIM = "ltrim";
+ public static final String REPEAT = "repeat";
+ public static final String REPLACE = "replace";
+ public static final String RIGHT = "right"; // duplicate args
+ public static final String RTRIM = "rtrim";
+ public static final String SPACE = "space";
+ public static final String SUBSTRING = "substring";
+ public static final String UCASE = "ucase";
// soundex is implemented on the server side by
// the contrib/fuzzystrmatch module. We provide a translation
// for this in the driver, but since we don't want to bother with run
@@ -72,44 +72,44 @@ public class EscapedFunctions {
// difference is currently unsupported entirely.
// date time function names
- public final static String CURDATE = "curdate";
- public final static String CURTIME = "curtime";
- public final static String DAYNAME = "dayname";
- public final static String DAYOFMONTH = "dayofmonth";
- public final static String DAYOFWEEK = "dayofweek";
- public final static String DAYOFYEAR = "dayofyear";
- public final static String HOUR = "hour";
- public final static String MINUTE = "minute";
- public final static String MONTH = "month";
- public final static String MONTHNAME = "monthname";
- public final static String NOW = "now";
- public final static String QUARTER = "quarter";
- public final static String SECOND = "second";
- public final static String WEEK = "week";
- public final static String YEAR = "year";
+ public static final String CURDATE = "curdate";
+ public static final String CURTIME = "curtime";
+ public static final String DAYNAME = "dayname";
+ public static final String DAYOFMONTH = "dayofmonth";
+ public static final String DAYOFWEEK = "dayofweek";
+ public static final String DAYOFYEAR = "dayofyear";
+ public static final String HOUR = "hour";
+ public static final String MINUTE = "minute";
+ public static final String MONTH = "month";
+ public static final String MONTHNAME = "monthname";
+ public static final String NOW = "now";
+ public static final String QUARTER = "quarter";
+ public static final String SECOND = "second";
+ public static final String WEEK = "week";
+ public static final String YEAR = "year";
// for timestampadd and timestampdiff the fractional part of second is not supported
// by the backend
// timestampdiff is very partially supported
- public final static String TIMESTAMPADD = "timestampadd";
- public final static String TIMESTAMPDIFF = "timestampdiff";
+ public static final String TIMESTAMPADD = "timestampadd";
+ public static final String TIMESTAMPDIFF = "timestampdiff";
// constants for timestampadd and timestampdiff
- public final static String SQL_TSI_ROOT = "SQL_TSI_";
- public final static String SQL_TSI_DAY = "DAY";
- public final static String SQL_TSI_FRAC_SECOND = "FRAC_SECOND";
- public final static String SQL_TSI_HOUR = "HOUR";
- public final static String SQL_TSI_MINUTE = "MINUTE";
- public final static String SQL_TSI_MONTH = "MONTH";
- public final static String SQL_TSI_QUARTER = "QUARTER";
- public final static String SQL_TSI_SECOND = "SECOND";
- public final static String SQL_TSI_WEEK = "WEEK";
- public final static String SQL_TSI_YEAR = "YEAR";
+ public static final String SQL_TSI_ROOT = "SQL_TSI_";
+ public static final String SQL_TSI_DAY = "DAY";
+ public static final String SQL_TSI_FRAC_SECOND = "FRAC_SECOND";
+ public static final String SQL_TSI_HOUR = "HOUR";
+ public static final String SQL_TSI_MINUTE = "MINUTE";
+ public static final String SQL_TSI_MONTH = "MONTH";
+ public static final String SQL_TSI_QUARTER = "QUARTER";
+ public static final String SQL_TSI_SECOND = "SECOND";
+ public static final String SQL_TSI_WEEK = "WEEK";
+ public static final String SQL_TSI_YEAR = "YEAR";
// system functions
- public final static String DATABASE = "database";
- public final static String IFNULL = "ifnull";
- public final static String USER = "user";
+ public static final String DATABASE = "database";
+ public static final String IFNULL = "ifnull";
+ public static final String USER = "user";
/**
@@ -635,7 +635,7 @@ public class EscapedFunctions {
return buf.toString();
}
- private final static String constantToInterval(String type, String value) throws SQLException {
+ private static String constantToInterval(String type, String value) throws SQLException {
if (!type.startsWith(SQL_TSI_ROOT)) {
throw new PSQLException(GT.tr("Interval {0} not yet implemented", type),
PSQLState.SYNTAX_ERROR);
diff --git a/pgjdbc/src/main/java/org/postgresql/jdbc/PSQLWarningWrapper.java b/pgjdbc/src/main/java/org/postgresql/jdbc/PSQLWarningWrapper.java
new file mode 100644
index 0000000..a7f0081
--- /dev/null
+++ b/pgjdbc/src/main/java/org/postgresql/jdbc/PSQLWarningWrapper.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2017, PostgreSQL Global Development Group
+ * See the LICENSE file in the project root for more information.
+ */
+
+package org.postgresql.jdbc;
+
+import java.sql.SQLWarning;
+
+/**
+ * Wrapper class for SQLWarnings that provides an optimisation to add
+ * new warnings to the tail of the SQLWarning singly linked list, avoiding Θ(n) insertion time
+ * of calling #setNextWarning on the head. By encapsulating this into a single object it allows
+ * users(ie PgStatement) to atomically set and clear the warning chain.
+ */
+class PSQLWarningWrapper {
+
+ private final SQLWarning firstWarning;
+ private SQLWarning lastWarning;
+
+ PSQLWarningWrapper(SQLWarning warning) {
+ firstWarning = warning;
+ lastWarning = warning;
+ }
+
+ void addWarning(SQLWarning sqlWarning) {
+ lastWarning.setNextWarning(sqlWarning);
+ lastWarning = sqlWarning;
+ }
+
+ SQLWarning getFirstWarning() {
+ return firstWarning;
+ }
+
+}
diff --git a/pgjdbc/src/main/java/org/postgresql/jdbc/PgArray.java b/pgjdbc/src/main/java/org/postgresql/jdbc/PgArray.java
index f902426..3810081 100644
--- a/pgjdbc/src/main/java/org/postgresql/jdbc/PgArray.java
+++ b/pgjdbc/src/main/java/org/postgresql/jdbc/PgArray.java
@@ -10,7 +10,6 @@ import org.postgresql.core.BaseStatement;
import org.postgresql.core.Encoding;
import org.postgresql.core.Field;
import org.postgresql.core.Oid;
-import org.postgresql.core.ServerVersion;
import org.postgresql.jdbc2.ArrayAssistant;
import org.postgresql.jdbc2.ArrayAssistantRegistry;
import org.postgresql.util.ByteConverter;
@@ -26,6 +25,7 @@ import java.sql.Types;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
+import java.util.logging.Level;
/**
* Array is used collect one column of query result data.
@@ -86,11 +86,6 @@ public class PgArray implements java.sql.Array {
private final boolean useObjects;
/**
- * Are we connected to an 8.2 or higher server? Only 8.2 or higher supports null array elements.
- */
- private final boolean haveMinServer82;
-
- /**
* Value of field as {@link PgArrayList}. Will be initialized only once within
* {@link #buildArrayList()}.
*/
@@ -101,8 +96,7 @@ public class PgArray implements java.sql.Array {
private PgArray(BaseConnection connection, int oid) throws SQLException {
this.connection = connection;
this.oid = oid;
- this.useObjects = connection.haveMinimumCompatibleVersion(ServerVersion.v8_3);
- this.haveMinServer82 = connection.haveMinimumServerVersion(ServerVersion.v8_2);
+ this.useObjects = true;
}
/**
@@ -256,6 +250,9 @@ public class PgArray implements java.sql.Array {
Encoding encoding = connection.getEncoding();
arr[i] = encoding.decode(fieldBytes, pos, len);
break;
+ case Oid.BOOL:
+ arr[i] = ByteConverter.bool(fieldBytes, pos);
+ break;
default:
ArrayAssistant arrAssistant = ArrayAssistantRegistry.getAssistant(elementOid);
if (arrAssistant != null) {
@@ -398,6 +395,8 @@ public class PgArray implements java.sql.Array {
case Oid.TEXT:
case Oid.VARCHAR:
return String.class;
+ case Oid.BOOL:
+ return Boolean.class;
default:
ArrayAssistant arrElemBuilder = ArrayAssistantRegistry.getAssistant(oid);
if (arrElemBuilder != null) {
@@ -504,7 +503,7 @@ public class PgArray implements java.sql.Array {
// add element to current array
if (b != null && (!b.isEmpty() || wasInsideString)) {
- curArray.add(!wasInsideString && haveMinServer82 && b.equals("NULL") ? null : b);
+ curArray.add(!wasInsideString && b.equals("NULL") ? null : b);
}
wasInsideString = false;
@@ -584,12 +583,36 @@ public class PgArray implements java.sql.Array {
if (dims > 1 || useObjects) {
oa[length++] = o == null ? null
- : (dims > 1 ? buildArray((PgArrayList) o, 0, -1) : PgResultSet.toBoolean((String) o));
+ : (dims > 1 ? buildArray((PgArrayList) o, 0, -1) : BooleanTypeUtil.castToBoolean((String) o));
} else {
- pa[length++] = o == null ? false : PgResultSet.toBoolean((String) o);
+ pa[length++] = o == null ? false : BooleanTypeUtil.castToBoolean((String) o);
}
}
- } else if (type == Types.SMALLINT || type == Types.INTEGER) {
+ } else if (type == Types.SMALLINT) {
+ short[] pa = null;
+ Object[] oa = null;
+
+ if (dims > 1 || useObjects) {
+ ret =
+ oa = (dims > 1
+ ? (Object[]) java.lang.reflect.Array
+ .newInstance(useObjects ? Short.class : short.class, dimsLength)
+ : new Short[count]);
+ } else {
+ ret = pa = new short[count];
+ }
+
+ for (; count > 0; count--) {
+ Object o = input.get(index++);
+
+ if (dims > 1 || useObjects) {
+ oa[length++] = o == null ? null
+ : (dims > 1 ? buildArray((PgArrayList) o, 0, -1) : PgResultSet.toShort((String) o));
+ } else {
+ pa[length++] = o == null ? 0 : PgResultSet.toShort((String) o);
+ }
+ }
+ } else if (type == Types.INTEGER) {
int[] pa = null;
Object[] oa = null;
@@ -769,9 +792,7 @@ public class PgArray implements java.sql.Array {
ret = oa;
} else {
// other datatypes not currently supported
- if (connection.getLogger().logDebug()) {
- connection.getLogger().debug("getArrayImpl(long,int,Map) with " + getBaseTypeName());
- }
+ connection.getLogger().log(Level.FINEST, "getArrayImpl(long,int,Map) with {0}", getBaseTypeName());
throw org.postgresql.Driver.notImplemented(this.getClass(), "getArrayImpl(long,int,Map)");
}
@@ -884,11 +905,17 @@ public class PgArray implements java.sql.Array {
public String toString() {
if (fieldString == null && fieldBytes != null) {
try {
- Object array = readBinaryArray(1,0);
- java.sql.Array tmpArray = connection.createArrayOf(getBaseTypeName(), (Object[]) array);
- fieldString = tmpArray.toString();
+ Object array = readBinaryArray(1, 0);
+
+ final PrimitiveArraySupport arraySupport = PrimitiveArraySupport.getArraySupport(array);
+ if (arraySupport != null) {
+ fieldString = arraySupport.toArrayString(connection.getTypeInfo().getArrayDelimiter(oid), array);
+ } else {
+ java.sql.Array tmpArray = connection.createArrayOf(getBaseTypeName(), (Object[]) array);
+ fieldString = tmpArray.toString();
+ }
} catch (SQLException e) {
- fieldString = "NULL"; //punt
+ fieldString = "NULL"; // punt
}
}
return fieldString;
diff --git a/pgjdbc/src/main/java/org/postgresql/jdbc/PgCallableStatement.java b/pgjdbc/src/main/java/org/postgresql/jdbc/PgCallableStatement.java
index ba65553..f1a1660 100644
--- a/pgjdbc/src/main/java/org/postgresql/jdbc/PgCallableStatement.java
+++ b/pgjdbc/src/main/java/org/postgresql/jdbc/PgCallableStatement.java
@@ -87,7 +87,11 @@ class PgCallableStatement extends PgPreparedStatement implements CallableStateme
PSQLState.NO_DATA);
}
- ResultSet rs = result.getResultSet();
+ ResultSet rs;
+ synchronized (this) {
+ checkClosed();
+ rs = result.getResultSet();
+ }
if (!rs.next()) {
throw new PSQLException(GT.tr("A CallableStatement was executed with nothing returned."),
PSQLState.NO_DATA);
@@ -146,7 +150,9 @@ class PgCallableStatement extends PgPreparedStatement implements CallableStateme
}
rs.close();
- result = null;
+ synchronized (this) {
+ result = null;
+ }
return false;
}
@@ -691,7 +697,11 @@ class PgCallableStatement extends PgPreparedStatement implements CallableStateme
}
public <T> T getObject(int parameterIndex, Class<T> type) throws SQLException {
- throw Driver.notImplemented(this.getClass(), "getObject(int, Class<T>)");
+ if (type == ResultSet.class) {
+ return type.cast(getObject(parameterIndex));
+ }
+ throw new PSQLException(GT.tr("Unsupported type conversion to {1}.", type),
+ PSQLState.INVALID_PARAMETER_VALUE);
}
public <T> T getObject(String parameterName, Class<T> type) throws SQLException {
@@ -760,7 +770,7 @@ class PgCallableStatement extends PgPreparedStatement implements CallableStateme
throw Driver.notImplemented(this.getClass(), "setString(String,String)");
}
- public void setBytes(String parameterName, byte x[]) throws SQLException {
+ public void setBytes(String parameterName, byte[] x) throws SQLException {
throw Driver.notImplemented(this.getClass(), "setBytes(String,byte)");
}
diff --git a/pgjdbc/src/main/java/org/postgresql/jdbc/PgConnection.java b/pgjdbc/src/main/java/org/postgresql/jdbc/PgConnection.java
index 41720d1..9a0c508 100644
--- a/pgjdbc/src/main/java/org/postgresql/jdbc/PgConnection.java
+++ b/pgjdbc/src/main/java/org/postgresql/jdbc/PgConnection.java
@@ -14,11 +14,11 @@ import org.postgresql.core.BaseStatement;
import org.postgresql.core.CachedQuery;
import org.postgresql.core.ConnectionFactory;
import org.postgresql.core.Encoding;
-import org.postgresql.core.Logger;
import org.postgresql.core.Oid;
import org.postgresql.core.Provider;
import org.postgresql.core.Query;
import org.postgresql.core.QueryExecutor;
+import org.postgresql.core.ReplicationProtocol;
import org.postgresql.core.ResultHandlerBase;
import org.postgresql.core.ServerVersion;
import org.postgresql.core.SqlCommand;
@@ -28,6 +28,8 @@ import org.postgresql.core.Utils;
import org.postgresql.core.Version;
import org.postgresql.fastpath.Fastpath;
import org.postgresql.largeobject.LargeObjectManager;
+import org.postgresql.replication.PGReplicationConnection;
+import org.postgresql.replication.PGReplicationConnectionImpl;
import org.postgresql.util.GT;
import org.postgresql.util.HostSpec;
import org.postgresql.util.LruCache;
@@ -69,22 +71,20 @@ import java.util.TimeZone;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.Executor;
+import java.util.logging.Level;
+import java.util.logging.Logger;
public class PgConnection implements BaseConnection {
+ private static final Logger LOGGER = Logger.getLogger(PgConnection.class.getName());
+
private static final SQLPermission SQL_PERMISSION_ABORT = new SQLPermission("callAbort");
- /**
- * Driver-wide connection ID counter, used for logging
- */
- private static int nextConnectionID = 1;
+ private static final SQLPermission SQL_PERMISSION_NETWORK_TIMEOUT = new SQLPermission("setNetworkTimeout");
//
// Data initialized on construction:
//
-
private final Properties _clientInfo;
- // Per-connection logger
- private final Logger logger;
/* URL we were created via */
private final String creatingURL;
@@ -93,15 +93,13 @@ public class PgConnection implements BaseConnection {
/* Actual network handler */
private final QueryExecutor queryExecutor;
- /* Compatible version as xxyyzz form */
- private final int compatibleInt;
/* Query that runs COMMIT */
private final Query commitQuery;
/* Query that runs ROLLBACK */
private final Query rollbackQuery;
- private TypeInfo _typeCache;
+ private final TypeInfo _typeCache;
private boolean disableColumnSanitiser = false;
@@ -136,6 +134,11 @@ public class PgConnection implements BaseConnection {
private volatile Timer cancelTimer = null;
private PreparedStatement checkConnectionQuery;
+ /**
+ * Replication protocol in current version postgresql(10devel) supports a limited number of
+ * commands.
+ */
+ private final boolean replicationConnection;
private final LruCache<FieldMetadata.Key, FieldMetadata> fieldMetadataCache;
@@ -165,6 +168,7 @@ public class PgConnection implements BaseConnection {
@Override
public void setFlushCacheOnDeallocate(boolean flushCacheOnDeallocate) {
queryExecutor.setFlushCacheOnDeallocate(flushCacheOnDeallocate);
+ LOGGER.log(Level.FINE, " setFlushCacheOnDeallocate = {0}", flushCacheOnDeallocate);
}
//
@@ -175,56 +179,32 @@ public class PgConnection implements BaseConnection {
String database,
Properties info,
String url) throws SQLException {
- this.creatingURL = url;
-
- // Read loglevel arg and set the loglevel based on this value
- // otherwise use the programmatic or init logger level;
- // In addition to setting the log level, enable output to
- // standard out if no other printwriter is set
-
- int logLevel = Driver.getLogLevel();
+ // Print out the driver version number
+ LOGGER.log(Level.FINE, org.postgresql.util.DriverInfo.DRIVER_FULL_NAME);
- String connectionLogLevel = PGProperty.LOG_LEVEL.getSetString(info);
- if (connectionLogLevel != null) {
- try {
- logLevel = Integer.parseInt(connectionLogLevel);
- } catch (NumberFormatException nfe) {
- // ignore
- }
- }
- synchronized (PgConnection.class) {
- logger = new Logger(nextConnectionID++);
- logger.setLogLevel(logLevel);
- }
+ this.creatingURL = url;
setDefaultFetchSize(PGProperty.DEFAULT_ROW_FETCH_SIZE.getInt(info));
- prepareThreshold = PGProperty.PREPARE_THRESHOLD.getInt(info);
+ setPrepareThreshold(PGProperty.PREPARE_THRESHOLD.getInt(info));
if (prepareThreshold == -1) {
- forcebinary = true;
- }
-
- boolean binaryTransfer = PGProperty.BINARY_TRANSFER.getBoolean(info);
-
- // Print out the driver version number
- if (logger.logInfo()) {
- logger.info(Driver.getVersion());
+ setForceBinary(true);
}
// Now make the initial connection and set up local state
- this.queryExecutor =
- ConnectionFactory.openConnection(hostSpecs, user, database, info, logger);
- int compat = Utils.parseServerVersionStr(PGProperty.COMPATIBLE.get(info));
- if (compat == 0) {
- compat = Driver.MAJORVERSION * 10000 + Driver.MINORVERSION * 100;
+ this.queryExecutor = ConnectionFactory.openConnection(hostSpecs, user, database, info);
+
+ // WARNING for unsupported servers (8.1 and lower are not supported)
+ if (LOGGER.isLoggable(Level.WARNING) && !haveMinimumServerVersion(ServerVersion.v8_2)) {
+ LOGGER.log(Level.WARNING, "Unsupported Server Version: {0}", queryExecutor.getServerVersion());
}
- this.compatibleInt = compat;
// Set read-only early if requested
if (PGProperty.READ_ONLY.getBoolean(info)) {
setReadOnly(true);
}
+ boolean binaryTransfer = PGProperty.BINARY_TRANSFER.getBoolean(info);
// Formats that currently have binary protocol support
Set<Integer> binaryOids = new HashSet<Integer>();
if (binaryTransfer && queryExecutor.getProtocolVersion() >= 3) {
@@ -251,25 +231,6 @@ public class PgConnection implements BaseConnection {
binaryOids.add(Oid.BOX);
binaryOids.add(Oid.UUID);
}
- // the pre 8.0 servers do not disclose their internal encoding for
- // time fields so do not try to use them.
- if (!haveMinimumCompatibleVersion(ServerVersion.v8_0)) {
- binaryOids.remove(Oid.TIME);
- binaryOids.remove(Oid.TIMETZ);
- binaryOids.remove(Oid.TIMESTAMP);
- binaryOids.remove(Oid.TIMESTAMPTZ);
- }
- // driver supports only null-compatible arrays
- if (!haveMinimumCompatibleVersion(ServerVersion.v8_3)) {
- binaryOids.remove(Oid.INT2_ARRAY);
- binaryOids.remove(Oid.INT4_ARRAY);
- binaryOids.remove(Oid.INT8_ARRAY);
- binaryOids.remove(Oid.FLOAT4_ARRAY);
- binaryOids.remove(Oid.FLOAT8_ARRAY);
- binaryOids.remove(Oid.FLOAT8_ARRAY);
- binaryOids.remove(Oid.VARCHAR_ARRAY);
- binaryOids.remove(Oid.TEXT_ARRAY);
- }
binaryOids.addAll(getOidSet(PGProperty.BINARY_TRANSFER_ENABLE.get(info)));
binaryOids.removeAll(getOidSet(PGProperty.BINARY_TRANSFER_DISABLE.get(info)));
@@ -290,13 +251,10 @@ public class PgConnection implements BaseConnection {
queryExecutor.setBinaryReceiveOids(useBinaryReceiveForOids);
queryExecutor.setBinarySendOids(useBinarySendForOids);
- if (logger.logDebug()) {
- logger.debug(" compatible = " + compatibleInt);
- logger.debug(" loglevel = " + logLevel);
- logger.debug(" prepare threshold = " + prepareThreshold);
- logger.debug(" types using binary send = " + oidsToString(useBinarySendForOids));
- logger.debug(" types using binary receive = " + oidsToString(useBinaryReceiveForOids));
- logger.debug(" integer date/time = " + queryExecutor.getIntegerDateTimes());
+ if (LOGGER.isLoggable(Level.FINEST)) {
+ LOGGER.log(Level.FINEST, " types using binary send = {0}", oidsToString(useBinarySendForOids));
+ LOGGER.log(Level.FINEST, " types using binary receive = {0}", oidsToString(useBinaryReceiveForOids));
+ LOGGER.log(Level.FINEST, " integer date/time = {0}", queryExecutor.getIntegerDateTimes());
}
//
@@ -315,18 +273,16 @@ public class PgConnection implements BaseConnection {
PSQLState.INVALID_PARAMETER_VALUE);
}
} else {
- bindStringAsVarchar = haveMinimumCompatibleVersion(ServerVersion.v8_0);
+ bindStringAsVarchar = true;
}
// Initialize timestamp stuff
- timestampUtils = new TimestampUtils(haveMinimumServerVersion(ServerVersion.v7_4),
- haveMinimumServerVersion(ServerVersion.v8_2), !queryExecutor.getIntegerDateTimes(),
- new Provider<TimeZone>() {
- @Override
- public TimeZone get() {
- return queryExecutor.getTimeZone();
- }
- });
+ timestampUtils = new TimestampUtils(!queryExecutor.getIntegerDateTimes(), new Provider<TimeZone>() {
+ @Override
+ public TimeZone get() {
+ return queryExecutor.getTimeZone();
+ }
+ });
// Initialize common queries.
// isParameterized==true so full parse is performed and the engine knows the query
@@ -368,6 +324,8 @@ public class PgConnection implements BaseConnection {
Math.max(0, PGProperty.DATABASE_METADATA_CACHE_FIELDS.getInt(info)),
Math.max(0, PGProperty.DATABASE_METADATA_CACHE_FIELDS_MIB.getInt(info) * 1024 * 1024),
false);
+
+ replicationConnection = PGProperty.REPLICATION.get(info) != null;
}
private Set<Integer> getOidSet(String oidList) throws PSQLException {
@@ -430,6 +388,10 @@ public class PgConnection implements BaseConnection {
return queryExecutor;
}
+ public ReplicationProtocol getReplicationProtocol() {
+ return queryExecutor.getReplicationProtocol();
+ }
+
/**
* This adds a warning to the warning chain.
*
@@ -587,8 +549,8 @@ public class PgConnection implements BaseConnection {
PGobject obj = null;
- if (logger.logDebug()) {
- logger.debug("Constructing object from type=" + type + " value=<" + value + ">");
+ if (LOGGER.isLoggable(Level.FINEST)) {
+ LOGGER.log(Level.FINEST, "Constructing object from type={0} value=<{1}>", new Object[]{type, value});
}
try {
@@ -732,13 +694,14 @@ public class PgConnection implements BaseConnection {
PSQLState.ACTIVE_SQL_TRANSACTION);
}
- if (haveMinimumServerVersion(ServerVersion.v7_4) && readOnly != this.readOnly) {
- String readOnlySql =
- "SET SESSION CHARACTERISTICS AS TRANSACTION " + (readOnly ? "READ ONLY" : "READ WRITE");
+ if (readOnly != this.readOnly) {
+ String readOnlySql
+ = "SET SESSION CHARACTERISTICS AS TRANSACTION " + (readOnly ? "READ ONLY" : "READ WRITE");
execSQLUpdate(readOnlySql); // nb: no BEGIN triggered.
}
this.readOnly = readOnly;
+ LOGGER.log(Level.FINE, " setReadOnly = {0}", readOnly);
}
public boolean isReadOnly() throws SQLException {
@@ -758,6 +721,7 @@ public class PgConnection implements BaseConnection {
}
this.autoCommit = autoCommit;
+ LOGGER.log(Level.FINE, " setAutoCommit = {0}", autoCommit);
}
public boolean getAutoCommit() throws SQLException {
@@ -827,52 +791,28 @@ public class PgConnection implements BaseConnection {
checkClosed();
String level = null;
-
- if (haveMinimumServerVersion(ServerVersion.v7_3)) {
- // 7.3+ returns the level as a query result.
- ResultSet rs = execSQLQuery("SHOW TRANSACTION ISOLATION LEVEL"); // nb: no BEGIN triggered
- if (rs.next()) {
- level = rs.getString(1);
- }
- rs.close();
- } else {
- // 7.2 returns the level as an INFO message. Ew.
- // We juggle the warning chains a bit here.
-
- // Swap out current warnings.
- SQLWarning saveWarnings = getWarnings();
- clearWarnings();
-
- // Run the query any examine any resulting warnings.
- execSQLUpdate("SHOW TRANSACTION ISOLATION LEVEL"); // nb: no BEGIN triggered
- SQLWarning warning = getWarnings();
- if (warning != null) {
- level = warning.getMessage();
- }
-
- // Swap original warnings back.
- clearWarnings();
- if (saveWarnings != null) {
- addWarning(saveWarnings);
- }
+ final ResultSet rs = execSQLQuery("SHOW TRANSACTION ISOLATION LEVEL"); // nb: no BEGIN triggered
+ if (rs.next()) {
+ level = rs.getString(1);
}
+ rs.close();
- // XXX revisit: throw exception instead of silently eating the error in unknown cases?
+ // TODO revisit: throw exception instead of silently eating the error in unknown cases?
if (level == null) {
return Connection.TRANSACTION_READ_COMMITTED; // Best guess.
}
level = level.toUpperCase(Locale.US);
- if (level.contains("READ COMMITTED")) {
+ if (level.equals("READ COMMITTED")) {
return Connection.TRANSACTION_READ_COMMITTED;
}
- if (level.contains("READ UNCOMMITTED")) {
+ if (level.equals("READ UNCOMMITTED")) {
return Connection.TRANSACTION_READ_UNCOMMITTED;
}
- if (level.contains("REPEATABLE READ")) {
+ if (level.equals("REPEATABLE READ")) {
return Connection.TRANSACTION_REPEATABLE_READ;
}
- if (level.contains("SERIALIZABLE")) {
+ if (level.equals("SERIALIZABLE")) {
return Connection.TRANSACTION_SERIALIZABLE;
}
@@ -897,22 +837,22 @@ public class PgConnection implements BaseConnection {
String isolationLevelSQL =
"SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL " + isolationLevelName;
execSQLUpdate(isolationLevelSQL); // nb: no BEGIN triggered
+ LOGGER.log(Level.FINE, " setTransactionIsolation = {0}", isolationLevelName);
}
protected String getIsolationLevelName(int level) {
- boolean pg80 = haveMinimumServerVersion(ServerVersion.v8_0);
-
- if (level == Connection.TRANSACTION_READ_COMMITTED) {
- return "READ COMMITTED";
- } else if (level == Connection.TRANSACTION_SERIALIZABLE) {
- return "SERIALIZABLE";
- } else if (pg80 && level == Connection.TRANSACTION_READ_UNCOMMITTED) {
- return "READ UNCOMMITTED";
- } else if (pg80 && level == Connection.TRANSACTION_REPEATABLE_READ) {
- return "REPEATABLE READ";
+ switch (level) {
+ case Connection.TRANSACTION_READ_COMMITTED:
+ return "READ COMMITTED";
+ case Connection.TRANSACTION_SERIALIZABLE:
+ return "SERIALIZABLE";
+ case Connection.TRANSACTION_READ_UNCOMMITTED:
+ return "READ UNCOMMITTED";
+ case Connection.TRANSACTION_REPEATABLE_READ:
+ return "REPEATABLE READ";
+ default:
+ return null;
}
-
- return null;
}
public void setCatalog(String catalog) throws SQLException {
@@ -935,7 +875,7 @@ public class PgConnection implements BaseConnection {
protected void finalize() throws Throwable {
try {
if (openStackTrace != null) {
- logger.log(GT.tr("Finalizing a Connection that was never closed:"), openStackTrace);
+ LOGGER.log(Level.WARNING, GT.tr("Finalizing a Connection that was never closed:"), openStackTrace);
}
close();
@@ -982,43 +922,22 @@ public class PgConnection implements BaseConnection {
}
}
- public boolean haveMinimumServerVersion(String ver) {
- int requiredver = Utils.parseServerVersionStr(ver);
- if (requiredver == 0) {
- /*
- * Failed to parse input version. Fall back on legacy behaviour for BC.
- */
- return (queryExecutor.getServerVersion().compareTo(ver) >= 0);
- } else {
- return haveMinimumServerVersion(requiredver);
- }
- }
-
+ @Override
public boolean haveMinimumServerVersion(int ver) {
return queryExecutor.getServerVersionNum() >= ver;
}
+ @Override
public boolean haveMinimumServerVersion(Version ver) {
return haveMinimumServerVersion(ver.getVersionNum());
}
- public boolean haveMinimumCompatibleVersion(int ver) {
- return compatibleInt >= ver;
- }
-
- public boolean haveMinimumCompatibleVersion(String ver) {
- return haveMinimumCompatibleVersion(ServerVersion.from(ver));
- }
-
- public boolean haveMinimumCompatibleVersion(Version ver) {
- return haveMinimumCompatibleVersion(ver.getVersionNum());
- }
-
-
+ @Override
public Encoding getEncoding() {
return queryExecutor.getEncoding();
}
+ @Override
public byte[] encodeString(String str) throws SQLException {
try {
return getEncoding().encode(str);
@@ -1028,11 +947,13 @@ public class PgConnection implements BaseConnection {
}
}
+ @Override
public String escapeString(String str) throws SQLException {
return Utils.escapeLiteral(null, str, queryExecutor.getStandardConformingStrings())
.toString();
}
+ @Override
public boolean getStandardConformingStrings() {
return queryExecutor.getStandardConformingStrings();
}
@@ -1040,18 +961,26 @@ public class PgConnection implements BaseConnection {
// This is a cache of the DatabaseMetaData instance for this connection
protected java.sql.DatabaseMetaData metadata;
+ @Override
public boolean isClosed() throws SQLException {
return queryExecutor.isClosed();
}
+ @Override
public void cancelQuery() throws SQLException {
checkClosed();
queryExecutor.sendQueryCancel();
}
+ @Override
public PGNotification[] getNotifications() throws SQLException {
+ return getNotifications(-1);
+ }
+
+ @Override
+ public PGNotification[] getNotifications(int timeoutMillis) throws SQLException {
checkClosed();
- getQueryExecutor().processNotifies();
+ getQueryExecutor().processNotifies(timeoutMillis);
// Backwards-compatibility hand-holding.
PGNotification[] notifications = queryExecutor.getNotifications();
return (notifications.length == 0 ? null : notifications);
@@ -1081,6 +1010,7 @@ public class PgConnection implements BaseConnection {
}
this.defaultFetchSize = fetchSize;
+ LOGGER.log(Level.FINE, " setDefaultFetchSize = {0}", fetchSize);
}
public int getDefaultFetchSize() {
@@ -1089,6 +1019,7 @@ public class PgConnection implements BaseConnection {
public void setPrepareThreshold(int newThreshold) {
this.prepareThreshold = newThreshold;
+ LOGGER.log(Level.FINE, " setPrepareThreshold = {0}", newThreshold);
}
public boolean getForceBinary() {
@@ -1097,6 +1028,7 @@ public class PgConnection implements BaseConnection {
public void setForceBinary(boolean newValue) {
this.forcebinary = newValue;
+ LOGGER.log(Level.FINE, " setForceBinary = {0}", newValue);
}
public void setTypeMapImpl(Map<String, Class<?>> map) throws SQLException {
@@ -1104,7 +1036,7 @@ public class PgConnection implements BaseConnection {
}
public Logger getLogger() {
- return logger;
+ return LOGGER;
}
public int getProtocolVersion() {
@@ -1139,6 +1071,7 @@ public class PgConnection implements BaseConnection {
public void setDisableColumnSanitiser(boolean disableColumnSanitiser) {
this.disableColumnSanitiser = disableColumnSanitiser;
+ LOGGER.log(Level.FINE, " setDisableColumnSanitiser = {0}", disableColumnSanitiser);
}
@Override
@@ -1154,6 +1087,7 @@ public class PgConnection implements BaseConnection {
@Override
public void setAutosave(AutoSave autoSave) {
queryExecutor.setAutoSave(autoSave);
+ LOGGER.log(Level.FINE, " setAutosave = {0}", autoSave.value());
}
protected void abort() {
@@ -1174,11 +1108,13 @@ public class PgConnection implements BaseConnection {
}
}
+ @Override
public void addTimerTask(TimerTask timerTask, long milliSeconds) {
Timer timer = getTimer();
timer.schedule(timerTask, milliSeconds);
}
+ @Override
public void purgeTimerTasks() {
Timer timer = cancelTimer;
if (timer != null) {
@@ -1186,10 +1122,12 @@ public class PgConnection implements BaseConnection {
}
}
+ @Override
public String escapeIdentifier(String identifier) throws SQLException {
return Utils.escapeIdentifier(null, identifier).toString();
}
+ @Override
public String escapeLiteral(String literal) throws SQLException {
return Utils.escapeLiteral(null, literal, queryExecutor.getStandardConformingStrings())
.toString();
@@ -1200,6 +1138,11 @@ public class PgConnection implements BaseConnection {
return fieldMetadataCache;
}
+ @Override
+ public PGReplicationConnection getReplicationAPI() {
+ return new PGReplicationConnectionImpl(this);
+ }
+
private static void appendArray(StringBuilder sb, Object elements, char delim) {
sb.append('{');
@@ -1213,7 +1156,12 @@ public class PgConnection implements BaseConnection {
if (o == null) {
sb.append("NULL");
} else if (o.getClass().isArray()) {
- appendArray(sb, o, delim);
+ final PrimitiveArraySupport arraySupport = PrimitiveArraySupport.getArraySupport(o);
+ if (arraySupport != null) {
+ arraySupport.appendArray(sb, delim, o);
+ } else {
+ appendArray(sb, o, delim);
+ }
} else {
String s = o.toString();
PgArray.escapeArrayElement(sb, s);
@@ -1244,12 +1192,14 @@ public class PgConnection implements BaseConnection {
return Integer.parseInt(dirtyString.substring(start, end));
}
+ @Override
public Statement createStatement(int resultSetType, int resultSetConcurrency,
int resultSetHoldability) throws SQLException {
checkClosed();
return new PgStatement(this, resultSetType, resultSetConcurrency, resultSetHoldability);
}
+ @Override
public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency,
int resultSetHoldability) throws SQLException {
checkClosed();
@@ -1257,6 +1207,7 @@ public class PgConnection implements BaseConnection {
resultSetHoldability);
}
+ @Override
public CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency,
int resultSetHoldability) throws SQLException {
checkClosed();
@@ -1264,6 +1215,7 @@ public class PgConnection implements BaseConnection {
resultSetHoldability);
}
+ @Override
public DatabaseMetaData getMetaData() throws SQLException {
checkClosed();
if (metadata == null) {
@@ -1272,8 +1224,10 @@ public class PgConnection implements BaseConnection {
return metadata;
}
+ @Override
public void setTypeMap(Map<String, Class<?>> map) throws SQLException {
setTypeMapImpl(map);
+ LOGGER.log(Level.FINE, " setTypeMap = {0}", map);
}
protected Array makeArray(int oid, String fieldString) throws SQLException {
@@ -1292,31 +1246,80 @@ public class PgConnection implements BaseConnection {
return new PgSQLXML(this);
}
+ @Override
public Clob createClob() throws SQLException {
checkClosed();
throw org.postgresql.Driver.notImplemented(this.getClass(), "createClob()");
}
+ @Override
public Blob createBlob() throws SQLException {
checkClosed();
throw org.postgresql.Driver.notImplemented(this.getClass(), "createBlob()");
}
+ @Override
public NClob createNClob() throws SQLException {
checkClosed();
throw org.postgresql.Driver.notImplemented(this.getClass(), "createNClob()");
}
+ @Override
public SQLXML createSQLXML() throws SQLException {
checkClosed();
return makeSQLXML();
}
+ @Override
public Struct createStruct(String typeName, Object[] attributes) throws SQLException {
checkClosed();
throw org.postgresql.Driver.notImplemented(this.getClass(), "createStruct(String, Object[])");
}
+ @Override
+ public Array createArrayOf(String typeName, Object elements) throws SQLException {
+ checkClosed();
+
+ final TypeInfo typeInfo = getTypeInfo();
+
+ final int oid = typeInfo.getPGArrayType(typeName);
+ final char delim = typeInfo.getArrayDelimiter(oid);
+
+ if (oid == Oid.UNSPECIFIED) {
+ throw new PSQLException(GT.tr("Unable to find server array type for provided name {0}.", typeName),
+ PSQLState.INVALID_NAME);
+ }
+
+ if (elements == null) {
+ return makeArray(oid, null);
+ }
+
+ final String arrayString;
+
+ final PrimitiveArraySupport arraySupport = PrimitiveArraySupport.getArraySupport(elements);
+
+ if (arraySupport != null) {
+ // if the oid for the given type matches the default type, we might be
+ // able to go straight to binary representation
+ if (oid == arraySupport.getDefaultArrayTypeOid(typeInfo) && arraySupport.supportBinaryRepresentation()
+ && getPreferQueryMode() != PreferQueryMode.SIMPLE) {
+ return new PgArray(this, oid, arraySupport.toBinaryRepresentation(this, elements));
+ }
+ arrayString = arraySupport.toArrayString(delim, elements);
+ } else {
+ final Class<?> clazz = elements.getClass();
+ if (!clazz.isArray()) {
+ throw new PSQLException(GT.tr("Invalid elements {0}", elements), PSQLState.INVALID_PARAMETER_TYPE);
+ }
+ StringBuilder sb = new StringBuilder();
+ appendArray(sb, elements, delim);
+ arrayString = sb.toString();
+ }
+
+ return makeArray(oid, arrayString);
+ }
+
+ @Override
public Array createArrayOf(String typeName, Object[] elements) throws SQLException {
checkClosed();
@@ -1328,6 +1331,10 @@ public class PgConnection implements BaseConnection {
PSQLState.INVALID_NAME);
}
+ if (elements == null) {
+ return makeArray(oid, null);
+ }
+
char delim = getTypeInfo().getArrayDelimiter(oid);
StringBuilder sb = new StringBuilder();
appendArray(sb, elements, delim);
@@ -1335,6 +1342,7 @@ public class PgConnection implements BaseConnection {
return makeArray(oid, sb.toString());
}
+ @Override
public boolean isValid(int timeout) throws SQLException {
if (timeout < 0) {
throw new PSQLException(GT.tr("Invalid timeout ({0}<0).", timeout),
@@ -1344,22 +1352,29 @@ public class PgConnection implements BaseConnection {
return false;
}
try {
- if (checkConnectionQuery == null) {
- checkConnectionQuery = prepareStatement("");
+ if (replicationConnection) {
+ Statement statement = createStatement();
+ statement.execute("IDENTIFY_SYSTEM");
+ statement.close();
+ } else {
+ if (checkConnectionQuery == null) {
+ checkConnectionQuery = prepareStatement("");
+ }
+ checkConnectionQuery.setQueryTimeout(timeout);
+ checkConnectionQuery.executeUpdate();
}
- checkConnectionQuery.setQueryTimeout(timeout);
- checkConnectionQuery.executeUpdate();
return true;
} catch (SQLException e) {
if (PSQLState.IN_FAILED_SQL_TRANSACTION.getState().equals(e.getSQLState())) {
// "current transaction aborted", assume the connection is up and running
return true;
}
- getLogger().log(GT.tr("Validating connection."), e);
+ LOGGER.log(Level.WARNING, GT.tr("Validating connection."), e);
}
return false;
}
+ @Override
public void setClientInfo(String name, String value) throws SQLClientInfoException {
try {
checkClosed();
@@ -1390,7 +1405,9 @@ public class PgConnection implements BaseConnection {
GT.tr("Failed to set ClientInfo property: {0}", "ApplicationName"), sqle.getSQLState(),
failures, sqle);
}
-
+ if (LOGGER.isLoggable(Level.FINE)) {
+ LOGGER.log(Level.FINE, " setClientInfo = {0} {1}", new Object[]{name, value});
+ }
_clientInfo.put(name, value);
return;
}
@@ -1399,6 +1416,7 @@ public class PgConnection implements BaseConnection {
PSQLState.NOT_IMPLEMENTED.getState()));
}
+ @Override
public void setClientInfo(Properties properties) throws SQLClientInfoException {
try {
checkClosed();
@@ -1425,12 +1443,14 @@ public class PgConnection implements BaseConnection {
}
}
+ @Override
public String getClientInfo(String name) throws SQLException {
checkClosed();
_clientInfo.put("ApplicationName", queryExecutor.getApplicationName());
return _clientInfo.getProperty(name);
}
+ @Override
public Properties getClientInfo() throws SQLException {
checkClosed();
_clientInfo.put("ApplicationName", queryExecutor.getApplicationName());
@@ -1485,6 +1505,7 @@ public class PgConnection implements BaseConnection {
Utils.escapeLiteral(sb, schema, getStandardConformingStrings());
sb.append("'");
stmt.executeUpdate(sb.toString());
+ LOGGER.log(Level.FINE, " setSchema = {0}", schema);
}
} finally {
stmt.close();
@@ -1512,14 +1533,39 @@ public class PgConnection implements BaseConnection {
}
}
- public void setNetworkTimeout(Executor executor, int milliseconds) throws SQLException {
- throw org.postgresql.Driver.notImplemented(this.getClass(), "setNetworkTimeout(Executor, int)");
+ public void setNetworkTimeout(Executor executor /*not used*/, int milliseconds) throws SQLException {
+ checkClosed();
+
+ if (milliseconds < 0) {
+ throw new PSQLException(GT.tr("Network timeout must be a value greater than or equal to 0."),
+ PSQLState.INVALID_PARAMETER_VALUE);
+ }
+
+ SecurityManager securityManager = System.getSecurityManager();
+ if (securityManager != null) {
+ securityManager.checkPermission(SQL_PERMISSION_NETWORK_TIMEOUT);
+ }
+
+ try {
+ queryExecutor.setNetworkTimeout(milliseconds);
+ } catch (IOException ioe) {
+ throw new PSQLException(GT.tr("Unable to set network timeout."),
+ PSQLState.COMMUNICATION_ERROR, ioe);
+ }
}
public int getNetworkTimeout() throws SQLException {
- throw org.postgresql.Driver.notImplemented(this.getClass(), "getNetworkTimeout()");
+ checkClosed();
+
+ try {
+ return queryExecutor.getNetworkTimeout();
+ } catch (IOException ioe) {
+ throw new PSQLException(GT.tr("Unable to get network timeout."),
+ PSQLState.COMMUNICATION_ERROR, ioe);
+ }
}
+ @Override
public void setHoldability(int holdability) throws SQLException {
checkClosed();
@@ -1534,20 +1580,20 @@ public class PgConnection implements BaseConnection {
throw new PSQLException(GT.tr("Unknown ResultSet holdability setting: {0}.", holdability),
PSQLState.INVALID_PARAMETER_VALUE);
}
+ LOGGER.log(Level.FINE, " setHoldability = {0}", holdability);
}
+ @Override
public int getHoldability() throws SQLException {
checkClosed();
return rsHoldability;
}
+ @Override
public Savepoint setSavepoint() throws SQLException {
- String pgName;
checkClosed();
- if (!haveMinimumServerVersion(ServerVersion.v8_0)) {
- throw new PSQLException(GT.tr("Server versions prior to 8.0 do not support savepoints."),
- PSQLState.NOT_IMPLEMENTED);
- }
+
+ String pgName;
if (getAutoCommit()) {
throw new PSQLException(GT.tr("Cannot establish a savepoint in auto-commit mode."),
PSQLState.NO_ACTIVE_SQL_TRANSACTION);
@@ -1565,12 +1611,10 @@ public class PgConnection implements BaseConnection {
return savepoint;
}
+ @Override
public Savepoint setSavepoint(String name) throws SQLException {
checkClosed();
- if (!haveMinimumServerVersion(ServerVersion.v8_0)) {
- throw new PSQLException(GT.tr("Server versions prior to 8.0 do not support savepoints."),
- PSQLState.NOT_IMPLEMENTED);
- }
+
if (getAutoCommit()) {
throw new PSQLException(GT.tr("Cannot establish a savepoint in auto-commit mode."),
PSQLState.NO_ACTIVE_SQL_TRANSACTION);
@@ -1587,23 +1631,17 @@ public class PgConnection implements BaseConnection {
return savepoint;
}
+ @Override
public void rollback(Savepoint savepoint) throws SQLException {
checkClosed();
- if (!haveMinimumServerVersion(ServerVersion.v8_0)) {
- throw new PSQLException(GT.tr("Server versions prior to 8.0 do not support savepoints."),
- PSQLState.NOT_IMPLEMENTED);
- }
PSQLSavepoint pgSavepoint = (PSQLSavepoint) savepoint;
execSQLUpdate("ROLLBACK TO SAVEPOINT " + pgSavepoint.getPGName());
}
+ @Override
public void releaseSavepoint(Savepoint savepoint) throws SQLException {
checkClosed();
- if (!haveMinimumServerVersion(ServerVersion.v8_0)) {
- throw new PSQLException(GT.tr("Server versions prior to 8.0 do not support savepoints."),
- PSQLState.NOT_IMPLEMENTED);
- }
PSQLSavepoint pgSavepoint = (PSQLSavepoint) savepoint;
execSQLUpdate("RELEASE SAVEPOINT " + pgSavepoint.getPGName());
@@ -1628,6 +1666,7 @@ public class PgConnection implements BaseConnection {
return prepareCall(sql, resultSetType, resultSetConcurrency, getHoldability());
}
+ @Override
public PreparedStatement prepareStatement(String sql, int autoGeneratedKeys) throws SQLException {
if (autoGeneratedKeys != Statement.RETURN_GENERATED_KEYS) {
return prepareStatement(sql);
@@ -1636,7 +1675,8 @@ public class PgConnection implements BaseConnection {
return prepareStatement(sql, (String[]) null);
}
- public PreparedStatement prepareStatement(String sql, int columnIndexes[]) throws SQLException {
+ @Override
+ public PreparedStatement prepareStatement(String sql, int[] columnIndexes) throws SQLException {
if (columnIndexes != null && columnIndexes.length == 0) {
return prepareStatement(sql);
}
@@ -1646,7 +1686,7 @@ public class PgConnection implements BaseConnection {
PSQLState.NOT_IMPLEMENTED);
}
- public PreparedStatement prepareStatement(String sql, String columnNames[]) throws SQLException {
+ public PreparedStatement prepareStatement(String sql, String[] columnNames) throws SQLException {
if (columnNames != null && columnNames.length == 0) {
return prepareStatement(sql);
}
diff --git a/pgjdbc/src/main/java/org/postgresql/jdbc/PgDatabaseMetaData.java b/pgjdbc/src/main/java/org/postgresql/jdbc/PgDatabaseMetaData.java
index 80f41ec..b7063db 100644
--- a/pgjdbc/src/main/java/org/postgresql/jdbc/PgDatabaseMetaData.java
+++ b/pgjdbc/src/main/java/org/postgresql/jdbc/PgDatabaseMetaData.java
@@ -5,7 +5,6 @@
package org.postgresql.jdbc;
-import org.postgresql.Driver;
import org.postgresql.core.BaseStatement;
import org.postgresql.core.Field;
import org.postgresql.core.Oid;
@@ -24,6 +23,7 @@ import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
@@ -36,15 +36,7 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
this.connection = conn;
}
-
- private static final String keywords = "abort,acl,add,aggregate,append,archive,"
- + "arch_store,backward,binary,boolean,change,cluster,"
- + "copy,database,delimiter,delimiters,do,extend,"
- + "explain,forward,heavy,index,inherits,isnull,"
- + "light,listen,load,merge,nothing,notify,"
- + "notnull,oids,purge,rename,replace,retrieve,"
- + "returns,rule,recipe,setof,stdin,stdout,store,"
- + "vacuum,verbose,version";
+ private String keywords;
protected final PgConnection connection; // The connection association
@@ -54,19 +46,8 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
protected int getMaxIndexKeys() throws SQLException {
if (INDEX_MAX_KEYS == 0) {
String sql;
- if (connection.haveMinimumServerVersion(ServerVersion.v8_0)) {
- sql = "SELECT setting FROM pg_catalog.pg_settings WHERE name='max_index_keys'";
- } else {
- String from;
- if (connection.haveMinimumServerVersion(ServerVersion.v7_3)) {
- from =
- "pg_catalog.pg_namespace n, pg_catalog.pg_type t1, pg_catalog.pg_type t2 WHERE t1.typnamespace=n.oid AND n.nspname='pg_catalog' AND ";
- } else {
- from = "pg_type t1, pg_type t2 WHERE ";
- }
- sql = "SELECT t1.typlen/t2.typlen FROM " + from
- + " t1.typelem=t2.oid AND t1.typname='oidvector'";
- }
+ sql = "SELECT setting FROM pg_catalog.pg_settings WHERE name='max_index_keys'";
+
Statement stmt = connection.createStatement();
ResultSet rs = null;
try {
@@ -90,12 +71,9 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
protected int getMaxNameLength() throws SQLException {
if (NAMEDATALEN == 0) {
String sql;
- if (connection.haveMinimumServerVersion(ServerVersion.v7_3)) {
- sql =
- "SELECT t.typlen FROM pg_catalog.pg_type t, pg_catalog.pg_namespace n WHERE t.typnamespace=n.oid AND t.typname='name' AND n.nspname='pg_catalog'";
- } else {
- sql = "SELECT typlen FROM pg_type WHERE typname='name'";
- }
+ sql = "SELECT t.typlen FROM pg_catalog.pg_type t, pg_catalog.pg_namespace n "
+ + "WHERE t.typnamespace=n.oid AND t.typname='name' AND n.nspname='pg_catalog'";
+
Statement stmt = connection.createStatement();
ResultSet rs = null;
try {
@@ -135,7 +113,7 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
}
public boolean nullsAreSortedHigh() throws SQLException {
- return connection.haveMinimumServerVersion(ServerVersion.v7_2);
+ return true;
}
public boolean nullsAreSortedLow() throws SQLException {
@@ -147,39 +125,43 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
}
public boolean nullsAreSortedAtEnd() throws SQLException {
- return !connection.haveMinimumServerVersion(ServerVersion.v7_2);
+ return false;
}
/**
- * What is the name of this database product - we hope that it is PostgreSQL, so we return that
+ * Retrieves the name of this database product. We hope that it is PostgreSQL, so we return that
* explicitly.
*
- * @return the database product name
- *
- * @exception SQLException if a database access error occurs
+ * @return "PostgreSQL"
*/
+ @Override
public String getDatabaseProductName() throws SQLException {
return "PostgreSQL";
}
+ @Override
public String getDatabaseProductVersion() throws SQLException {
return connection.getDBVersionNumber();
}
- public String getDriverName() throws SQLException {
- return "PostgreSQL Native Driver";
+ @Override
+ public String getDriverName() {
+ return org.postgresql.util.DriverInfo.DRIVER_NAME;
}
- public String getDriverVersion() throws SQLException {
- return Driver.getVersion();
+ @Override
+ public String getDriverVersion() {
+ return org.postgresql.util.DriverInfo.DRIVER_VERSION;
}
+ @Override
public int getDriverMajorVersion() {
- return Driver.MAJORVERSION;
+ return org.postgresql.util.DriverInfo.MAJOR_VERSION;
}
+ @Override
public int getDriverMinorVersion() {
- return Driver.MINORVERSION;
+ return org.postgresql.util.DriverInfo.MINOR_VERSION;
}
/**
@@ -263,18 +245,102 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
* {@inheritDoc}
*
* <p>
- * Within PostgreSQL, the keywords are found in src/backend/parser/keywords.c
- *
- * <p>
- * For SQL Keywords, I took the list provided at
- * <a href="http://web.dementia.org/~shadow/sql/sql3bnf.sep93.txt"> http://web.dementia.org/~
- * shadow/sql/sql3bnf.sep93.txt</a> which is for SQL3, not SQL-92, but it is close enough for this
- * purpose.
+ * From PostgreSQL 9.0+ return the keywords from pg_catalog.pg_get_keywords()
*
* @return a comma separated list of keywords we use
* @throws SQLException if a database access error occurs
*/
+ @Override
public String getSQLKeywords() throws SQLException {
+ connection.checkClosed();
+ if (keywords == null) {
+ if (connection.haveMinimumServerVersion(ServerVersion.v9_0)) {
+ // Exclude SQL:2003 keywords (https://github.com/ronsavage/SQL/blob/master/sql-2003-2.bnf)
+ // from the returned list, ugly but required by jdbc spec.
+ String sql = "select string_agg(word, ',') from pg_catalog.pg_get_keywords() "
+ + "where word <> ALL ('{a,abs,absolute,action,ada,add,admin,after,all,allocate,alter,"
+ + "always,and,any,are,array,as,asc,asensitive,assertion,assignment,asymmetric,at,atomic,"
+ + "attribute,attributes,authorization,avg,before,begin,bernoulli,between,bigint,binary,"
+ + "blob,boolean,both,breadth,by,c,call,called,cardinality,cascade,cascaded,case,cast,"
+ + "catalog,catalog_name,ceil,ceiling,chain,char,char_length,character,character_length,"
+ + "character_set_catalog,character_set_name,character_set_schema,characteristics,"
+ + "characters,check,checked,class_origin,clob,close,coalesce,cobol,code_units,collate,"
+ + "collation,collation_catalog,collation_name,collation_schema,collect,column,"
+ + "column_name,command_function,command_function_code,commit,committed,condition,"
+ + "condition_number,connect,connection_name,constraint,constraint_catalog,constraint_name,"
+ + "constraint_schema,constraints,constructors,contains,continue,convert,corr,"
+ + "corresponding,count,covar_pop,covar_samp,create,cross,cube,cume_dist,current,"
+ + "current_collation,current_date,current_default_transform_group,current_path,"
+ + "current_role,current_time,current_timestamp,current_transform_group_for_type,current_user,"
+ + "cursor,cursor_name,cycle,data,date,datetime_interval_code,datetime_interval_precision,"
+ + "day,deallocate,dec,decimal,declare,default,defaults,deferrable,deferred,defined,definer,"
+ + "degree,delete,dense_rank,depth,deref,derived,desc,describe,descriptor,deterministic,"
+ + "diagnostics,disconnect,dispatch,distinct,domain,double,drop,dynamic,dynamic_function,"
+ + "dynamic_function_code,each,element,else,end,end-exec,equals,escape,every,except,"
+ + "exception,exclude,excluding,exec,execute,exists,exp,external,extract,false,fetch,filter,"
+ + "final,first,float,floor,following,for,foreign,fortran,found,free,from,full,function,"
+ + "fusion,g,general,get,global,go,goto,grant,granted,group,grouping,having,hierarchy,hold,"
+ + "hour,identity,immediate,implementation,in,including,increment,indicator,initially,"
+ + "inner,inout,input,insensitive,insert,instance,instantiable,int,integer,intersect,"
+ + "intersection,interval,into,invoker,is,isolation,join,k,key,key_member,key_type,language,"
+ + "large,last,lateral,leading,left,length,level,like,ln,local,localtime,localtimestamp,"
+ + "locator,lower,m,map,match,matched,max,maxvalue,member,merge,message_length,"
+ + "message_octet_length,message_text,method,min,minute,minvalue,mod,modifies,module,month,"
+ + "more,multiset,mumps,name,names,national,natural,nchar,nclob,nesting,new,next,no,none,"
+ + "normalize,normalized,not,\"null\",nullable,nullif,nulls,number,numeric,object,"
+ + "octet_length,octets,of,old,on,only,open,option,options,or,order,ordering,ordinality,"
+ + "others,out,outer,output,over,overlaps,overlay,overriding,pad,parameter,parameter_mode,"
+ + "parameter_name,parameter_ordinal_position,parameter_specific_catalog,"
+ + "parameter_specific_name,parameter_specific_schema,partial,partition,pascal,path,"
+ + "percent_rank,percentile_cont,percentile_disc,placing,pli,position,power,preceding,"
+ + "precision,prepare,preserve,primary,prior,privileges,procedure,public,range,rank,read,"
+ + "reads,real,recursive,ref,references,referencing,regr_avgx,regr_avgy,regr_count,"
+ + "regr_intercept,regr_r2,regr_slope,regr_sxx,regr_sxy,regr_syy,relative,release,"
+ + "repeatable,restart,result,return,returned_cardinality,returned_length,"
+ + "returned_octet_length,returned_sqlstate,returns,revoke,right,role,rollback,rollup,"
+ + "routine,routine_catalog,routine_name,routine_schema,row,row_count,row_number,rows,"
+ + "savepoint,scale,schema,schema_name,scope_catalog,scope_name,scope_schema,scroll,"
+ + "search,second,section,security,select,self,sensitive,sequence,serializable,server_name,"
+ + "session,session_user,set,sets,similar,simple,size,smallint,some,source,space,specific,"
+ + "specific_name,specifictype,sql,sqlexception,sqlstate,sqlwarning,sqrt,start,state,"
+ + "statement,static,stddev_pop,stddev_samp,structure,style,subclass_origin,submultiset,"
+ + "substring,sum,symmetric,system,system_user,table,table_name,tablesample,temporary,then,"
+ + "ties,time,timestamp,timezone_hour,timezone_minute,to,top_level_count,trailing,"
+ + "transaction,transaction_active,transactions_committed,transactions_rolled_back,"
+ + "transform,transforms,translate,translation,treat,trigger,trigger_catalog,trigger_name,"
+ + "trigger_schema,trim,true,type,uescape,unbounded,uncommitted,under,union,unique,unknown,"
+ + "unnamed,unnest,update,upper,usage,user,user_defined_type_catalog,user_defined_type_code,"
+ + "user_defined_type_name,user_defined_type_schema,using,value,values,var_pop,var_samp,"
+ + "varchar,varying,view,when,whenever,where,width_bucket,window,with,within,without,work,"
+ + "write,year,zone}'::text[])";
+
+ Statement stmt = null;
+ ResultSet rs = null;
+ try {
+ stmt = connection.createStatement();
+ rs = stmt.executeQuery(sql);
+ if (!rs.next()) {
+ throw new PSQLException(GT.tr("Unable to find keywords in the system catalogs."),
+ PSQLState.UNEXPECTED_ERROR);
+ }
+ keywords = rs.getString(1);
+ } finally {
+ JdbcBlackHole.close(rs);
+ JdbcBlackHole.close(stmt);
+ }
+ } else {
+ // Static list from PG8.2 src/backend/parser/keywords.c with SQL:2003 excluded.
+ keywords = "abort,access,aggregate,also,analyse,analyze,backward,bit,cache,checkpoint,class,"
+ + "cluster,comment,concurrently,connection,conversion,copy,csv,database,delimiter,"
+ + "delimiters,disable,do,enable,encoding,encrypted,exclusive,explain,force,forward,freeze,"
+ + "greatest,handler,header,if,ilike,immutable,implicit,index,indexes,inherit,inherits,"
+ + "instead,isnull,least,limit,listen,load,location,lock,mode,move,nothing,notify,notnull,"
+ + "nowait,off,offset,oids,operator,owned,owner,password,prepared,procedural,quote,reassign,"
+ + "recheck,reindex,rename,replace,reset,restrict,returning,rule,setof,share,show,stable,"
+ + "statistics,stdin,stdout,storage,strict,sysid,tablespace,temp,template,truncate,trusted,"
+ + "unencrypted,unlisten,until,vacuum,valid,validator,verbose,volatile";
+ }
+ }
return keywords;
}
@@ -304,20 +370,13 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
// ','+EscapedFunctions.INSERT+','+EscapedFunctions.LOCATE+
// ','+EscapedFunctions.RIGHT+
- if (connection.haveMinimumServerVersion(ServerVersion.v7_3)) {
- funcs += ',' + EscapedFunctions.REPLACE;
- }
+ funcs += ',' + EscapedFunctions.REPLACE;
return funcs;
}
public String getSystemFunctions() throws SQLException {
- if (connection.haveMinimumServerVersion(ServerVersion.v7_3)) {
- return EscapedFunctions.DATABASE + ',' + EscapedFunctions.IFNULL + ','
- + EscapedFunctions.USER;
- } else {
- return EscapedFunctions.IFNULL + ',' + EscapedFunctions.USER;
- }
+ return EscapedFunctions.DATABASE + ',' + EscapedFunctions.IFNULL + ',' + EscapedFunctions.USER;
}
public String getTimeDateFunctions() throws SQLException {
@@ -328,9 +387,7 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
+ EscapedFunctions.MONTHNAME + ',' + EscapedFunctions.NOW + ',' + EscapedFunctions.QUARTER
+ ',' + EscapedFunctions.SECOND + ',' + EscapedFunctions.WEEK + ',' + EscapedFunctions.YEAR;
- if (connection.haveMinimumServerVersion(ServerVersion.v8_0)) {
- timeDateFuncs += ',' + EscapedFunctions.TIMESTAMPADD;
- }
+ timeDateFuncs += ',' + EscapedFunctions.TIMESTAMPADD;
// +','+EscapedFunctions.TIMESTAMPDIFF;
@@ -384,7 +441,7 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
* @return true if connected to PostgreSQL 7.3+
*/
public boolean supportsAlterTableWithDropColumn() throws SQLException {
- return connection.haveMinimumServerVersion(ServerVersion.v7_3);
+ return true;
}
public boolean supportsColumnAliasing() throws SQLException {
@@ -421,7 +478,7 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
* @return true if connected to PostgreSQL 6.4+
*/
public boolean supportsOrderByUnrelated() throws SQLException {
- return connection.haveMinimumServerVersion(ServerVersion.v6_4);
+ return true;
}
public boolean supportsGroupBy() throws SQLException {
@@ -434,7 +491,7 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
* @return true if connected to PostgreSQL 6.4+
*/
public boolean supportsGroupByUnrelated() throws SQLException {
- return connection.haveMinimumServerVersion(ServerVersion.v6_4);
+ return true;
}
/*
@@ -443,7 +500,7 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
* @return true if connected to PostgreSQL 6.4+
*/
public boolean supportsGroupByBeyondSelect() throws SQLException {
- return connection.haveMinimumServerVersion(ServerVersion.v6_4);
+ return true;
}
/*
@@ -452,7 +509,7 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
* @return true if connected to PostgreSQL 7.1+
*/
public boolean supportsLikeEscapeClause() throws SQLException {
- return connection.haveMinimumServerVersion(ServerVersion.v7_1);
+ return true;
}
public boolean supportsMultipleResultSets() throws SQLException {
@@ -517,7 +574,7 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
* @throws SQLException if a database access error occurs
*/
public boolean supportsANSI92EntryLevelSQL() throws SQLException {
- return connection.haveMinimumServerVersion(ServerVersion.v7_3);
+ return true;
}
/**
@@ -556,7 +613,7 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
* @return true if connected to PostgreSQL 7.1+
*/
public boolean supportsOuterJoins() throws SQLException {
- return connection.haveMinimumServerVersion(ServerVersion.v7_1);
+ return true;
}
/**
@@ -565,7 +622,7 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
* @return true if connected to PostgreSQL 7.1+
*/
public boolean supportsFullOuterJoins() throws SQLException {
- return connection.haveMinimumServerVersion(ServerVersion.v7_1);
+ return true;
}
/**
@@ -574,7 +631,7 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
* @return true if connected to PostgreSQL 7.1+
*/
public boolean supportsLimitedOuterJoins() throws SQLException {
- return connection.haveMinimumServerVersion(ServerVersion.v7_1);
+ return true;
}
/**
@@ -620,7 +677,7 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
* @return true if connected to PostgreSQL 7.3+
*/
public boolean supportsSchemasInDataManipulation() throws SQLException {
- return connection.haveMinimumServerVersion(ServerVersion.v7_3);
+ return true;
}
/**
@@ -629,7 +686,7 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
* @return true if connected to PostgreSQL 7.3+
*/
public boolean supportsSchemasInProcedureCalls() throws SQLException {
- return connection.haveMinimumServerVersion(ServerVersion.v7_3);
+ return true;
}
/**
@@ -638,7 +695,7 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
* @return true if connected to PostgreSQL 7.3+
*/
public boolean supportsSchemasInTableDefinitions() throws SQLException {
- return connection.haveMinimumServerVersion(ServerVersion.v7_3);
+ return true;
}
/**
@@ -647,7 +704,7 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
* @return true if connected to PostgreSQL 7.3+
*/
public boolean supportsSchemasInIndexDefinitions() throws SQLException {
- return connection.haveMinimumServerVersion(ServerVersion.v7_3);
+ return true;
}
/**
@@ -656,7 +713,7 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
* @return true if connected to PostgreSQL 7.3+
*/
public boolean supportsSchemasInPrivilegeDefinitions() throws SQLException {
- return connection.haveMinimumServerVersion(ServerVersion.v7_3);
+ return true;
}
public boolean supportsCatalogsInDataManipulation() throws SQLException {
@@ -699,7 +756,7 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
* @return true if connected to PostgreSQL 6.5+
*/
public boolean supportsSelectForUpdate() throws SQLException {
- return connection.haveMinimumServerVersion(ServerVersion.v6_5);
+ return true;
}
public boolean supportsStoredProcedures() throws SQLException {
@@ -728,7 +785,7 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
* @return true if connected to PostgreSQL 7.1+
*/
public boolean supportsCorrelatedSubqueries() throws SQLException {
- return connection.haveMinimumServerVersion(ServerVersion.v7_1);
+ return true;
}
/**
@@ -746,7 +803,7 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
* @return true if connected to PostgreSQL 7.1+
*/
public boolean supportsUnionAll() throws SQLException {
- return connection.haveMinimumServerVersion(ServerVersion.v7_1);
+ return true;
}
/**
@@ -865,11 +922,7 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
}
public int getMaxRowSize() throws SQLException {
- if (connection.haveMinimumServerVersion(ServerVersion.v7_1)) {
- return 1073741824; // 1 GB
- } else {
- return 8192; // XXX could be altered
- }
+ return 1073741824; // 1 GB
}
public boolean doesMaxRowSizeIncludeBlobs() throws SQLException {
@@ -877,11 +930,7 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
}
public int getMaxStatementLength() throws SQLException {
- if (connection.haveMinimumServerVersion(ServerVersion.v7_0)) {
- return 0; // actually whatever fits in size_t
- } else {
- return 16384;
- }
+ return 0; // actually whatever fits in size_t
}
public int getMaxStatements() throws SQLException {
@@ -915,15 +964,14 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
* READ_UNCOMMITTED and REPEATABLE_READ are accepted aliases for READ_COMMITTED.
*/
public boolean supportsTransactionIsolationLevel(int level) throws SQLException {
- if (level == Connection.TRANSACTION_SERIALIZABLE
- || level == Connection.TRANSACTION_READ_COMMITTED) {
- return true;
- } else if (connection.haveMinimumServerVersion(ServerVersion.v8_0)
- && (level == Connection.TRANSACTION_READ_UNCOMMITTED
- || level == Connection.TRANSACTION_REPEATABLE_READ)) {
- return true;
- } else {
- return false;
+ switch (level) {
+ case Connection.TRANSACTION_READ_UNCOMMITTED:
+ case Connection.TRANSACTION_READ_COMMITTED:
+ case Connection.TRANSACTION_REPEATABLE_READ:
+ case Connection.TRANSACTION_SERIALIZABLE:
+ return true;
+ default:
+ return false;
}
}
@@ -967,13 +1015,13 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
* includes the single quotes needed around it.
*
* @param s input value
+ *
* @return string literal for direct inclusion into a query
* @throws SQLException if something wrong happens
*/
protected String escapeQuotes(String s) throws SQLException {
StringBuilder sb = new StringBuilder();
- if (!connection.getStandardConformingStrings()
- && connection.haveMinimumServerVersion(ServerVersion.v8_1)) {
+ if (!connection.getStandardConformingStrings()) {
sb.append("E");
}
sb.append("'");
@@ -982,79 +1030,34 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
return sb.toString();
}
- public ResultSet getProcedures(String catalog, String schemaPattern,
- String procedureNamePattern) throws SQLException {
- return getProcedures(getJDBCMajorVersion(), catalog, schemaPattern, procedureNamePattern);
- }
-
- protected ResultSet getProcedures(int jdbcVersion, String catalog, String schemaPattern,
- String procedureNamePattern) throws SQLException {
+ public ResultSet getProcedures(String catalog, String schemaPattern, String procedureNamePattern)
+ throws SQLException {
String sql;
- if (connection.haveMinimumServerVersion(ServerVersion.v7_3)) {
- sql =
- "SELECT NULL AS PROCEDURE_CAT, n.nspname AS PROCEDURE_SCHEM, p.proname AS PROCEDURE_NAME, NULL, NULL, NULL, d.description AS REMARKS, "
- + java.sql.DatabaseMetaData.procedureReturnsResult + " AS PROCEDURE_TYPE ";
- if (jdbcVersion >= 4) {
- sql += ", p.proname || '_' || p.oid AS SPECIFIC_NAME ";
- }
- sql += " FROM pg_catalog.pg_namespace n, pg_catalog.pg_proc p "
+ sql = "SELECT NULL AS PROCEDURE_CAT, n.nspname AS PROCEDURE_SCHEM, p.proname AS PROCEDURE_NAME, "
+ + "NULL, NULL, NULL, d.description AS REMARKS, "
+ + DatabaseMetaData.procedureReturnsResult + " AS PROCEDURE_TYPE, "
+ + " p.proname || '_' || p.oid AS SPECIFIC_NAME "
+ + " FROM pg_catalog.pg_namespace n, pg_catalog.pg_proc p "
+ " LEFT JOIN pg_catalog.pg_description d ON (p.oid=d.objoid) "
+ " LEFT JOIN pg_catalog.pg_class c ON (d.classoid=c.oid AND c.relname='pg_proc') "
+ " LEFT JOIN pg_catalog.pg_namespace pn ON (c.relnamespace=pn.oid AND pn.nspname='pg_catalog') "
+ " WHERE p.pronamespace=n.oid ";
- if (schemaPattern != null && !"".equals(schemaPattern)) {
- sql += " AND n.nspname LIKE " + escapeQuotes(schemaPattern);
- }
- if (procedureNamePattern != null) {
- sql += " AND p.proname LIKE " + escapeQuotes(procedureNamePattern);
- }
- sql += " ORDER BY PROCEDURE_SCHEM, PROCEDURE_NAME, p.oid::text ";
- } else if (connection.haveMinimumServerVersion(ServerVersion.v7_1)) {
- sql =
- "SELECT NULL AS PROCEDURE_CAT, NULL AS PROCEDURE_SCHEM, p.proname AS PROCEDURE_NAME, NULL, NULL, NULL, d.description AS REMARKS, "
- + java.sql.DatabaseMetaData.procedureReturnsResult + " AS PROCEDURE_TYPE ";
- if (jdbcVersion >= 4) {
- sql += ", p.proname || '_' || p.oid AS SPECIFIC_NAME ";
- }
- sql += " FROM pg_proc p "
- + " LEFT JOIN pg_description d ON (p.oid=d.objoid) ";
- if (connection.haveMinimumServerVersion(ServerVersion.v7_2)) {
- sql += " LEFT JOIN pg_class c ON (d.classoid=c.oid AND c.relname='pg_proc') ";
- }
- if (procedureNamePattern != null) {
- sql += " WHERE p.proname LIKE " + escapeQuotes(procedureNamePattern);
- }
- sql += " ORDER BY PROCEDURE_NAME, p.oid::text ";
- } else {
- sql =
- "SELECT NULL AS PROCEDURE_CAT, NULL AS PROCEDURE_SCHEM, p.proname AS PROCEDURE_NAME, NULL, NULL, NULL, NULL AS REMARKS, "
- + java.sql.DatabaseMetaData.procedureReturnsResult + " AS PROCEDURE_TYPE ";
- if (jdbcVersion >= 4) {
- sql += ", p.proname || '_' || p.oid AS SPECIFIC_NAME ";
- }
- sql += " FROM pg_proc p ";
- if (procedureNamePattern != null) {
- sql += " WHERE p.proname LIKE " + escapeQuotes(procedureNamePattern);
- }
- sql += " ORDER BY PROCEDURE_NAME, p.oid::text ";
+ if (schemaPattern != null && !schemaPattern.isEmpty()) {
+ sql += " AND n.nspname LIKE " + escapeQuotes(schemaPattern);
+ }
+ if (procedureNamePattern != null && !procedureNamePattern.isEmpty()) {
+ sql += " AND p.proname LIKE " + escapeQuotes(procedureNamePattern);
}
+ sql += " ORDER BY PROCEDURE_SCHEM, PROCEDURE_NAME, p.oid::text ";
+
return createMetaDataStatement().executeQuery(sql);
}
public ResultSet getProcedureColumns(String catalog, String schemaPattern,
String procedureNamePattern, String columnNamePattern) throws SQLException {
- return getProcedureColumns(getJDBCMajorVersion(), catalog, schemaPattern, procedureNamePattern,
- columnNamePattern);
- }
+ int columns = 20;
- protected ResultSet getProcedureColumns(int jdbcVersion, String catalog,
- String schemaPattern, String procedureNamePattern, String columnNamePattern)
- throws SQLException {
- int columns = 13;
- if (jdbcVersion >= 4) {
- columns += 7;
- }
- Field f[] = new Field[columns];
+ Field[] f = new Field[columns];
List<byte[][]> v = new ArrayList<byte[][]>(); // The new ResultSet tuple stuff
f[0] = new Field("PROCEDURE_CAT", Oid.VARCHAR);
@@ -1070,57 +1073,36 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
f[10] = new Field("RADIX", Oid.INT2);
f[11] = new Field("NULLABLE", Oid.INT2);
f[12] = new Field("REMARKS", Oid.VARCHAR);
- if (jdbcVersion >= 4) {
- f[13] = new Field("COLUMN_DEF", Oid.VARCHAR);
- f[14] = new Field("SQL_DATA_TYPE", Oid.INT4);
- f[15] = new Field("SQL_DATETIME_SUB", Oid.INT4);
- f[16] = new Field("CHAR_OCTECT_LENGTH", Oid.INT4);
- f[17] = new Field("ORDINAL_POSITION", Oid.INT4);
- f[18] = new Field("IS_NULLABLE", Oid.VARCHAR);
- f[19] = new Field("SPECIFIC_NAME", Oid.VARCHAR);
- }
+ f[13] = new Field("COLUMN_DEF", Oid.VARCHAR);
+ f[14] = new Field("SQL_DATA_TYPE", Oid.INT4);
+ f[15] = new Field("SQL_DATETIME_SUB", Oid.INT4);
+ f[16] = new Field("CHAR_OCTECT_LENGTH", Oid.INT4);
+ f[17] = new Field("ORDINAL_POSITION", Oid.INT4);
+ f[18] = new Field("IS_NULLABLE", Oid.VARCHAR);
+ f[19] = new Field("SPECIFIC_NAME", Oid.VARCHAR);
String sql;
- if (connection.haveMinimumServerVersion(ServerVersion.v7_3)) {
- sql = "SELECT n.nspname,p.proname,p.prorettype,p.proargtypes, t.typtype,t.typrelid ";
-
- if (connection.haveMinimumServerVersion(ServerVersion.v8_1)) {
- sql += ", p.proargnames, p.proargmodes, p.proallargtypes ";
- } else if (connection.haveMinimumServerVersion(ServerVersion.v8_0)) {
- sql += ", p.proargnames, NULL AS proargmodes, NULL AS proallargtypes ";
- } else {
- sql += ", NULL AS proargnames, NULL AS proargmodes, NULL AS proallargtypes ";
- }
- sql += ", p.oid "
+ sql = "SELECT n.nspname,p.proname,p.prorettype,p.proargtypes, t.typtype,t.typrelid, "
+ + " p.proargnames, p.proargmodes, p.proallargtypes, p.oid "
+ " FROM pg_catalog.pg_proc p, pg_catalog.pg_namespace n, pg_catalog.pg_type t "
+ " WHERE p.pronamespace=n.oid AND p.prorettype=t.oid ";
- if (schemaPattern != null && !"".equals(schemaPattern)) {
- sql += " AND n.nspname LIKE " + escapeQuotes(schemaPattern);
- }
- if (procedureNamePattern != null) {
- sql += " AND p.proname LIKE " + escapeQuotes(procedureNamePattern);
- }
- sql += " ORDER BY n.nspname, p.proname, p.oid::text ";
- } else {
- sql =
- "SELECT NULL AS nspname,p.proname,p.prorettype,p.proargtypes,t.typtype,t.typrelid, NULL AS proargnames, NULL AS proargmodes, NULL AS proallargtypes, p.oid "
- + " FROM pg_proc p,pg_type t "
- + " WHERE p.prorettype=t.oid ";
- if (procedureNamePattern != null) {
- sql += " AND p.proname LIKE " + escapeQuotes(procedureNamePattern);
- }
- sql += " ORDER BY p.proname, p.oid::text ";
+ if (schemaPattern != null && !schemaPattern.isEmpty()) {
+ sql += " AND n.nspname LIKE " + escapeQuotes(schemaPattern);
+ }
+ if (procedureNamePattern != null && !procedureNamePattern.isEmpty()) {
+ sql += " AND p.proname LIKE " + escapeQuotes(procedureNamePattern);
}
+ sql += " ORDER BY n.nspname, p.proname, p.oid::text ";
- byte isnullableUnknown[] = new byte[0];
+ byte[] isnullableUnknown = new byte[0];
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery(sql);
while (rs.next()) {
- byte schema[] = rs.getBytes("nspname");
- byte procedureName[] = rs.getBytes("proname");
- byte specificName[] =
- connection.encodeString(rs.getString("proname") + "_" + rs.getString("oid"));
+ byte[] schema = rs.getBytes("nspname");
+ byte[] procedureName = rs.getBytes("proname");
+ byte[] specificName =
+ connection.encodeString(rs.getString("proname") + "_" + rs.getString("oid"));
int returnType = (int) rs.getLong("prorettype");
String returnTypeType = rs.getString("typtype");
int returnTypeRelid = (int) rs.getLong("typrelid");
@@ -1129,16 +1111,16 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
StringTokenizer st = new StringTokenizer(strArgTypes);
List<Long> argTypes = new ArrayList<Long>();
while (st.hasMoreTokens()) {
- argTypes.add(new Long(st.nextToken()));
+ argTypes.add(Long.valueOf(st.nextToken()));
}
- String argNames[] = null;
+ String[] argNames = null;
Array argNamesArray = rs.getArray("proargnames");
if (argNamesArray != null) {
argNames = (String[]) argNamesArray.getArray();
}
- String argModes[] = null;
+ String[] argModes = null;
Array argModesArray = rs.getArray("proargmodes");
if (argModesArray != null) {
argModes = (String[]) argModesArray.getArray();
@@ -1146,22 +1128,10 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
int numArgs = argTypes.size();
- Long allArgTypes[] = null;
+ Long[] allArgTypes = null;
Array allArgTypesArray = rs.getArray("proallargtypes");
if (allArgTypesArray != null) {
- // Depending on what the user has selected we'll get
- // either long[] or Long[] back, and there's no
- // obvious way for the driver to override this for
- // it's own usage.
- if (connection.haveMinimumCompatibleVersion(ServerVersion.v8_3)) {
- allArgTypes = (Long[]) allArgTypesArray.getArray();
- } else {
- long tempAllArgTypes[] = (long[]) allArgTypesArray.getArray();
- allArgTypes = new Long[tempAllArgTypes.length];
- for (int i = 0; i < tempAllArgTypes.length; i++) {
- allArgTypes[i] = tempAllArgTypes[i];
- }
- }
+ allArgTypes = (Long[]) allArgTypesArray.getArray();
numArgs = allArgTypes.length;
}
@@ -1185,11 +1155,10 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
tuple[11] = connection
.encodeString(Integer.toString(java.sql.DatabaseMetaData.procedureNullableUnknown));
tuple[12] = null;
- if (jdbcVersion >= 4) {
- tuple[17] = connection.encodeString(Integer.toString(0));
- tuple[18] = isnullableUnknown;
- tuple[19] = specificName;
- }
+ tuple[17] = connection.encodeString(Integer.toString(0));
+ tuple[18] = isnullableUnknown;
+ tuple[19] = specificName;
+
v.add(tuple);
}
@@ -1234,22 +1203,18 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
tuple[11] =
connection.encodeString(Integer.toString(DatabaseMetaData.procedureNullableUnknown));
tuple[12] = null;
- if (jdbcVersion >= 4) {
- tuple[17] = connection.encodeString(Integer.toString(i + 1));
- tuple[18] = isnullableUnknown;
- tuple[19] = specificName;
- }
+ tuple[17] = connection.encodeString(Integer.toString(i + 1));
+ tuple[18] = isnullableUnknown;
+ tuple[19] = specificName;
+
v.add(tuple);
}
// if we are returning a multi-column result.
if (returnTypeType.equals("c") || (returnTypeType.equals("p") && argModesArray != null)) {
- String columnsql = "SELECT a.attname,a.atttypid FROM ";
- if (connection.haveMinimumServerVersion(ServerVersion.v7_3)) {
- columnsql += "pg_catalog.";
- }
- columnsql += "pg_attribute a WHERE a.attrelid = " + returnTypeRelid
- + " AND a.attnum > 0 ORDER BY a.attnum ";
+ String columnsql = "SELECT a.attname,a.atttypid FROM pg_catalog.pg_attribute a "
+ + " WHERE a.attrelid = " + returnTypeRelid
+ + " AND NOT a.attisdropped AND a.attnum > 0 ORDER BY a.attnum ";
Statement columnstmt = connection.createStatement();
ResultSet columnrs = columnstmt.executeQuery(columnsql);
while (columnrs.next()) {
@@ -1271,11 +1236,10 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
tuple[11] = connection
.encodeString(Integer.toString(java.sql.DatabaseMetaData.procedureNullableUnknown));
tuple[12] = null;
- if (jdbcVersion >= 4) {
- tuple[17] = connection.encodeString(Integer.toString(0));
- tuple[18] = isnullableUnknown;
- tuple[19] = specificName;
- }
+ tuple[17] = connection.encodeString(Integer.toString(0));
+ tuple[18] = isnullableUnknown;
+ tuple[19] = specificName;
+
v.add(tuple);
}
columnrs.close();
@@ -1288,133 +1252,74 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
return ((BaseStatement) createMetaDataStatement()).createDriverResultSet(f, v);
}
+ @Override
public ResultSet getTables(String catalog, String schemaPattern, String tableNamePattern,
- String types[]) throws SQLException {
+ String[] types) throws SQLException {
String select;
String orderby;
- String useSchemas;
- if (connection.haveMinimumServerVersion(ServerVersion.v7_3)) {
- useSchemas = "SCHEMAS";
- select = "SELECT NULL AS TABLE_CAT, n.nspname AS TABLE_SCHEM, c.relname AS TABLE_NAME, "
- + " CASE n.nspname ~ '^pg_' OR n.nspname = 'information_schema' "
- + " WHEN true THEN CASE "
- + " WHEN n.nspname = 'pg_catalog' OR n.nspname = 'information_schema' THEN CASE c.relkind "
- + " WHEN 'r' THEN 'SYSTEM TABLE' "
- + " WHEN 'v' THEN 'SYSTEM VIEW' "
- + " WHEN 'i' THEN 'SYSTEM INDEX' "
- + " ELSE NULL "
- + " END "
- + " WHEN n.nspname = 'pg_toast' THEN CASE c.relkind "
- + " WHEN 'r' THEN 'SYSTEM TOAST TABLE' "
- + " WHEN 'i' THEN 'SYSTEM TOAST INDEX' "
- + " ELSE NULL "
- + " END "
- + " ELSE CASE c.relkind "
- + " WHEN 'r' THEN 'TEMPORARY TABLE' "
- + " WHEN 'i' THEN 'TEMPORARY INDEX' "
- + " WHEN 'S' THEN 'TEMPORARY SEQUENCE' "
- + " WHEN 'v' THEN 'TEMPORARY VIEW' "
- + " ELSE NULL "
- + " END "
- + " END "
- + " WHEN false THEN CASE c.relkind "
- + " WHEN 'r' THEN 'TABLE' "
- + " WHEN 'i' THEN 'INDEX' "
- + " WHEN 'S' THEN 'SEQUENCE' "
- + " WHEN 'v' THEN 'VIEW' "
- + " WHEN 'c' THEN 'TYPE' "
- + " WHEN 'f' THEN 'FOREIGN TABLE' "
- + " WHEN 'm' THEN 'MATERIALIZED VIEW' "
- + " ELSE NULL "
- + " END "
- + " ELSE NULL "
- + " END "
- + " AS TABLE_TYPE, d.description AS REMARKS "
- + " FROM pg_catalog.pg_namespace n, pg_catalog.pg_class c "
- + " LEFT JOIN pg_catalog.pg_description d ON (c.oid = d.objoid AND d.objsubid = 0) "
- + " LEFT JOIN pg_catalog.pg_class dc ON (d.classoid=dc.oid AND dc.relname='pg_class') "
- + " LEFT JOIN pg_catalog.pg_namespace dn ON (dn.oid=dc.relnamespace AND dn.nspname='pg_catalog') "
- + " WHERE c.relnamespace = n.oid ";
- if (schemaPattern != null && !"".equals(schemaPattern)) {
- select += " AND n.nspname LIKE " + escapeQuotes(schemaPattern);
- }
- orderby = " ORDER BY TABLE_TYPE,TABLE_SCHEM,TABLE_NAME ";
- } else {
- useSchemas = "NOSCHEMAS";
- String tableType = ""
- + " CASE c.relname ~ '^pg_' "
- + " WHEN true THEN CASE c.relname ~ '^pg_toast_' "
- + " WHEN true THEN CASE c.relkind "
- + " WHEN 'r' THEN 'SYSTEM TOAST TABLE' "
- + " WHEN 'i' THEN 'SYSTEM TOAST INDEX' "
- + " ELSE NULL "
- + " END "
- + " WHEN false THEN CASE c.relname ~ '^pg_temp_' "
- + " WHEN true THEN CASE c.relkind "
- + " WHEN 'r' THEN 'TEMPORARY TABLE' "
- + " WHEN 'i' THEN 'TEMPORARY INDEX' "
- + " WHEN 'S' THEN 'TEMPORARY SEQUENCE' "
- + " WHEN 'v' THEN 'TEMPORARY VIEW' "
- + " ELSE NULL "
- + " END "
- + " WHEN false THEN CASE c.relkind "
- + " WHEN 'r' THEN 'SYSTEM TABLE' "
- + " WHEN 'v' THEN 'SYSTEM VIEW' "
- + " WHEN 'i' THEN 'SYSTEM INDEX' "
- + " ELSE NULL "
- + " END "
- + " ELSE NULL "
- + " END "
- + " ELSE NULL "
- + " END "
- + " WHEN false THEN CASE c.relkind "
- + " WHEN 'r' THEN 'TABLE' "
- + " WHEN 'i' THEN 'INDEX' "
- + " WHEN 'S' THEN 'SEQUENCE' "
- + " WHEN 'v' THEN 'VIEW' "
- + " WHEN 'c' THEN 'TYPE' "
- + " ELSE NULL "
- + " END "
- + " ELSE NULL "
- + " END ";
- orderby = " ORDER BY TABLE_TYPE,TABLE_NAME ";
- if (connection.haveMinimumServerVersion(ServerVersion.v7_2)) {
- select =
- "SELECT NULL AS TABLE_CAT, NULL AS TABLE_SCHEM, c.relname AS TABLE_NAME, " + tableType
- + " AS TABLE_TYPE, d.description AS REMARKS "
- + " FROM pg_class c "
- + " LEFT JOIN pg_description d ON (c.oid=d.objoid AND d.objsubid = 0) "
- + " LEFT JOIN pg_class dc ON (d.classoid = dc.oid AND dc.relname='pg_class') "
- + " WHERE true ";
- } else if (connection.haveMinimumServerVersion(ServerVersion.v7_1)) {
- select =
- "SELECT NULL AS TABLE_CAT, NULL AS TABLE_SCHEM, c.relname AS TABLE_NAME, " + tableType
- + " AS TABLE_TYPE, d.description AS REMARKS "
- + " FROM pg_class c "
- + " LEFT JOIN pg_description d ON (c.oid=d.objoid) "
- + " WHERE true ";
- } else {
- select =
- "SELECT NULL AS TABLE_CAT, NULL AS TABLE_SCHEM, c.relname AS TABLE_NAME, " + tableType
- + " AS TABLE_TYPE, NULL AS REMARKS "
- + " FROM pg_class c "
- + " WHERE true ";
- }
- }
-
- if (tableNamePattern != null && !"".equals(tableNamePattern)) {
+ String useSchemas = "SCHEMAS";
+ select = "SELECT NULL AS TABLE_CAT, n.nspname AS TABLE_SCHEM, c.relname AS TABLE_NAME, "
+ + " CASE n.nspname ~ '^pg_' OR n.nspname = 'information_schema' "
+ + " WHEN true THEN CASE "
+ + " WHEN n.nspname = 'pg_catalog' OR n.nspname = 'information_schema' THEN CASE c.relkind "
+ + " WHEN 'r' THEN 'SYSTEM TABLE' "
+ + " WHEN 'v' THEN 'SYSTEM VIEW' "
+ + " WHEN 'i' THEN 'SYSTEM INDEX' "
+ + " ELSE NULL "
+ + " END "
+ + " WHEN n.nspname = 'pg_toast' THEN CASE c.relkind "
+ + " WHEN 'r' THEN 'SYSTEM TOAST TABLE' "
+ + " WHEN 'i' THEN 'SYSTEM TOAST INDEX' "
+ + " ELSE NULL "
+ + " END "
+ + " ELSE CASE c.relkind "
+ + " WHEN 'r' THEN 'TEMPORARY TABLE' "
+ + " WHEN 'p' THEN 'TEMPORARY TABLE' "
+ + " WHEN 'i' THEN 'TEMPORARY INDEX' "
+ + " WHEN 'S' THEN 'TEMPORARY SEQUENCE' "
+ + " WHEN 'v' THEN 'TEMPORARY VIEW' "
+ + " ELSE NULL "
+ + " END "
+ + " END "
+ + " WHEN false THEN CASE c.relkind "
+ + " WHEN 'r' THEN 'TABLE' "
+ + " WHEN 'p' THEN 'TABLE' "
+ + " WHEN 'i' THEN 'INDEX' "
+ + " WHEN 'S' THEN 'SEQUENCE' "
+ + " WHEN 'v' THEN 'VIEW' "
+ + " WHEN 'c' THEN 'TYPE' "
+ + " WHEN 'f' THEN 'FOREIGN TABLE' "
+ + " WHEN 'm' THEN 'MATERIALIZED VIEW' "
+ + " ELSE NULL "
+ + " END "
+ + " ELSE NULL "
+ + " END "
+ + " AS TABLE_TYPE, d.description AS REMARKS "
+ + " FROM pg_catalog.pg_namespace n, pg_catalog.pg_class c "
+ + " LEFT JOIN pg_catalog.pg_description d ON (c.oid = d.objoid AND d.objsubid = 0) "
+ + " LEFT JOIN pg_catalog.pg_class dc ON (d.classoid=dc.oid AND dc.relname='pg_class') "
+ + " LEFT JOIN pg_catalog.pg_namespace dn ON (dn.oid=dc.relnamespace AND dn.nspname='pg_catalog') "
+ + " WHERE c.relnamespace = n.oid ";
+
+ if (schemaPattern != null && !schemaPattern.isEmpty()) {
+ select += " AND n.nspname LIKE " + escapeQuotes(schemaPattern);
+ }
+ orderby = " ORDER BY TABLE_TYPE,TABLE_SCHEM,TABLE_NAME ";
+
+ if (tableNamePattern != null && !tableNamePattern.isEmpty()) {
select += " AND c.relname LIKE " + escapeQuotes(tableNamePattern);
}
if (types != null) {
select += " AND (false ";
+ StringBuilder orclause = new StringBuilder();
for (String type : types) {
Map<String, String> clauses = tableTypeClauses.get(type);
if (clauses != null) {
String clause = clauses.get(useSchemas);
- select += " OR ( " + clause + " ) ";
+ orclause.append(" OR ( ").append(clause).append(" ) ");
}
}
- select += ") ";
+ select += orclause.toString() + ") ";
}
String sql = select + orderby;
@@ -1428,8 +1333,8 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
Map<String, String> ht = new HashMap<String, String>();
tableTypeClauses.put("TABLE", ht);
ht.put("SCHEMAS",
- "c.relkind = 'r' AND n.nspname !~ '^pg_' AND n.nspname <> 'information_schema'");
- ht.put("NOSCHEMAS", "c.relkind = 'r' AND c.relname !~ '^pg_'");
+ "c.relkind IN ('r','p') AND n.nspname !~ '^pg_' AND n.nspname <> 'information_schema'");
+ ht.put("NOSCHEMAS", "c.relkind IN ('r','p') AND c.relname !~ '^pg_'");
ht = new HashMap<String, String>();
tableTypeClauses.put("VIEW", ht);
ht.put("SCHEMAS",
@@ -1476,8 +1381,8 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
"c.relkind = 'v' AND c.relname ~ '^pg_' AND c.relname !~ '^pg_toast_' AND c.relname !~ '^pg_temp_'");
ht = new HashMap<String, String>();
tableTypeClauses.put("TEMPORARY TABLE", ht);
- ht.put("SCHEMAS", "c.relkind = 'r' AND n.nspname ~ '^pg_temp_' ");
- ht.put("NOSCHEMAS", "c.relkind = 'r' AND c.relname ~ '^pg_temp_' ");
+ ht.put("SCHEMAS", "c.relkind IN ('r','p') AND n.nspname ~ '^pg_temp_' ");
+ ht.put("NOSCHEMAS", "c.relkind IN ('r','p') AND c.relname ~ '^pg_temp_' ");
ht = new HashMap<String, String>();
tableTypeClauses.put("TEMPORARY INDEX", ht);
ht.put("SCHEMAS", "c.relkind = 'i' AND n.nspname ~ '^pg_temp_' ");
@@ -1500,45 +1405,23 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
ht.put("NOSCHEMAS", "c.relkind = 'm'");
}
+ @Override
public ResultSet getSchemas() throws SQLException {
- return getSchemas(getJDBCMajorVersion(), null, null);
+ return getSchemas(null, null);
}
- protected ResultSet getSchemas(int jdbcVersion, String catalog, String schemaPattern)
- throws SQLException {
+ @Override
+ public ResultSet getSchemas(String catalog, String schemaPattern) throws SQLException {
String sql;
- // Show only the users temp schemas, but not other peoples
- // because they can't access any objects in them.
- if (connection.haveMinimumServerVersion(ServerVersion.v7_3)) {
- // 7.3 can't extract elements from an array returned by
- // a function, so we've got to coerce it to text and then
- // hack it up with a regex.
- String tempSchema =
- "substring(textin(array_out(pg_catalog.current_schemas(true))) from '{(pg_temp_[0-9]+),')";
- if (connection.haveMinimumServerVersion(ServerVersion.v7_4)) {
- tempSchema = "(pg_catalog.current_schemas(true))[1]";
- }
- sql = "SELECT nspname AS TABLE_SCHEM ";
- if (jdbcVersion >= 3) {
- sql += ", NULL AS TABLE_CATALOG ";
- }
- sql +=
- " FROM pg_catalog.pg_namespace WHERE nspname <> 'pg_toast' AND (nspname !~ '^pg_temp_' OR nspname = "
- + tempSchema + ") AND (nspname !~ '^pg_toast_temp_' OR nspname = replace("
- + tempSchema + ", 'pg_temp_', 'pg_toast_temp_')) ";
- if (schemaPattern != null && !"".equals(schemaPattern)) {
- sql += " AND nspname LIKE " + escapeQuotes(schemaPattern);
- }
- sql += " ORDER BY TABLE_SCHEM";
- } else {
- sql = "SELECT ''::text AS TABLE_SCHEM ";
- if (jdbcVersion >= 3) {
- sql += ", NULL AS TABLE_CATALOG ";
- }
- if (schemaPattern != null) {
- sql += " WHERE ''::text LIKE " + escapeQuotes(schemaPattern);
- }
+ sql = "SELECT nspname AS TABLE_SCHEM, NULL AS TABLE_CATALOG FROM pg_catalog.pg_namespace "
+ + " WHERE nspname <> 'pg_toast' AND (nspname !~ '^pg_temp_' "
+ + " OR nspname = (pg_catalog.current_schemas(true))[1]) AND (nspname !~ '^pg_toast_temp_' "
+ + " OR nspname = replace((pg_catalog.current_schemas(true))[1], 'pg_temp_', 'pg_toast_temp_')) ";
+ if (schemaPattern != null && !schemaPattern.isEmpty()) {
+ sql += " AND nspname LIKE " + escapeQuotes(schemaPattern);
}
+ sql += " ORDER BY TABLE_SCHEM";
+
return createMetaDataStatement().executeQuery(sql);
}
@@ -1546,8 +1429,9 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
* PostgreSQL does not support multiple catalogs from a single connection, so to reduce confusion
* we only return the current catalog. {@inheritDoc}
*/
+ @Override
public ResultSet getCatalogs() throws SQLException {
- Field f[] = new Field[1];
+ Field[] f = new Field[1];
List<byte[][]> v = new ArrayList<byte[][]>();
f[0] = new Field("TABLE_CAT", Oid.VARCHAR);
byte[][] tuple = new byte[1][];
@@ -1557,39 +1441,29 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
return ((BaseStatement) createMetaDataStatement()).createDriverResultSet(f, v);
}
+ @Override
public ResultSet getTableTypes() throws SQLException {
- String types[] = new String[tableTypeClauses.size()];
- Iterator<String> e = tableTypeClauses.keySet().iterator();
- int i = 0;
- while (e.hasNext()) {
- types[i++] = e.next();
- }
- sortStringArray(types);
+ String[] types = tableTypeClauses.keySet().toArray(new String[0]);
+ Arrays.sort(types);
- Field f[] = new Field[1];
+ Field[] f = new Field[1];
List<byte[][]> v = new ArrayList<byte[][]>();
f[0] = new Field("TABLE_TYPE", Oid.VARCHAR);
- for (i = 0; i < types.length; i++) {
+ for (String type : types) {
byte[][] tuple = new byte[1][];
- tuple[0] = connection.encodeString(types[i]);
+ tuple[0] = connection.encodeString(type);
v.add(tuple);
}
return ((BaseStatement) createMetaDataStatement()).createDriverResultSet(f, v);
}
- protected ResultSet getColumns(int jdbcVersion, String catalog, String schemaPattern,
- String tableNamePattern, String columnNamePattern) throws SQLException {
- int numberOfFields;
- if (jdbcVersion >= 4) {
- numberOfFields = 23;
- } else if (jdbcVersion >= 3) {
- numberOfFields = 22;
- } else {
- numberOfFields = 18;
- }
+ public ResultSet getColumns(String catalog, String schemaPattern, String tableNamePattern,
+ String columnNamePattern) throws SQLException {
+
+ int numberOfFields = 23; // JDBC4
List<byte[][]> v = new ArrayList<byte[][]>(); // The new ResultSet tuple stuff
- Field f[] = new Field[numberOfFields]; // The field descriptors for the new ResultSet
+ Field[] f = new Field[numberOfFields]; // The field descriptors for the new ResultSet
f[0] = new Field("TABLE_CAT", Oid.VARCHAR);
f[1] = new Field("TABLE_SCHEM", Oid.VARCHAR);
@@ -1609,98 +1483,62 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
f[15] = new Field("CHAR_OCTET_LENGTH", Oid.VARCHAR);
f[16] = new Field("ORDINAL_POSITION", Oid.INT4);
f[17] = new Field("IS_NULLABLE", Oid.VARCHAR);
-
- if (jdbcVersion >= 3) {
- f[18] = new Field("SCOPE_CATLOG", Oid.VARCHAR);
- f[19] = new Field("SCOPE_SCHEMA", Oid.VARCHAR);
- f[20] = new Field("SCOPE_TABLE", Oid.VARCHAR);
- f[21] = new Field("SOURCE_DATA_TYPE", Oid.INT2);
- }
-
- if (jdbcVersion >= 4) {
- f[22] = new Field("IS_AUTOINCREMENT", Oid.VARCHAR);
- }
+ f[18] = new Field("SCOPE_CATLOG", Oid.VARCHAR);
+ f[19] = new Field("SCOPE_SCHEMA", Oid.VARCHAR);
+ f[20] = new Field("SCOPE_TABLE", Oid.VARCHAR);
+ f[21] = new Field("SOURCE_DATA_TYPE", Oid.INT2);
+ f[22] = new Field("IS_AUTOINCREMENT", Oid.VARCHAR);
String sql;
- if (connection.haveMinimumServerVersion(ServerVersion.v7_3)) {
- // a.attnum isn't decremented when preceding columns are dropped,
- // so the only way to calculate the correct column number is with
- // window functions, new in 8.4.
- //
- // We want to push as much predicate information below the window
- // function as possible (schema/table names), but must leave
- // column name outside so we correctly count the other columns.
- //
- if (connection.haveMinimumServerVersion(ServerVersion.v8_4)) {
- sql = "SELECT * FROM (";
- } else {
- sql = "";
- }
-
- sql +=
- "SELECT n.nspname,c.relname,a.attname,a.atttypid,a.attnotnull OR (t.typtype = 'd' AND t.typnotnull) AS attnotnull,a.atttypmod,a.attlen,";
-
- if (connection.haveMinimumServerVersion(ServerVersion.v8_4)) {
- sql += "row_number() OVER (PARTITION BY a.attrelid ORDER BY a.attnum) AS attnum, ";
- } else {
- sql += "a.attnum,";
- }
-
- sql +=
- "pg_catalog.pg_get_expr(def.adbin, def.adrelid) AS adsrc,dsc.description,t.typbasetype,t.typtype "
- + " FROM pg_catalog.pg_namespace n "
- + " JOIN pg_catalog.pg_class c ON (c.relnamespace = n.oid) "
- + " JOIN pg_catalog.pg_attribute a ON (a.attrelid=c.oid) "
- + " JOIN pg_catalog.pg_type t ON (a.atttypid = t.oid) "
- + " LEFT JOIN pg_catalog.pg_attrdef def ON (a.attrelid=def.adrelid AND a.attnum = def.adnum) "
- + " LEFT JOIN pg_catalog.pg_description dsc ON (c.oid=dsc.objoid AND a.attnum = dsc.objsubid) "
- + " LEFT JOIN pg_catalog.pg_class dc ON (dc.oid=dsc.classoid AND dc.relname='pg_class') "
- + " LEFT JOIN pg_catalog.pg_namespace dn ON (dc.relnamespace=dn.oid AND dn.nspname='pg_catalog') "
- + " WHERE c.relkind in ('r','v','f','m') and a.attnum > 0 AND NOT a.attisdropped ";
-
- if (schemaPattern != null && !"".equals(schemaPattern)) {
- sql += " AND n.nspname LIKE " + escapeQuotes(schemaPattern);
- }
-
- if (tableNamePattern != null && !"".equals(tableNamePattern)) {
- sql += " AND c.relname LIKE " + escapeQuotes(tableNamePattern);
- }
+ // a.attnum isn't decremented when preceding columns are dropped,
+ // so the only way to calculate the correct column number is with
+ // window functions, new in 8.4.
+ //
+ // We want to push as much predicate information below the window
+ // function as possible (schema/table names), but must leave
+ // column name outside so we correctly count the other columns.
+ //
+ if (connection.haveMinimumServerVersion(ServerVersion.v8_4)) {
+ sql = "SELECT * FROM (";
+ } else {
+ sql = "";
+ }
- if (connection.haveMinimumServerVersion(ServerVersion.v8_4)) {
- sql += ") c WHERE true ";
- }
+ sql += "SELECT n.nspname,c.relname,a.attname,a.atttypid,a.attnotnull "
+ + "OR (t.typtype = 'd' AND t.typnotnull) AS attnotnull,a.atttypmod,a.attlen,";
- } else if (connection.haveMinimumServerVersion(ServerVersion.v7_2)) {
- sql =
- "SELECT NULL::text AS nspname,c.relname,a.attname,a.atttypid,a.attnotnull,a.atttypmod,a.attlen,a.attnum,pg_get_expr(def.adbin,def.adrelid) AS adsrc,dsc.description,NULL::oid AS typbasetype,t.typtype "
- + " FROM pg_class c "
- + " JOIN pg_attribute a ON (a.attrelid=c.oid) "
- + " JOIN pg_type t ON (a.atttypid = t.oid) "
- + " LEFT JOIN pg_attrdef def ON (a.attrelid=def.adrelid AND a.attnum = def.adnum) "
- + " LEFT JOIN pg_description dsc ON (c.oid=dsc.objoid AND a.attnum = dsc.objsubid) "
- + " LEFT JOIN pg_class dc ON (dc.oid=dsc.classoid AND dc.relname='pg_class') "
- + " WHERE c.relkind in ('r','v','f','m') and a.attnum > 0 ";
- } else if (connection.haveMinimumServerVersion(ServerVersion.v7_1)) {
- sql =
- "SELECT NULL::text AS nspname,c.relname,a.attname,a.atttypid,a.attnotnull,a.atttypmod,a.attlen,a.attnum,def.adsrc,dsc.description,NULL::oid AS typbasetype, 'b' AS typtype "
- + " FROM pg_class c "
- + " JOIN pg_attribute a ON (a.attrelid=c.oid) "
- + " LEFT JOIN pg_attrdef def ON (a.attrelid=def.adrelid AND a.attnum = def.adnum) "
- + " LEFT JOIN pg_description dsc ON (a.oid=dsc.objoid) "
- + " WHERE c.relkind in ('r','v','f','m') and a.attnum > 0 ";
+ if (connection.haveMinimumServerVersion(ServerVersion.v8_4)) {
+ sql += "row_number() OVER (PARTITION BY a.attrelid ORDER BY a.attnum) AS attnum, ";
} else {
- // if < 7.1 then don't get defaults or descriptions.
- sql =
- "SELECT NULL::text AS nspname,c.relname,a.attname,a.atttypid,a.attnotnull,a.atttypmod,a.attlen,a.attnum,NULL AS adsrc,NULL AS description,NULL AS typbasetype, 'b' AS typtype "
- + " FROM pg_class c, pg_attribute a "
- + " WHERE c.relkind in ('r','v','f','m') and a.attrelid=c.oid AND a.attnum > 0 ";
+ sql += "a.attnum,";
}
- if (!connection.haveMinimumServerVersion(ServerVersion.v7_3) && tableNamePattern != null
- && !"".equals(tableNamePattern)) {
+ if (connection.haveMinimumServerVersion(ServerVersion.v10)) {
+ sql += "nullif(a.attidentity, '') as attidentity,";
+ } else {
+ sql += "null as attidentity,";
+ }
+ sql += "pg_catalog.pg_get_expr(def.adbin, def.adrelid) AS adsrc,dsc.description,t.typbasetype,t.typtype "
+ + " FROM pg_catalog.pg_namespace n "
+ + " JOIN pg_catalog.pg_class c ON (c.relnamespace = n.oid) "
+ + " JOIN pg_catalog.pg_attribute a ON (a.attrelid=c.oid) "
+ + " JOIN pg_catalog.pg_type t ON (a.atttypid = t.oid) "
+ + " LEFT JOIN pg_catalog.pg_attrdef def ON (a.attrelid=def.adrelid AND a.attnum = def.adnum) "
+ + " LEFT JOIN pg_catalog.pg_description dsc ON (c.oid=dsc.objoid AND a.attnum = dsc.objsubid) "
+ + " LEFT JOIN pg_catalog.pg_class dc ON (dc.oid=dsc.classoid AND dc.relname='pg_class') "
+ + " LEFT JOIN pg_catalog.pg_namespace dn ON (dc.relnamespace=dn.oid AND dn.nspname='pg_catalog') "
+ + " WHERE c.relkind in ('r','p','v','f','m') and a.attnum > 0 AND NOT a.attisdropped ";
+
+ if (schemaPattern != null && !schemaPattern.isEmpty()) {
+ sql += " AND n.nspname LIKE " + escapeQuotes(schemaPattern);
+ }
+ if (tableNamePattern != null && !tableNamePattern.isEmpty()) {
sql += " AND c.relname LIKE " + escapeQuotes(tableNamePattern);
}
- if (columnNamePattern != null && !"".equals(columnNamePattern)) {
+ if (connection.haveMinimumServerVersion(ServerVersion.v8_4)) {
+ sql += ") c WHERE true ";
+ }
+ if (columnNamePattern != null && !columnNamePattern.isEmpty()) {
sql += " AND attname LIKE " + escapeQuotes(columnNamePattern);
}
sql += " ORDER BY nspname,c.relname,attnum ";
@@ -1748,6 +1586,7 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
}
}
}
+ String identity = rs.getString("attidentity");
int decimalDigits = connection.getTypeInfo().getScale(typeOid, typeMod);
int columnSize = connection.getTypeInfo().getPrecision(typeOid, typeMod);
@@ -1776,24 +1615,20 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
// Is nullable
tuple[17] = connection.encodeString(rs.getBoolean("attnotnull") ? "NO" : "YES");
- if (jdbcVersion >= 3) {
- int baseTypeOid = (int) rs.getLong("typbasetype");
+ int baseTypeOid = (int) rs.getLong("typbasetype");
- tuple[18] = null; // SCOPE_CATLOG
- tuple[19] = null; // SCOPE_SCHEMA
- tuple[20] = null; // SCOPE_TABLE
- tuple[21] = baseTypeOid == 0 ? null
- : connection
- .encodeString(Integer.toString(connection.getTypeInfo().getSQLType(baseTypeOid))); // SOURCE_DATA_TYPE
- }
+ tuple[18] = null; // SCOPE_CATLOG
+ tuple[19] = null; // SCOPE_SCHEMA
+ tuple[20] = null; // SCOPE_TABLE
+ tuple[21] = baseTypeOid == 0
+ ? null
+ : connection.encodeString(Integer.toString(connection.getTypeInfo().getSQLType(baseTypeOid))); // SOURCE_DATA_TYPE
- if (jdbcVersion >= 4) {
- String autoinc = "NO";
- if (defval != null && defval.contains("nextval(")) {
- autoinc = "YES";
- }
- tuple[22] = connection.encodeString(autoinc);
+ String autoinc = "NO";
+ if (defval != null && defval.contains("nextval(") || identity != null) {
+ autoinc = "YES";
}
+ tuple[22] = connection.encodeString(autoinc);
v.add(tuple);
}
@@ -1803,25 +1638,12 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
return ((BaseStatement) createMetaDataStatement()).createDriverResultSet(f, v);
}
- public ResultSet getColumns(String catalog, String schemaPattern,
- String tableNamePattern, String columnNamePattern) throws SQLException {
- return getColumns(getJDBCMajorVersion(), catalog, schemaPattern, tableNamePattern,
- columnNamePattern);
- }
-
+ @Override
public ResultSet getColumnPrivileges(String catalog, String schema, String table,
String columnNamePattern) throws SQLException {
- Field f[] = new Field[8];
+ Field[] f = new Field[8];
List<byte[][]> v = new ArrayList<byte[][]>();
- if (table == null) {
- table = "%";
- }
-
- if (columnNamePattern == null) {
- columnNamePattern = "%";
- }
-
f[0] = new Field("TABLE_CAT", Oid.VARCHAR);
f[1] = new Field("TABLE_SCHEM", Oid.VARCHAR);
f[2] = new Field("TABLE_NAME", Oid.VARCHAR);
@@ -1832,39 +1654,24 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
f[7] = new Field("IS_GRANTABLE", Oid.VARCHAR);
String sql;
- if (connection.haveMinimumServerVersion(ServerVersion.v8_4)) {
- sql = "SELECT n.nspname,c.relname,r.rolname,c.relacl,a.attacl,a.attname "
- + " FROM pg_catalog.pg_namespace n, pg_catalog.pg_class c, pg_catalog.pg_roles r, pg_catalog.pg_attribute a "
- + " WHERE c.relnamespace = n.oid "
- + " AND c.relowner = r.oid "
- + " AND c.oid = a.attrelid "
- + " AND c.relkind = 'r' "
- + " AND a.attnum > 0 AND NOT a.attisdropped ";
- if (schema != null && !"".equals(schema)) {
- sql += " AND n.nspname = " + escapeQuotes(schema);
- }
- } else if (connection.haveMinimumServerVersion(ServerVersion.v7_3)) {
- sql = "SELECT n.nspname,c.relname,r.rolname,c.relacl,a.attname "
- + " FROM pg_catalog.pg_namespace n, pg_catalog.pg_class c, pg_catalog.pg_roles r, pg_catalog.pg_attribute a "
+ sql = "SELECT n.nspname,c.relname,r.rolname,c.relacl, "
+ + (connection.haveMinimumServerVersion(ServerVersion.v8_4) ? "a.attacl, " : "")
+ + " a.attname "
+ + " FROM pg_catalog.pg_namespace n, pg_catalog.pg_class c, "
+ + " pg_catalog.pg_roles r, pg_catalog.pg_attribute a "
+ " WHERE c.relnamespace = n.oid "
+ " AND c.relowner = r.oid "
+ " AND c.oid = a.attrelid "
+ " AND c.relkind = 'r' "
+ " AND a.attnum > 0 AND NOT a.attisdropped ";
- if (schema != null && !"".equals(schema)) {
- sql += " AND n.nspname = " + escapeQuotes(schema);
- }
- } else {
- sql = "SELECT NULL::text AS nspname,c.relname,u.usename,c.relacl,a.attname "
- + "FROM pg_class c, pg_user u,pg_attribute a "
- + " WHERE u.usesysid = c.relowner "
- + " AND c.oid = a.attrelid "
- + " AND a.attnum > 0 "
- + " AND c.relkind = 'r' ";
- }
- sql += " AND c.relname = " + escapeQuotes(table);
- if (columnNamePattern != null && !"".equals(columnNamePattern)) {
+ if (schema != null && !schema.isEmpty()) {
+ sql += " AND n.nspname = " + escapeQuotes(schema);
+ }
+ if (table != null && !table.isEmpty()) {
+ sql += " AND c.relname = " + escapeQuotes(table);
+ }
+ if (columnNamePattern != null && !columnNamePattern.isEmpty()) {
sql += " AND a.attname LIKE " + escapeQuotes(columnNamePattern);
}
sql += " ORDER BY attname ";
@@ -1872,12 +1679,13 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery(sql);
while (rs.next()) {
- byte schemaName[] = rs.getBytes("nspname");
- byte tableName[] = rs.getBytes("relname");
- byte column[] = rs.getBytes("attname");
+ byte[] schemaName = rs.getBytes("nspname");
+ byte[] tableName = rs.getBytes("relname");
+ byte[] column = rs.getBytes("attname");
String owner = rs.getString("rolname");
String relAcl = rs.getString("relacl");
+ // For instance: SELECT -> user1 -> list of [grantor, grantable]
Map<String, Map<String, List<String[]>>> permissions = parseACL(relAcl, owner);
if (connection.haveMinimumServerVersion(ServerVersion.v8_4)) {
@@ -1885,25 +1693,14 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
Map<String, Map<String, List<String[]>>> relPermissions = parseACL(acl, owner);
permissions.putAll(relPermissions);
}
- String permNames[] = new String[permissions.size()];
- Iterator<String> e = permissions.keySet().iterator();
- int i = 0;
- while (e.hasNext()) {
- permNames[i++] = e.next();
- }
- sortStringArray(permNames);
- for (i = 0; i < permNames.length; i++) {
- byte[] privilege = connection.encodeString(permNames[i]);
- Map<String, List<String[]>> grantees = permissions.get(permNames[i]);
- String granteeUsers[] = new String[grantees.size()];
- Iterator<String> g = grantees.keySet().iterator();
- int k = 0;
- while (g.hasNext()) {
- granteeUsers[k++] = g.next();
- }
- for (int j = 0; j < grantees.size(); j++) {
- List<String[]> grantor = grantees.get(granteeUsers[j]);
- String grantee = granteeUsers[j];
+ String[] permNames = permissions.keySet().toArray(new String[0]);
+ Arrays.sort(permNames);
+ for (String permName : permNames) {
+ byte[] privilege = connection.encodeString(permName);
+ Map<String, List<String[]>> grantees = permissions.get(permName);
+ for (Map.Entry<String, List<String[]>> userToGrantable : grantees.entrySet()) {
+ List<String[]> grantor = userToGrantable.getValue();
+ String grantee = userToGrantable.getKey();
for (String[] grants : grantor) {
String grantable = owner.equals(grantee) ? "YES" : grants[1];
byte[][] tuple = new byte[8][];
@@ -1926,9 +1723,10 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
return ((BaseStatement) createMetaDataStatement()).createDriverResultSet(f, v);
}
+ @Override
public ResultSet getTablePrivileges(String catalog, String schemaPattern,
String tableNamePattern) throws SQLException {
- Field f[] = new Field[7];
+ Field[] f = new Field[7];
List<byte[][]> v = new ArrayList<byte[][]>();
f[0] = new Field("TABLE_CAT", Oid.VARCHAR);
@@ -1940,23 +1738,17 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
f[6] = new Field("IS_GRANTABLE", Oid.VARCHAR);
String sql;
- if (connection.haveMinimumServerVersion(ServerVersion.v7_3)) {
- sql = "SELECT n.nspname,c.relname,r.rolname,c.relacl "
+ sql = "SELECT n.nspname,c.relname,r.rolname,c.relacl "
+ " FROM pg_catalog.pg_namespace n, pg_catalog.pg_class c, pg_catalog.pg_roles r "
+ " WHERE c.relnamespace = n.oid "
+ " AND c.relowner = r.oid "
- + " AND c.relkind = 'r' ";
- if (schemaPattern != null && !"".equals(schemaPattern)) {
- sql += " AND n.nspname LIKE " + escapeQuotes(schemaPattern);
- }
- } else {
- sql = "SELECT NULL::text AS nspname,c.relname,u.usename,c.relacl "
- + "FROM pg_class c, pg_user u "
- + " WHERE u.usesysid = c.relowner "
- + " AND c.relkind = 'r' ";
+ + " AND c.relkind IN ('r','p') ";
+
+ if (schemaPattern != null && !schemaPattern.isEmpty()) {
+ sql += " AND n.nspname LIKE " + escapeQuotes(schemaPattern);
}
- if (tableNamePattern != null && !"".equals(tableNamePattern)) {
+ if (tableNamePattern != null && !tableNamePattern.isEmpty()) {
sql += " AND c.relname LIKE " + escapeQuotes(tableNamePattern);
}
sql += " ORDER BY nspname, relname ";
@@ -1964,29 +1756,19 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery(sql);
while (rs.next()) {
- byte schema[] = rs.getBytes("nspname");
- byte table[] = rs.getBytes("relname");
+ byte[] schema = rs.getBytes("nspname");
+ byte[] table = rs.getBytes("relname");
String owner = rs.getString("rolname");
String acl = rs.getString("relacl");
Map<String, Map<String, List<String[]>>> permissions = parseACL(acl, owner);
- String permNames[] = new String[permissions.size()];
- Iterator<String> e = permissions.keySet().iterator();
- int i = 0;
- while (e.hasNext()) {
- permNames[i++] = e.next();
- }
- sortStringArray(permNames);
- for (i = 0; i < permNames.length; i++) {
- byte[] privilege = connection.encodeString(permNames[i]);
- Map<String, List<String[]>> grantees = permissions.get(permNames[i]);
- String granteeUsers[] = new String[grantees.size()];
- Iterator<String> g = grantees.keySet().iterator();
- int k = 0;
- while (g.hasNext()) {
- granteeUsers[k++] = g.next();
- }
- for (String granteeUser : granteeUsers) {
- List<String[]> grants = grantees.get(granteeUser);
+ String[] permNames = permissions.keySet().toArray(new String[0]);
+ Arrays.sort(permNames);
+ for (String permName : permNames) {
+ byte[] privilege = connection.encodeString(permName);
+ Map<String, List<String[]>> grantees = permissions.get(permName);
+ for (Map.Entry<String, List<String[]>> userToGrantable : grantees.entrySet()) {
+ List<String[]> grants = userToGrantable.getValue();
+ String granteeUser = userToGrantable.getKey();
for (String[] grantTuple : grants) {
// report the owner as grantor if it's missing
String grantor = grantTuple[0] == null ? owner : grantTuple[0];
@@ -2001,7 +1783,6 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
tuple[5] = privilege;
tuple[6] = connection.encodeString(grantable);
v.add(tuple);
-
}
}
}
@@ -2012,18 +1793,6 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
return ((BaseStatement) createMetaDataStatement()).createDriverResultSet(f, v);
}
- private static void sortStringArray(String s[]) {
- for (int i = 0; i < s.length - 1; i++) {
- for (int j = i + 1; j < s.length; j++) {
- if (s[i].compareTo(s[j]) > 0) {
- String tmp = s[i];
- s[i] = s[j];
- s[j] = tmp;
- }
- }
- }
- }
-
/**
* Parse an String of ACLs into a List of ACLs.
*/
@@ -2100,6 +1869,7 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
sqlpriv = "INSERT";
break;
case 'r':
+ case 'p':
sqlpriv = "SELECT";
break;
case 'w':
@@ -2164,6 +1934,7 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
/**
* Take the a String representing an array of ACLs and return a Map mapping the SQL permission
* name to a List of usernames who have that permission.
+ * For instance: {@code SELECT -> user1 -> list of [grantor, grantable]}
*
* @param aclArray ACL array
* @param owner owner
@@ -2171,15 +1942,10 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
*/
public Map<String, Map<String, List<String[]>>> parseACL(String aclArray, String owner) {
if (aclArray == null) {
- // null acl is a shortcut for owner having full privs
- String perms = "arwdRxt";
- if (connection.haveMinimumServerVersion(ServerVersion.v8_2)) {
- // 8.2 Removed the separate RULE permission
- perms = "arwdxt";
- } else if (connection.haveMinimumServerVersion(ServerVersion.v8_4)) {
- // 8.4 Added a separate TRUNCATE permission
- perms = "arwdDxt";
- }
+ // arwdxt -- 8.2 Removed the separate RULE permission
+ // arwdDxt -- 8.4 Added a separate TRUNCATE permission
+ String perms = connection.haveMinimumServerVersion(ServerVersion.v8_4) ? "arwdDxt" : "arwdxt";
+
aclArray = "{" + owner + "=" + perms + "/" + owner + "}";
}
@@ -2194,7 +1960,7 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
public ResultSet getBestRowIdentifier(String catalog, String schema, String table,
int scope, boolean nullable) throws SQLException {
- Field f[] = new Field[8];
+ Field[] f = new Field[8];
List<byte[][]> v = new ArrayList<byte[][]>(); // The new ResultSet tuple stuff
f[0] = new Field("SCOPE", Oid.INT2);
@@ -2212,8 +1978,7 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
*/
String sql;
- if (connection.haveMinimumServerVersion(ServerVersion.v8_1)) {
- sql = "SELECT a.attname, a.atttypid, atttypmod "
+ sql = "SELECT a.attname, a.atttypid, atttypmod "
+ "FROM pg_catalog.pg_class ct "
+ " JOIN pg_catalog.pg_attribute a ON (ct.oid = a.attrelid) "
+ " JOIN pg_catalog.pg_namespace n ON (ct.relnamespace = n.oid) "
@@ -2222,27 +1987,9 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
+ " FROM pg_catalog.pg_index i) i "
+ " ON (a.attnum = (i.keys).x AND a.attrelid = i.indrelid) "
+ "WHERE true ";
- if (schema != null && !"".equals(schema)) {
- sql += " AND n.nspname = " + escapeQuotes(schema);
- }
- } else {
- String from;
- String where = "";
- if (connection.haveMinimumServerVersion(ServerVersion.v7_3)) {
- from =
- " FROM pg_catalog.pg_namespace n, pg_catalog.pg_class ct, pg_catalog.pg_class ci, pg_catalog.pg_attribute a, pg_catalog.pg_index i ";
- where = " AND ct.relnamespace = n.oid ";
- if (schema != null && !"".equals(schema)) {
- where += " AND n.nspname = " + escapeQuotes(schema);
- }
- } else {
- from = " FROM pg_class ct, pg_class ci, pg_attribute a, pg_index i ";
- }
- sql = "SELECT a.attname, a.atttypid, a.atttypmod "
- + from
- + " WHERE ct.oid=i.indrelid AND ci.oid=i.indexrelid "
- + " AND a.attrelid=ci.oid "
- + where;
+
+ if (schema != null && !schema.isEmpty()) {
+ sql += " AND n.nspname = " + escapeQuotes(schema);
}
sql += " AND ct.relname = " + escapeQuotes(table)
@@ -2252,7 +1999,7 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery(sql);
while (rs.next()) {
- byte tuple[][] = new byte[8][];
+ byte[][] tuple = new byte[8][];
int typeOid = (int) rs.getLong("atttypid");
int typeMod = rs.getInt("atttypmod");
int decimalDigits = connection.getTypeInfo().getScale(typeOid, typeMod);
@@ -2280,7 +2027,7 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
public ResultSet getVersionColumns(String catalog, String schema, String table)
throws SQLException {
- Field f[] = new Field[8];
+ Field[] f = new Field[8];
List<byte[][]> v = new ArrayList<byte[][]>(); // The new ResultSet tuple stuff
f[0] = new Field("SCOPE", Oid.INT2);
@@ -2292,7 +2039,7 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
f[6] = new Field("DECIMAL_DIGITS", Oid.INT2);
f[7] = new Field("PSEUDO_COLUMN", Oid.INT2);
- byte tuple[][] = new byte[8][];
+ byte[][] tuple = new byte[8][];
/*
* Postgresql does not have any column types that are automatically updated like some databases'
@@ -2323,8 +2070,7 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
public ResultSet getPrimaryKeys(String catalog, String schema, String table)
throws SQLException {
String sql;
- if (connection.haveMinimumServerVersion(ServerVersion.v8_1)) {
- sql = "SELECT NULL AS TABLE_CAT, n.nspname AS TABLE_SCHEM, "
+ sql = "SELECT NULL AS TABLE_CAT, n.nspname AS TABLE_SCHEM, "
+ " ct.relname AS TABLE_NAME, a.attname AS COLUMN_NAME, "
+ " (i.keys).n AS KEY_SEQ, ci.relname AS PK_NAME "
+ "FROM pg_catalog.pg_class ct "
@@ -2336,39 +2082,12 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
+ " ON (a.attnum = (i.keys).x AND a.attrelid = i.indrelid) "
+ " JOIN pg_catalog.pg_class ci ON (ci.oid = i.indexrelid) "
+ "WHERE true ";
- if (schema != null && !"".equals(schema)) {
- sql += " AND n.nspname = " + escapeQuotes(schema);
- }
- } else {
- String select;
- String from;
- String where = "";
-
- if (connection.haveMinimumServerVersion(ServerVersion.v7_3)) {
- select = "SELECT NULL AS TABLE_CAT, n.nspname AS TABLE_SCHEM, ";
- from =
- " FROM pg_catalog.pg_namespace n, pg_catalog.pg_class ct, pg_catalog.pg_class ci, pg_catalog.pg_attribute a, pg_catalog.pg_index i ";
- where = " AND ct.relnamespace = n.oid ";
- if (schema != null && !"".equals(schema)) {
- where += " AND n.nspname = " + escapeQuotes(schema);
- }
- } else {
- select = "SELECT NULL AS TABLE_CAT, NULL AS TABLE_SCHEM, ";
- from = " FROM pg_class ct, pg_class ci, pg_attribute a, pg_index i ";
- }
- sql = select
- + " ct.relname AS TABLE_NAME, "
- + " a.attname AS COLUMN_NAME, "
- + " a.attnum AS KEY_SEQ, "
- + " ci.relname AS PK_NAME "
- + from
- + " WHERE ct.oid=i.indrelid AND ci.oid=i.indexrelid "
- + " AND a.attrelid=ci.oid "
- + where;
+ if (schema != null && !schema.isEmpty()) {
+ sql += " AND n.nspname = " + escapeQuotes(schema);
}
- if (table != null && !"".equals(table)) {
+ if (table != null && !table.isEmpty()) {
sql += " AND ct.relname = " + escapeQuotes(table);
}
@@ -2391,27 +2110,6 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
protected ResultSet getImportedExportedKeys(String primaryCatalog, String primarySchema,
String primaryTable, String foreignCatalog, String foreignSchema, String foreignTable)
throws SQLException {
- Field f[] = new Field[14];
-
- f[0] = new Field("PKTABLE_CAT", Oid.VARCHAR);
- f[1] = new Field("PKTABLE_SCHEM", Oid.VARCHAR);
- f[2] = new Field("PKTABLE_NAME", Oid.VARCHAR);
- f[3] = new Field("PKCOLUMN_NAME", Oid.VARCHAR);
- f[4] = new Field("FKTABLE_CAT", Oid.VARCHAR);
- f[5] = new Field("FKTABLE_SCHEM", Oid.VARCHAR);
- f[6] = new Field("FKTABLE_NAME", Oid.VARCHAR);
- f[7] = new Field("FKCOLUMN_NAME", Oid.VARCHAR);
- f[8] = new Field("KEY_SEQ", Oid.INT2);
- f[9] = new Field("UPDATE_RULE", Oid.INT2);
- f[10] = new Field("DELETE_RULE", Oid.INT2);
- f[11] = new Field("FK_NAME", Oid.VARCHAR);
- f[12] = new Field("PK_NAME", Oid.VARCHAR);
- f[13] = new Field("DEFERRABILITY", Oid.INT2);
-
-
- String select;
- String from;
- String where = "";
/*
* The addition of the pg_constraint in 7.3 table should have really helped us out here, but it
@@ -2421,295 +2119,75 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
* covering the same keys can be created which make it difficult to determine the PK_NAME field.
*/
- if (connection.haveMinimumServerVersion(ServerVersion.v7_4)) {
- String sql =
- "SELECT NULL::text AS PKTABLE_CAT, pkn.nspname AS PKTABLE_SCHEM, pkc.relname AS PKTABLE_NAME, pka.attname AS PKCOLUMN_NAME, "
- + "NULL::text AS FKTABLE_CAT, fkn.nspname AS FKTABLE_SCHEM, fkc.relname AS FKTABLE_NAME, fka.attname AS FKCOLUMN_NAME, "
- + "pos.n AS KEY_SEQ, "
- + "CASE con.confupdtype "
- + " WHEN 'c' THEN " + DatabaseMetaData.importedKeyCascade
- + " WHEN 'n' THEN " + DatabaseMetaData.importedKeySetNull
- + " WHEN 'd' THEN " + DatabaseMetaData.importedKeySetDefault
- + " WHEN 'r' THEN " + DatabaseMetaData.importedKeyRestrict
- + " WHEN 'a' THEN " + DatabaseMetaData.importedKeyNoAction
- + " ELSE NULL END AS UPDATE_RULE, "
- + "CASE con.confdeltype "
- + " WHEN 'c' THEN " + DatabaseMetaData.importedKeyCascade
- + " WHEN 'n' THEN " + DatabaseMetaData.importedKeySetNull
- + " WHEN 'd' THEN " + DatabaseMetaData.importedKeySetDefault
- + " WHEN 'r' THEN " + DatabaseMetaData.importedKeyRestrict
- + " WHEN 'a' THEN " + DatabaseMetaData.importedKeyNoAction
- + " ELSE NULL END AS DELETE_RULE, "
- + "con.conname AS FK_NAME, pkic.relname AS PK_NAME, "
- + "CASE "
- + " WHEN con.condeferrable AND con.condeferred THEN "
- + DatabaseMetaData.importedKeyInitiallyDeferred
- + " WHEN con.condeferrable THEN " + DatabaseMetaData.importedKeyInitiallyImmediate
- + " ELSE " + DatabaseMetaData.importedKeyNotDeferrable
- + " END AS DEFERRABILITY "
- + " FROM "
- + " pg_catalog.pg_namespace pkn, pg_catalog.pg_class pkc, pg_catalog.pg_attribute pka, "
- + " pg_catalog.pg_namespace fkn, pg_catalog.pg_class fkc, pg_catalog.pg_attribute fka, "
- + " pg_catalog.pg_constraint con, ";
- if (connection.haveMinimumServerVersion(ServerVersion.v8_0)) {
- sql += " pg_catalog.generate_series(1, " + getMaxIndexKeys() + ") pos(n), ";
- } else {
- sql += " information_schema._pg_keypositions() pos(n), ";
- }
- sql += " pg_catalog.pg_depend dep, pg_catalog.pg_class pkic "
- + " WHERE pkn.oid = pkc.relnamespace AND pkc.oid = pka.attrelid AND pka.attnum = con.confkey[pos.n] AND con.confrelid = pkc.oid "
- + " AND fkn.oid = fkc.relnamespace AND fkc.oid = fka.attrelid AND fka.attnum = con.conkey[pos.n] AND con.conrelid = fkc.oid "
- + " AND con.contype = 'f' AND con.oid = dep.objid AND pkic.oid = dep.refobjid AND pkic.relkind = 'i' AND dep.classid = 'pg_constraint'::regclass::oid AND dep.refclassid = 'pg_class'::regclass::oid ";
- if (primarySchema != null && !"".equals(primarySchema)) {
- sql += " AND pkn.nspname = " + escapeQuotes(primarySchema);
- }
- if (foreignSchema != null && !"".equals(foreignSchema)) {
- sql += " AND fkn.nspname = " + escapeQuotes(foreignSchema);
- }
- if (primaryTable != null && !"".equals(primaryTable)) {
- sql += " AND pkc.relname = " + escapeQuotes(primaryTable);
- }
- if (foreignTable != null && !"".equals(foreignTable)) {
- sql += " AND fkc.relname = " + escapeQuotes(foreignTable);
- }
-
- if (primaryTable != null) {
- sql += " ORDER BY fkn.nspname,fkc.relname,con.conname,pos.n";
- } else {
- sql += " ORDER BY pkn.nspname,pkc.relname, con.conname,pos.n";
- }
-
- return createMetaDataStatement().executeQuery(sql);
- } else if (connection.haveMinimumServerVersion(ServerVersion.v7_3)) {
- select = "SELECT DISTINCT n1.nspname as pnspname,n2.nspname as fnspname, ";
- from = " FROM pg_catalog.pg_namespace n1 "
- + " JOIN pg_catalog.pg_class c1 ON (c1.relnamespace = n1.oid) "
- + " JOIN pg_catalog.pg_index i ON (c1.oid=i.indrelid) "
- + " JOIN pg_catalog.pg_class ic ON (i.indexrelid=ic.oid) "
- + " JOIN pg_catalog.pg_attribute a ON (ic.oid=a.attrelid), "
- + " pg_catalog.pg_namespace n2 "
- + " JOIN pg_catalog.pg_class c2 ON (c2.relnamespace=n2.oid), "
- + " pg_catalog.pg_trigger t1 "
- + " JOIN pg_catalog.pg_proc p1 ON (t1.tgfoid=p1.oid), "
- + " pg_catalog.pg_trigger t2 "
- + " JOIN pg_catalog.pg_proc p2 ON (t2.tgfoid=p2.oid) ";
- if (primarySchema != null && !"".equals(primarySchema)) {
- where += " AND n1.nspname = " + escapeQuotes(primarySchema);
- }
- if (foreignSchema != null && !"".equals(foreignSchema)) {
- where += " AND n2.nspname = " + escapeQuotes(foreignSchema);
- }
+ String sql =
+ "SELECT NULL::text AS PKTABLE_CAT, pkn.nspname AS PKTABLE_SCHEM, pkc.relname AS PKTABLE_NAME, pka.attname AS PKCOLUMN_NAME, "
+ + "NULL::text AS FKTABLE_CAT, fkn.nspname AS FKTABLE_SCHEM, fkc.relname AS FKTABLE_NAME, fka.attname AS FKCOLUMN_NAME, "
+ + "pos.n AS KEY_SEQ, "
+ + "CASE con.confupdtype "
+ + " WHEN 'c' THEN " + DatabaseMetaData.importedKeyCascade
+ + " WHEN 'n' THEN " + DatabaseMetaData.importedKeySetNull
+ + " WHEN 'd' THEN " + DatabaseMetaData.importedKeySetDefault
+ + " WHEN 'r' THEN " + DatabaseMetaData.importedKeyRestrict
+ + " WHEN 'p' THEN " + DatabaseMetaData.importedKeyRestrict
+ + " WHEN 'a' THEN " + DatabaseMetaData.importedKeyNoAction
+ + " ELSE NULL END AS UPDATE_RULE, "
+ + "CASE con.confdeltype "
+ + " WHEN 'c' THEN " + DatabaseMetaData.importedKeyCascade
+ + " WHEN 'n' THEN " + DatabaseMetaData.importedKeySetNull
+ + " WHEN 'd' THEN " + DatabaseMetaData.importedKeySetDefault
+ + " WHEN 'r' THEN " + DatabaseMetaData.importedKeyRestrict
+ + " WHEN 'p' THEN " + DatabaseMetaData.importedKeyRestrict
+ + " WHEN 'a' THEN " + DatabaseMetaData.importedKeyNoAction
+ + " ELSE NULL END AS DELETE_RULE, "
+ + "con.conname AS FK_NAME, pkic.relname AS PK_NAME, "
+ + "CASE "
+ + " WHEN con.condeferrable AND con.condeferred THEN "
+ + DatabaseMetaData.importedKeyInitiallyDeferred
+ + " WHEN con.condeferrable THEN " + DatabaseMetaData.importedKeyInitiallyImmediate
+ + " ELSE " + DatabaseMetaData.importedKeyNotDeferrable
+ + " END AS DEFERRABILITY "
+ + " FROM "
+ + " pg_catalog.pg_namespace pkn, pg_catalog.pg_class pkc, pg_catalog.pg_attribute pka, "
+ + " pg_catalog.pg_namespace fkn, pg_catalog.pg_class fkc, pg_catalog.pg_attribute fka, "
+ + " pg_catalog.pg_constraint con, "
+ + " pg_catalog.generate_series(1, " + getMaxIndexKeys() + ") pos(n), "
+ + " pg_catalog.pg_class pkic";
+ // Starting in Postgres 9.0, pg_constraint was augmented with the conindid column, which
+ // contains the oid of the index supporting the constraint. This makes it unnecessary to do a
+ // further join on pg_depend.
+ if (!connection.haveMinimumServerVersion(ServerVersion.v9_0)) {
+ sql += ", pg_catalog.pg_depend dep ";
+ }
+ sql +=
+ " WHERE pkn.oid = pkc.relnamespace AND pkc.oid = pka.attrelid AND pka.attnum = con.confkey[pos.n] AND con.confrelid = pkc.oid "
+ + " AND fkn.oid = fkc.relnamespace AND fkc.oid = fka.attrelid AND fka.attnum = con.conkey[pos.n] AND con.conrelid = fkc.oid "
+ + " AND con.contype = 'f' AND pkic.relkind = 'i' ";
+ if (!connection.haveMinimumServerVersion(ServerVersion.v9_0)) {
+ sql += " AND con.oid = dep.objid AND pkic.oid = dep.refobjid AND dep.classid = 'pg_constraint'::regclass::oid AND dep.refclassid = 'pg_class'::regclass::oid ";
} else {
- select = "SELECT DISTINCT NULL::text as pnspname, NULL::text as fnspname, ";
- from = " FROM pg_class c1 "
- + " JOIN pg_index i ON (c1.oid=i.indrelid) "
- + " JOIN pg_class ic ON (i.indexrelid=ic.oid) "
- + " JOIN pg_attribute a ON (ic.oid=a.attrelid), "
- + " pg_class c2, "
- + " pg_trigger t1 "
- + " JOIN pg_proc p1 ON (t1.tgfoid=p1.oid), "
- + " pg_trigger t2 "
- + " JOIN pg_proc p2 ON (t2.tgfoid=p2.oid) ";
- }
-
- String sql = select
- + "c1.relname as prelname, "
- + "c2.relname as frelname, "
- + "t1.tgconstrname, "
- + "a.attnum as keyseq, "
- + "ic.relname as fkeyname, "
- + "t1.tgdeferrable, "
- + "t1.tginitdeferred, "
- + "t1.tgnargs,t1.tgargs, "
- + "p1.proname as updaterule, "
- + "p2.proname as deleterule "
- + from
- + "WHERE "
- // isolate the update rule
- + "(t1.tgrelid=c1.oid "
- + "AND t1.tgisconstraint "
- + "AND t1.tgconstrrelid=c2.oid "
- + "AND p1.proname ~ '^RI_FKey_.*_upd$') "
-
- + "AND "
- // isolate the delete rule
- + "(t2.tgrelid=c1.oid "
- + "AND t2.tgisconstraint "
- + "AND t2.tgconstrrelid=c2.oid "
- + "AND p2.proname ~ '^RI_FKey_.*_del$') "
-
- + "AND i.indisprimary "
- + where;
+ sql += " AND pkic.oid = con.conindid ";
+ }
- if (primaryTable != null) {
- sql += "AND c1.relname=" + escapeQuotes(primaryTable);
+ if (primarySchema != null && !primarySchema.isEmpty()) {
+ sql += " AND pkn.nspname = " + escapeQuotes(primarySchema);
}
- if (foreignTable != null) {
- sql += "AND c2.relname=" + escapeQuotes(foreignTable);
+ if (foreignSchema != null && !foreignSchema.isEmpty()) {
+ sql += " AND fkn.nspname = " + escapeQuotes(foreignSchema);
+ }
+ if (primaryTable != null && !primaryTable.isEmpty()) {
+ sql += " AND pkc.relname = " + escapeQuotes(primaryTable);
+ }
+ if (foreignTable != null && !foreignTable.isEmpty()) {
+ sql += " AND fkc.relname = " + escapeQuotes(foreignTable);
}
-
- sql += "ORDER BY ";
-
- // orderby is as follows getExported, orders by FKTABLE,
- // getImported orders by PKTABLE
- // getCrossReference orders by FKTABLE, so this should work for both,
- // since when getting crossreference, primaryTable will be defined
if (primaryTable != null) {
- if (connection.haveMinimumServerVersion(ServerVersion.v7_3)) {
- sql += "fnspname,";
- }
- sql += "frelname";
+ sql += " ORDER BY fkn.nspname,fkc.relname,con.conname,pos.n";
} else {
- if (connection.haveMinimumServerVersion(ServerVersion.v7_3)) {
- sql += "pnspname,";
- }
- sql += "prelname";
- }
-
- sql += ",keyseq";
-
- Statement stmt = connection.createStatement();
- ResultSet rs = stmt.executeQuery(sql);
-
- // returns the following columns
- // and some example data with a table defined as follows
-
- // create table people ( id int primary key);
- // create table policy ( id int primary key);
- // create table users ( id int primary key, people_id int references people(id), policy_id int
- // references policy(id))
-
- // prelname | frelname | tgconstrname | keyseq | fkeyName | tgdeferrable | tginitdeferred
- // 1 | 2 | 3 | 4 | 5 | 6 | 7
-
- // people | users | <unnamed> | 1 | people_pkey | f | f
-
- // | tgnargs | tgargs | updaterule | deleterule
- // | 8 | 9 | 10 | 11
- // | 6 | <unnamed>\000users\000people\000UNSPECIFIED\000people_id\000id\000 |
- // RI_FKey_noaction_upd | RI_FKey_noaction_del
-
- List<byte[][]> tuples = new ArrayList<byte[][]>();
-
- while (rs.next()) {
- byte tuple[][] = new byte[14][];
-
- tuple[1] = rs.getBytes(1); // PKTABLE_SCHEM
- tuple[5] = rs.getBytes(2); // FKTABLE_SCHEM
- tuple[2] = rs.getBytes(3); // PKTABLE_NAME
- tuple[6] = rs.getBytes(4); // FKTABLE_NAME
- String fKeyName = rs.getString(5);
- String updateRule = rs.getString(12);
-
- if (updateRule != null) {
- // Rules look like this RI_FKey_noaction_del so we want to pull out the part between the
- // 'Key_' and the last '_' s
-
- String rule = updateRule.substring(8, updateRule.length() - 4);
-
- int action = java.sql.DatabaseMetaData.importedKeyNoAction;
-
- if (rule == null || "noaction".equals(rule)) {
- action = java.sql.DatabaseMetaData.importedKeyNoAction;
- }
- if ("cascade".equals(rule)) {
- action = java.sql.DatabaseMetaData.importedKeyCascade;
- } else if ("setnull".equals(rule)) {
- action = java.sql.DatabaseMetaData.importedKeySetNull;
- } else if ("setdefault".equals(rule)) {
- action = java.sql.DatabaseMetaData.importedKeySetDefault;
- } else if ("restrict".equals(rule)) {
- action = java.sql.DatabaseMetaData.importedKeyRestrict;
- }
-
- tuple[9] = connection.encodeString(Integer.toString(action));
-
- }
-
- String deleteRule = rs.getString(13);
-
- if (deleteRule != null) {
-
- String rule = deleteRule.substring(8, deleteRule.length() - 4);
-
- int action = java.sql.DatabaseMetaData.importedKeyNoAction;
- if ("cascade".equals(rule)) {
- action = java.sql.DatabaseMetaData.importedKeyCascade;
- } else if ("setnull".equals(rule)) {
- action = java.sql.DatabaseMetaData.importedKeySetNull;
- } else if ("setdefault".equals(rule)) {
- action = java.sql.DatabaseMetaData.importedKeySetDefault;
- } else if ("restrict".equals(rule)) {
- action = java.sql.DatabaseMetaData.importedKeyRestrict;
- }
- tuple[10] = connection.encodeString(Integer.toString(action));
- }
-
-
- int keySequence = rs.getInt(6); // KEY_SEQ
-
- // Parse the tgargs data
- String fkeyColumn = "";
- String pkeyColumn = "";
- String fkName = "";
- // Note, I am guessing at most of this, but it should be close
- // if not, please correct
- // the keys are in pairs and start after the first four arguments
- // the arguments are separated by \000
-
- String targs = rs.getString(11);
-
- // args look like this
- // <unnamed>\000ww\000vv\000UNSPECIFIED\000m\000a\000n\000b\000
- // we are primarily interested in the column names which are the last items in the string
-
- List<String> tokens = tokenize(targs, "\\000");
- if (!tokens.isEmpty()) {
- fkName = tokens.get(0);
- }
-
- if (fkName.startsWith("<unnamed>")) {
- fkName = targs;
- }
-
- int element = 4 + (keySequence - 1) * 2;
- if (tokens.size() > element) {
- fkeyColumn = tokens.get(element);
- }
-
- element++;
- if (tokens.size() > element) {
- pkeyColumn = tokens.get(element);
- }
-
- tuple[3] = connection.encodeString(pkeyColumn); // PKCOLUMN_NAME
- tuple[7] = connection.encodeString(fkeyColumn); // FKCOLUMN_NAME
-
- tuple[8] = rs.getBytes(6); // KEY_SEQ
- // FK_NAME this will give us a unique name for the foreign key
- tuple[11] = connection.encodeString(fkName);
- tuple[12] = rs.getBytes(7); // PK_NAME
-
- // DEFERRABILITY
- int deferrability = java.sql.DatabaseMetaData.importedKeyNotDeferrable;
- boolean deferrable = rs.getBoolean(8);
- boolean initiallyDeferred = rs.getBoolean(9);
- if (deferrable) {
- if (initiallyDeferred) {
- deferrability = java.sql.DatabaseMetaData.importedKeyInitiallyDeferred;
- } else {
- deferrability = java.sql.DatabaseMetaData.importedKeyInitiallyImmediate;
- }
- }
- tuple[13] = connection.encodeString(Integer.toString(deferrability));
-
- tuples.add(tuple);
+ sql += " ORDER BY pkn.nspname,pkc.relname, con.conname,pos.n";
}
- rs.close();
- stmt.close();
- return ((BaseStatement) createMetaDataStatement()).createDriverResultSet(f, tuples);
+ return createMetaDataStatement().executeQuery(sql);
}
public ResultSet getImportedKeys(String catalog, String schema, String table)
@@ -2731,7 +2209,7 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
public ResultSet getTypeInfo() throws SQLException {
- Field f[] = new Field[18];
+ Field[] f = new Field[18];
List<byte[][]> v = new ArrayList<byte[][]>(); // The new ResultSet tuple stuff
f[0] = new Field("TYPE_NAME", Oid.VARCHAR);
@@ -2754,28 +2232,23 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
f[17] = new Field("NUM_PREC_RADIX", Oid.INT4);
String sql;
- if (connection.haveMinimumServerVersion(ServerVersion.v7_3)) {
- sql = "SELECT t.typname,t.oid FROM pg_catalog.pg_type t"
+ sql = "SELECT t.typname,t.oid FROM pg_catalog.pg_type t"
+ " JOIN pg_catalog.pg_namespace n ON (t.typnamespace = n.oid) "
+ " WHERE n.nspname != 'pg_toast'";
- } else {
- sql = "SELECT typname,oid FROM pg_type"
- + " WHERE NOT (typname ~ '^pg_toast_') ";
- }
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery(sql);
// cache some results, this will keep memory usage down, and speed
// things up a little.
- byte bZero[] = connection.encodeString("0");
- byte b10[] = connection.encodeString("10");
- byte bf[] = connection.encodeString("f");
- byte bt[] = connection.encodeString("t");
- byte bliteral[] = connection.encodeString("'");
- byte bNullable[] =
- connection.encodeString(Integer.toString(java.sql.DatabaseMetaData.typeNullable));
- byte bSearchable[] =
- connection.encodeString(Integer.toString(java.sql.DatabaseMetaData.typeSearchable));
+ byte[] bZero = connection.encodeString("0");
+ byte[] b10 = connection.encodeString("10");
+ byte[] bf = connection.encodeString("f");
+ byte[] bt = connection.encodeString("t");
+ byte[] bliteral = connection.encodeString("'");
+ byte[] bNullable =
+ connection.encodeString(Integer.toString(java.sql.DatabaseMetaData.typeNullable));
+ byte[] bSearchable =
+ connection.encodeString(Integer.toString(java.sql.DatabaseMetaData.typeSearchable));
while (rs.next()) {
byte[][] tuple = new byte[18][];
@@ -2848,114 +2321,84 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
String sql;
if (connection.haveMinimumServerVersion(ServerVersion.v8_3)) {
sql = "SELECT NULL AS TABLE_CAT, n.nspname AS TABLE_SCHEM, "
- + " ct.relname AS TABLE_NAME, NOT i.indisunique AS NON_UNIQUE, "
- + " NULL AS INDEX_QUALIFIER, ci.relname AS INDEX_NAME, "
- + " CASE i.indisclustered "
- + " WHEN true THEN " + java.sql.DatabaseMetaData.tableIndexClustered
- + " ELSE CASE am.amname "
- + " WHEN 'hash' THEN " + java.sql.DatabaseMetaData.tableIndexHashed
- + " ELSE " + java.sql.DatabaseMetaData.tableIndexOther
- + " END "
- + " END AS TYPE, "
- + " (i.keys).n AS ORDINAL_POSITION, "
- + " trim(both '\"' from pg_catalog.pg_get_indexdef(ci.oid, (i.keys).n, false)) AS COLUMN_NAME, "
- // TODO: Implement ASC_OR_DESC for PostgreSQL 9.6+
- + (connection.haveMinimumServerVersion(ServerVersion.v9_6)
- ? " CASE am.amname "
- + " WHEN 'btree' THEN CASE i.indoption[(i.keys).n - 1] & 1 "
- + " WHEN 1 THEN 'D' "
- + " ELSE 'A' "
- + " END "
- + " ELSE NULL "
- + " END AS ASC_OR_DESC, "
- : " CASE am.amcanorder "
- + " WHEN true THEN CASE i.indoption[(i.keys).n - 1] & 1 "
- + " WHEN 1 THEN 'D' "
- + " ELSE 'A' "
- + " END "
- + " ELSE NULL "
- + " END AS ASC_OR_DESC, ")
- + " ci.reltuples AS CARDINALITY, "
- + " ci.relpages AS PAGES, "
- + " pg_catalog.pg_get_expr(i.indpred, i.indrelid) AS FILTER_CONDITION "
- + "FROM pg_catalog.pg_class ct "
- + " JOIN pg_catalog.pg_namespace n ON (ct.relnamespace = n.oid) "
- + " JOIN (SELECT i.indexrelid, i.indrelid, i.indoption, "
- + " i.indisunique, i.indisclustered, i.indpred, "
- + " i.indexprs, "
- + " information_schema._pg_expandarray(i.indkey) AS keys "
- + " FROM pg_catalog.pg_index i) i "
- + " ON (ct.oid = i.indrelid) "
- + " JOIN pg_catalog.pg_class ci ON (ci.oid = i.indexrelid) "
- + " JOIN pg_catalog.pg_am am ON (ci.relam = am.oid) "
- + "WHERE true ";
-
- if (schema != null && !"".equals(schema)) {
+ + " ct.relname AS TABLE_NAME, NOT i.indisunique AS NON_UNIQUE, "
+ + " NULL AS INDEX_QUALIFIER, ci.relname AS INDEX_NAME, "
+ + " CASE i.indisclustered "
+ + " WHEN true THEN " + java.sql.DatabaseMetaData.tableIndexClustered
+ + " ELSE CASE am.amname "
+ + " WHEN 'hash' THEN " + java.sql.DatabaseMetaData.tableIndexHashed
+ + " ELSE " + java.sql.DatabaseMetaData.tableIndexOther
+ + " END "
+ + " END AS TYPE, "
+ + " (i.keys).n AS ORDINAL_POSITION, "
+ + " trim(both '\"' from pg_catalog.pg_get_indexdef(ci.oid, (i.keys).n, false)) AS COLUMN_NAME, "
+ + (connection.haveMinimumServerVersion(ServerVersion.v9_6)
+ ? " CASE am.amname "
+ + " WHEN 'btree' THEN CASE i.indoption[(i.keys).n - 1] & 1 "
+ + " WHEN 1 THEN 'D' "
+ + " ELSE 'A' "
+ + " END "
+ + " ELSE NULL "
+ + " END AS ASC_OR_DESC, "
+ : " CASE am.amcanorder "
+ + " WHEN true THEN CASE i.indoption[(i.keys).n - 1] & 1 "
+ + " WHEN 1 THEN 'D' "
+ + " ELSE 'A' "
+ + " END "
+ + " ELSE NULL "
+ + " END AS ASC_OR_DESC, ")
+ + " ci.reltuples AS CARDINALITY, "
+ + " ci.relpages AS PAGES, "
+ + " pg_catalog.pg_get_expr(i.indpred, i.indrelid) AS FILTER_CONDITION "
+ + "FROM pg_catalog.pg_class ct "
+ + " JOIN pg_catalog.pg_namespace n ON (ct.relnamespace = n.oid) "
+ + " JOIN (SELECT i.indexrelid, i.indrelid, i.indoption, "
+ + " i.indisunique, i.indisclustered, i.indpred, "
+ + " i.indexprs, "
+ + " information_schema._pg_expandarray(i.indkey) AS keys "
+ + " FROM pg_catalog.pg_index i) i "
+ + " ON (ct.oid = i.indrelid) "
+ + " JOIN pg_catalog.pg_class ci ON (ci.oid = i.indexrelid) "
+ + " JOIN pg_catalog.pg_am am ON (ci.relam = am.oid) "
+ + "WHERE true ";
+
+ if (schema != null && !schema.isEmpty()) {
sql += " AND n.nspname = " + escapeQuotes(schema);
}
} else {
String select;
String from;
- String where = "";
-
- if (connection.haveMinimumServerVersion(ServerVersion.v7_3)) {
- select = "SELECT NULL AS TABLE_CAT, n.nspname AS TABLE_SCHEM, ";
- from =
- " FROM pg_catalog.pg_namespace n, pg_catalog.pg_class ct, pg_catalog.pg_class ci, pg_catalog.pg_attribute a, pg_catalog.pg_am am ";
- where = " AND n.oid = ct.relnamespace ";
-
- if (!connection.haveMinimumServerVersion(ServerVersion.v7_4)) {
- from +=
- ", pg_catalog.pg_attribute ai, pg_catalog.pg_index i LEFT JOIN pg_catalog.pg_proc ip ON (i.indproc = ip.oid) ";
- where += " AND ai.attnum = i.indkey[0] AND ai.attrelid = ct.oid ";
- } else {
- from += ", pg_catalog.pg_index i ";
- }
- if (schema != null && !"".equals(schema)) {
- where += " AND n.nspname = " + escapeQuotes(schema);
- }
- } else {
- select = "SELECT NULL AS TABLE_CAT, NULL AS TABLE_SCHEM, ";
- from =
- " FROM pg_class ct, pg_class ci, pg_attribute a, pg_am am, pg_attribute ai, pg_index i LEFT JOIN pg_proc ip ON (i.indproc = ip.oid) ";
- where = " AND ai.attnum = i.indkey[0] AND ai.attrelid = ct.oid ";
- }
+ String where;
- sql = select
- + " ct.relname AS TABLE_NAME, NOT i.indisunique AS NON_UNIQUE, NULL AS INDEX_QUALIFIER, ci.relname AS INDEX_NAME, "
- + " CASE i.indisclustered "
- + " WHEN true THEN " + java.sql.DatabaseMetaData.tableIndexClustered
- + " ELSE CASE am.amname "
- + " WHEN 'hash' THEN " + java.sql.DatabaseMetaData.tableIndexHashed
- + " ELSE " + java.sql.DatabaseMetaData.tableIndexOther
- + " END "
- + " END AS TYPE, "
- + " a.attnum AS ORDINAL_POSITION, ";
-
- if (connection.haveMinimumServerVersion(ServerVersion.v7_4)) {
- sql +=
- " CASE WHEN i.indexprs IS NULL THEN a.attname ELSE pg_catalog.pg_get_indexdef(ci.oid,a.attnum,false) END AS COLUMN_NAME, ";
- } else {
- sql +=
- " CASE i.indproc WHEN 0 THEN a.attname ELSE ip.proname || '(' || ai.attname || ')' END AS COLUMN_NAME, ";
- }
-
-
- sql += " NULL AS ASC_OR_DESC, "
- + " ci.reltuples AS CARDINALITY, "
- + " ci.relpages AS PAGES, ";
+ select = "SELECT NULL AS TABLE_CAT, n.nspname AS TABLE_SCHEM, ";
+ from = " FROM pg_catalog.pg_namespace n, pg_catalog.pg_class ct, pg_catalog.pg_class ci, "
+ + " pg_catalog.pg_attribute a, pg_catalog.pg_am am ";
+ where = " AND n.oid = ct.relnamespace ";
+ from += ", pg_catalog.pg_index i ";
- if (connection.haveMinimumServerVersion(ServerVersion.v7_3)) {
- sql += " pg_catalog.pg_get_expr(i.indpred, i.indrelid) AS FILTER_CONDITION ";
- } else if (connection.haveMinimumServerVersion(ServerVersion.v7_2)) {
- sql += " pg_get_expr(i.indpred, i.indrelid) AS FILTER_CONDITION ";
- } else {
- sql += " NULL AS FILTER_CONDITION ";
+ if (schema != null && !schema.isEmpty()) {
+ where += " AND n.nspname = " + escapeQuotes(schema);
}
- sql += from
- + " WHERE ct.oid=i.indrelid AND ci.oid=i.indexrelid AND a.attrelid=ci.oid AND ci.relam=am.oid "
- + where;
+ sql = select
+ + " ct.relname AS TABLE_NAME, NOT i.indisunique AS NON_UNIQUE, NULL AS INDEX_QUALIFIER, ci.relname AS INDEX_NAME, "
+ + " CASE i.indisclustered "
+ + " WHEN true THEN " + java.sql.DatabaseMetaData.tableIndexClustered
+ + " ELSE CASE am.amname "
+ + " WHEN 'hash' THEN " + java.sql.DatabaseMetaData.tableIndexHashed
+ + " ELSE " + java.sql.DatabaseMetaData.tableIndexOther
+ + " END "
+ + " END AS TYPE, "
+ + " a.attnum AS ORDINAL_POSITION, "
+ + " CASE WHEN i.indexprs IS NULL THEN a.attname "
+ + " ELSE pg_catalog.pg_get_indexdef(ci.oid,a.attnum,false) END AS COLUMN_NAME, "
+ + " NULL AS ASC_OR_DESC, "
+ + " ci.reltuples AS CARDINALITY, "
+ + " ci.relpages AS PAGES, "
+ + " pg_catalog.pg_get_expr(i.indpred, i.indrelid) AS FILTER_CONDITION "
+ + from
+ + " WHERE ct.oid=i.indrelid AND ci.oid=i.indexrelid AND a.attrelid=ci.oid AND ci.relam=am.oid "
+ + where;
}
sql += " AND ct.relname = " + escapeQuotes(tableName);
@@ -2964,30 +2407,8 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
sql += " AND i.indisunique ";
}
sql += " ORDER BY NON_UNIQUE, TYPE, INDEX_NAME, ORDINAL_POSITION ";
- return createMetaDataStatement().executeQuery(sql);
- }
- /**
- * Tokenize based on words not on single characters.
- */
- private static List<String> tokenize(String input, String delimiter) {
- List<String> result = new ArrayList<String>();
- int start = 0;
- int end = input.length();
- int delimiterSize = delimiter.length();
-
- while (start < end) {
- int delimiterIndex = input.indexOf(delimiter, start);
- if (delimiterIndex < 0) {
- result.add(input.substring(start));
- break;
- } else {
- String token = input.substring(start, delimiterIndex);
- result.add(token);
- start = delimiterIndex + delimiterSize;
- }
- }
- return result;
+ return createMetaDataStatement().executeQuery(sql);
}
// ** JDBC 2 Extensions **
@@ -3065,33 +2486,35 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
+ " end as data_type, pg_catalog.obj_description(t.oid, 'pg_type') "
+ "as remarks, CASE WHEN t.typtype = 'd' then (select CASE";
+ StringBuilder sqlwhen = new StringBuilder();
for (Iterator<String> i = connection.getTypeInfo().getPGTypeNamesWithSQLTypes(); i.hasNext(); ) {
String pgType = i.next();
int sqlType = connection.getTypeInfo().getSQLType(pgType);
- sql += " when typname = " + escapeQuotes(pgType) + " then " + sqlType;
+ sqlwhen.append(" when typname = ").append(escapeQuotes(pgType)).append(" then ").append(sqlType);
}
+ sql += sqlwhen.toString();
sql += " else " + java.sql.Types.OTHER + " end from pg_type where oid=t.typbasetype) "
+ "else null end as base_type "
+ "from pg_catalog.pg_type t, pg_catalog.pg_namespace n where t.typnamespace = n.oid and n.nspname != 'pg_catalog' and n.nspname != 'pg_toast'";
- String toAdd = "";
+ StringBuilder toAdd = new StringBuilder();
if (types != null) {
- toAdd += " and (false ";
+ toAdd.append(" and (false ");
for (int type : types) {
switch (type) {
case Types.STRUCT:
- toAdd += " or t.typtype = 'c'";
+ toAdd.append(" or t.typtype = 'c'");
break;
case Types.DISTINCT:
- toAdd += " or t.typtype = 'd'";
+ toAdd.append(" or t.typtype = 'd'");
break;
}
}
- toAdd += " ) ";
+ toAdd.append(" ) ");
} else {
- toAdd += " and t.typtype IN ('c','d') ";
+ toAdd.append(" and t.typtype IN ('c','d') ");
}
// spec says that if typeNamePattern is a fully qualified name
// then the schema and catalog are ignored
@@ -3113,34 +2536,25 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
// strip out just the typeName
typeNamePattern = typeNamePattern.substring(secondQualifier + 1);
}
- toAdd += " and t.typname like " + escapeQuotes(typeNamePattern);
+ toAdd.append(" and t.typname like ").append(escapeQuotes(typeNamePattern));
}
// schemaPattern may have been modified above
if (schemaPattern != null) {
- toAdd += " and n.nspname like " + escapeQuotes(schemaPattern);
+ toAdd.append(" and n.nspname like ").append(escapeQuotes(schemaPattern));
}
- sql += toAdd;
+ sql += toAdd.toString();
sql += " order by data_type, type_schem, type_name";
return createMetaDataStatement().executeQuery(sql);
}
- public java.sql.Connection getConnection() throws SQLException {
+ @Override
+ public Connection getConnection() throws SQLException {
return connection;
}
- /* I don't find these in the spec!?! */
-
- public boolean rowChangesAreDetected(int type) throws SQLException {
- return false;
- }
-
- public boolean rowChangesAreVisible(int type) throws SQLException {
- return false;
- }
-
- protected java.sql.Statement createMetaDataStatement() throws SQLException {
+ protected Statement createMetaDataStatement() throws SQLException {
return connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
}
@@ -3153,24 +2567,24 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
return true;
}
+ @Override
public RowIdLifetime getRowIdLifetime() throws SQLException {
throw org.postgresql.Driver.notImplemented(this.getClass(), "getRowIdLifetime()");
}
- public ResultSet getSchemas(String catalog, String schemaPattern) throws SQLException {
- return getSchemas(getJDBCMajorVersion(), catalog, schemaPattern);
- }
-
+ @Override
public boolean supportsStoredFunctionsUsingCallSyntax() throws SQLException {
return true;
}
+ @Override
public boolean autoCommitFailureClosesAllResultSets() throws SQLException {
return false;
}
+ @Override
public ResultSet getClientInfoProperties() throws SQLException {
- Field f[] = new Field[4];
+ Field[] f = new Field[4];
f[0] = new Field("NAME", Oid.VARCHAR);
f[1] = new Field("MAX_LEN", Oid.INT4);
f[2] = new Field("DEFAULT_VALUE", Oid.VARCHAR);
@@ -3191,10 +2605,6 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
return ((BaseStatement) createMetaDataStatement()).createDriverResultSet(f, v);
}
- public boolean providesQueryObjectGenerator() throws SQLException {
- return false;
- }
-
public boolean isWrapperFor(Class<?> iface) throws SQLException {
return iface.isAssignableFrom(getClass());
}
@@ -3208,18 +2618,47 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
public ResultSet getFunctions(String catalog, String schemaPattern, String functionNamePattern)
throws SQLException {
- return getProcedures(getJDBCMajorVersion(), catalog, schemaPattern, functionNamePattern);
- }
- public ResultSet getFunctionColumns(String catalog, String schemaPattern,
- String functionNamePattern, String columnNamePattern) throws SQLException {
- return getProcedureColumns(getJDBCMajorVersion(), catalog, schemaPattern, functionNamePattern,
- columnNamePattern);
+ // The pg_get_function_result only exists 8.4 or later
+ boolean pgFuncResultExists = connection.haveMinimumServerVersion(ServerVersion.v8_4);
+
+ // Use query that support pg_get_function_result to get function result, else unknown is defaulted
+ String funcTypeSql = DatabaseMetaData.functionResultUnknown + " ";
+ if (pgFuncResultExists) {
+ funcTypeSql = " CASE "
+ + " WHEN (format_type(p.prorettype, null) = 'unknown') THEN " + DatabaseMetaData.functionResultUnknown
+ + " WHEN "
+ + " (substring(pg_get_function_result(p.oid) from 0 for 6) = 'TABLE') OR "
+ + " (substring(pg_get_function_result(p.oid) from 0 for 6) = 'SETOF') THEN " + DatabaseMetaData.functionReturnsTable
+ + " ELSE " + DatabaseMetaData.functionNoTable
+ + " END ";
+ }
+
+ // Build query and result
+ String sql;
+ sql = "SELECT current_database() AS FUNCTION_CAT, n.nspname AS FUNCTION_SCHEM, p.proname AS FUNCTION_NAME, "
+ + " d.description AS REMARKS, "
+ + funcTypeSql + " AS FUNCTION_TYPE, "
+ + " p.proname || '_' || p.oid AS SPECIFIC_NAME "
+ + "FROM pg_catalog.pg_proc p "
+ + "INNER JOIN pg_catalog.pg_namespace n ON p.pronamespace=n.oid "
+ + "LEFT JOIN pg_catalog.pg_description d ON p.oid=d.objoid "
+ + "WHERE pg_function_is_visible(p.oid) ";
+ if (schemaPattern != null && !schemaPattern.isEmpty()) {
+ sql += " AND n.nspname LIKE " + escapeQuotes(schemaPattern);
+ }
+ if (functionNamePattern != null && !functionNamePattern.isEmpty()) {
+ sql += " AND p.proname LIKE " + escapeQuotes(functionNamePattern);
+ }
+ sql += " ORDER BY FUNCTION_SCHEM, FUNCTION_NAME, p.oid::text ";
+
+ return createMetaDataStatement().executeQuery(sql);
}
- public int getJDBCMajorVersion() throws SQLException {
- // FIXME: dependent on JDBC version
- return 4;
+ public ResultSet getFunctionColumns(String catalog, String schemaPattern,
+ String functionNamePattern, String columnNamePattern)
+ throws SQLException {
+ return getProcedureColumns(catalog, schemaPattern, functionNamePattern, columnNamePattern);
}
public ResultSet getPseudoColumns(String catalog, String schemaPattern, String tableNamePattern,
@@ -3233,7 +2672,7 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
}
public boolean supportsSavepoints() throws SQLException {
- return connection.haveMinimumServerVersion(ServerVersion.v8_0);
+ return true;
}
public boolean supportsNamedParameters() throws SQLException {
@@ -3248,7 +2687,7 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
// We don't support returning generated keys by column index,
// but that should be a rarer case than the ones we do support.
//
- return connection.haveMinimumServerVersion(ServerVersion.v8_2);
+ return true;
}
public ResultSet getSuperTypes(String catalog, String schemaPattern, String typeNamePattern)
@@ -3277,20 +2716,28 @@ public class PgDatabaseMetaData implements DatabaseMetaData {
return ResultSet.HOLD_CURSORS_OVER_COMMIT;
}
+ @Override
public int getDatabaseMajorVersion() throws SQLException {
return connection.getServerMajorVersion();
}
+ @Override
public int getDatabaseMinorVersion() throws SQLException {
return connection.getServerMinorVersion();
}
- public int getJDBCMinorVersion() throws SQLException {
- return 0; // This class implements JDBC 3.0
+ @Override
+ public int getJDBCMajorVersion() {
+ return org.postgresql.util.DriverInfo.JDBC_MAJOR_VERSION;
+ }
+
+ @Override
+ public int getJDBCMinorVersion() {
+ return org.postgresql.util.DriverInfo.JDBC_MINOR_VERSION;
}
public int getSQLStateType() throws SQLException {
- return sqlStateSQL99;
+ return sqlStateSQL;
}
public boolean locatorsUpdateCopy() throws SQLException {
diff --git a/pgjdbc/src/main/java/org/postgresql/jdbc/PgParameterMetaData.java b/pgjdbc/src/main/java/org/postgresql/jdbc/PgParameterMetaData.java
index 1f6a984..d759884 100644
--- a/pgjdbc/src/main/java/org/postgresql/jdbc/PgParameterMetaData.java
+++ b/pgjdbc/src/main/java/org/postgresql/jdbc/PgParameterMetaData.java
@@ -16,9 +16,9 @@ import java.sql.SQLException;
public class PgParameterMetaData implements ParameterMetaData {
private final BaseConnection _connection;
- private final int _oids[];
+ private final int[] _oids;
- public PgParameterMetaData(BaseConnection connection, int oids[]) {
+ public PgParameterMetaData(BaseConnection connection, int[] oids) {
_connection = connection;
_oids = oids;
}
diff --git a/pgjdbc/src/main/java/org/postgresql/jdbc/PgPreparedStatement.java b/pgjdbc/src/main/java/org/postgresql/jdbc/PgPreparedStatement.java
index 4376644..db0a378 100644
--- a/pgjdbc/src/main/java/org/postgresql/jdbc/PgPreparedStatement.java
+++ b/pgjdbc/src/main/java/org/postgresql/jdbc/PgPreparedStatement.java
@@ -13,6 +13,7 @@ import org.postgresql.core.ParameterList;
import org.postgresql.core.Query;
import org.postgresql.core.QueryExecutor;
import org.postgresql.core.ServerVersion;
+import org.postgresql.core.TypeInfo;
import org.postgresql.core.v3.BatchedQuery;
import org.postgresql.largeobject.LargeObject;
import org.postgresql.largeobject.LargeObjectManager;
@@ -25,6 +26,7 @@ import org.postgresql.util.PGTimestamp;
import org.postgresql.util.PGobject;
import org.postgresql.util.PSQLException;
import org.postgresql.util.PSQLState;
+import org.postgresql.util.ReaderInputStream;
import java.io.IOException;
import java.io.InputStream;
@@ -117,12 +119,7 @@ class PgPreparedStatement extends PgStatement implements PreparedStatement {
throw new PSQLException(GT.tr("No results were returned by the query."), PSQLState.NO_DATA);
}
- if (result.getNext() != null) {
- throw new PSQLException(GT.tr("Multiple ResultSets were returned by the query."),
- PSQLState.TOO_MANY_RESULTS);
- }
-
- return result.getResultSet();
+ return getSingleResultSet();
}
public int executeUpdate(String p_sql) throws SQLException {
@@ -134,17 +131,7 @@ class PgPreparedStatement extends PgStatement implements PreparedStatement {
public int executeUpdate() throws SQLException {
executeWithFlags(QueryExecutor.QUERY_NO_RESULTS);
- ResultWrapper iter = result;
- while (iter != null) {
- if (iter.getResultSet() != null) {
- throw new PSQLException(GT.tr("A result was returned when none was expected."),
- PSQLState.TOO_MANY_RESULTS);
-
- }
- iter = iter.getNext();
- }
-
- return getUpdateCount();
+ return getNoResultUpdateCount();
}
public boolean execute(String p_sql) throws SQLException {
@@ -167,7 +154,10 @@ class PgPreparedStatement extends PgStatement implements PreparedStatement {
execute(preparedQuery, preparedParameters, flags);
- return (result != null && result.getResultSet() != null);
+ synchronized (this) {
+ checkClosed();
+ return (result != null && result.getResultSet() != null);
+ }
} finally {
defaultTimeZone = null;
}
@@ -181,33 +171,16 @@ class PgPreparedStatement extends PgStatement implements PreparedStatement {
}
@Override
- public void close() throws SQLException {
- if (isClosed) {
- return;
- }
-
+ public void closeImpl() throws SQLException {
if (preparedQuery != null) {
- // See #368. We need to prevent closing the same statement twice
- // Otherwise we might "release" a query that someone else is already using
- // In other words, client does .close() as usual, however cleanup thread might fail to observe
- // isClosed=true
- synchronized (preparedQuery) {
- if (!isClosed) {
- ((PgConnection) connection).releaseQuery(preparedQuery);
- }
- }
+ ((PgConnection) connection).releaseQuery(preparedQuery);
}
-
- super.close();
}
public void setNull(int parameterIndex, int sqlType) throws SQLException {
checkClosed();
int oid;
- if (sqlType == Types.BOOLEAN) {
- sqlType = Types.BIT;
- }
switch (sqlType) {
case Types.SQLXML:
oid = Oid.XML;
@@ -251,17 +224,14 @@ class PgPreparedStatement extends PgStatement implements PreparedStatement {
case Types.TIMESTAMP:
oid = Oid.UNSPECIFIED;
break;
+ case Types.BOOLEAN:
case Types.BIT:
oid = Oid.BOOL;
break;
case Types.BINARY:
case Types.VARBINARY:
case Types.LONGVARBINARY:
- if (connection.haveMinimumCompatibleVersion(ServerVersion.v7_2)) {
- oid = Oid.BYTEA;
- } else {
- oid = Oid.OID;
- }
+ oid = Oid.BYTEA;
break;
case Types.BLOB:
case Types.CLOB:
@@ -286,7 +256,8 @@ class PgPreparedStatement extends PgStatement implements PreparedStatement {
public void setBoolean(int parameterIndex, boolean x) throws SQLException {
checkClosed();
- bindString(parameterIndex, x ? "1" : "0", Oid.BOOL);
+ // The key words TRUE and FALSE are the preferred (SQL-compliant) usage.
+ bindLiteral(parameterIndex, x ? "TRUE" : "FALSE", Oid.BOOL);
}
public void setByte(int parameterIndex, byte x) throws SQLException {
@@ -349,12 +320,7 @@ class PgPreparedStatement extends PgStatement implements PreparedStatement {
}
public void setBigDecimal(int parameterIndex, BigDecimal x) throws SQLException {
- checkClosed();
- if (x == null) {
- setNull(parameterIndex, Types.DECIMAL);
- } else {
- bindLiteral(parameterIndex, x.toString(), Oid.NUMERIC);
- }
+ setNumber(parameterIndex, x);
}
public void setString(int parameterIndex, String x) throws SQLException {
@@ -387,20 +353,10 @@ class PgPreparedStatement extends PgStatement implements PreparedStatement {
return;
}
- if (connection.haveMinimumCompatibleVersion(ServerVersion.v7_2)) {
- // Version 7.2 supports the bytea datatype for byte arrays
- byte[] copy = new byte[x.length];
- System.arraycopy(x, 0, copy, 0, x.length);
- preparedParameters.setBytea(parameterIndex, copy, 0, x.length);
- } else {
- // Version 7.1 and earlier support done as LargeObjects
- LargeObjectManager lom = connection.getLargeObjectAPI();
- long oid = lom.createLO();
- LargeObject lob = lom.open(oid);
- lob.write(x);
- lob.close();
- setLong(parameterIndex, oid);
- }
+ // Version 7.2 supports the bytea datatype for byte arrays
+ byte[] copy = new byte[x.length];
+ System.arraycopy(x, 0, copy, 0, x.length);
+ preparedParameters.setBytea(parameterIndex, copy, 0, x.length);
}
public void setDate(int parameterIndex, java.sql.Date x) throws SQLException {
@@ -427,7 +383,6 @@ class PgPreparedStatement extends PgStatement implements PreparedStatement {
PSQLState.INVALID_PARAMETER_VALUE);
}
-
// Version 7.2 supports AsciiStream for all PG text types (char, varchar, text)
// As the spec/javadoc for this method indicate this is to be used for
// large String values (i.e. LONGVARCHAR) PG doesn't have a separate
@@ -463,24 +418,13 @@ class PgPreparedStatement extends PgStatement implements PreparedStatement {
public void setAsciiStream(int parameterIndex, InputStream x, int length) throws SQLException {
checkClosed();
- if (connection.haveMinimumCompatibleVersion(ServerVersion.v7_2)) {
- setCharacterStreamPost71(parameterIndex, x, length, "ASCII");
- } else {
- // Version 7.1 supported only LargeObjects by treating everything
- // as binary data
- setBinaryStream(parameterIndex, x, length);
- }
+ setCharacterStreamPost71(parameterIndex, x, length, "ASCII");
}
public void setUnicodeStream(int parameterIndex, InputStream x, int length) throws SQLException {
checkClosed();
- if (connection.haveMinimumCompatibleVersion(ServerVersion.v7_2)) {
- setCharacterStreamPost71(parameterIndex, x, length, "UTF-8");
- } else {
- // Version 7.1 supported only LargeObjects by treating everything
- // as binary data
- setBinaryStream(parameterIndex, x, length);
- }
+
+ setCharacterStreamPost71(parameterIndex, x, length, "UTF-8");
}
public void setBinaryStream(int parameterIndex, InputStream x, int length) throws SQLException {
@@ -496,41 +440,12 @@ class PgPreparedStatement extends PgStatement implements PreparedStatement {
PSQLState.INVALID_PARAMETER_VALUE);
}
- if (connection.haveMinimumCompatibleVersion(ServerVersion.v7_2)) {
- // Version 7.2 supports BinaryStream for for the PG bytea type
- // As the spec/javadoc for this method indicate this is to be used for
- // large binary values (i.e. LONGVARBINARY) PG doesn't have a separate
- // long binary datatype, but with toast the bytea datatype is capable of
- // handling very large values.
-
- preparedParameters.setBytea(parameterIndex, x, length);
- } else {
- // Version 7.1 only supported streams for LargeObjects
- // but the jdbc spec indicates that streams should be
- // available for LONGVARBINARY instead
- LargeObjectManager lom = connection.getLargeObjectAPI();
- long oid = lom.createLO();
- LargeObject lob = lom.open(oid);
- OutputStream los = lob.getOutputStream();
- try {
- // could be buffered, but then the OutputStream returned by LargeObject
- // is buffered internally anyhow, so there would be no performance
- // boost gained, if anything it would be worse!
- int c = x.read();
- int p = 0;
- while (c > -1 && p < length) {
- los.write(c);
- c = x.read();
- p++;
- }
- los.close();
- } catch (IOException se) {
- throw new PSQLException(GT.tr("Provided InputStream failed."), PSQLState.UNEXPECTED_ERROR,
- se);
- }
- // lob is closed by the stream so don't call lob.close()
- setLong(parameterIndex, oid);
- }
+ // Version 7.2 supports BinaryStream for for the PG bytea type
+ // As the spec/javadoc for this method indicate this is to be used for
+ // large binary values (i.e. LONGVARBINARY) PG doesn't have a separate
+ // long binary datatype, but with toast the bytea datatype is capable of
+ // handling very large values.
+ preparedParameters.setBytea(parameterIndex, x, length);
}
public void clearParameters() throws SQLException {
@@ -570,6 +485,15 @@ class PgPreparedStatement extends PgStatement implements PreparedStatement {
}
}
+ private void setNumber(int parameterIndex, Number x) throws SQLException {
+ checkClosed();
+ if (x == null) {
+ setNull(parameterIndex, Types.DECIMAL);
+ } else {
+ bindLiteral(parameterIndex, x.toString(), Oid.NUMERIC);
+ }
+ }
+
@Override
public void setObject(int parameterIndex, Object in, int targetSqlType, int scale)
throws SQLException {
@@ -580,10 +504,6 @@ class PgPreparedStatement extends PgStatement implements PreparedStatement {
return;
}
- if (targetSqlType == Types.BOOLEAN) {
- targetSqlType = Types.BIT;
- }
-
if (targetSqlType == Types.OTHER && in instanceof UUID
&& connection.haveMinimumServerVersion(ServerVersion.v8_3)) {
setUuid(parameterIndex, (UUID) in);
@@ -623,9 +543,15 @@ class PgPreparedStatement extends PgStatement implements PreparedStatement {
setString(parameterIndex, castToString(in), Oid.BPCHAR);
break;
case Types.VARCHAR:
- case Types.LONGVARCHAR:
setString(parameterIndex, castToString(in), getStringType());
break;
+ case Types.LONGVARCHAR:
+ if (in instanceof InputStream) {
+ preparedParameters.setText(parameterIndex, (InputStream)in);
+ } else {
+ setString(parameterIndex, castToString(in), getStringType());
+ }
+ break;
case Types.DATE:
if (in instanceof java.sql.Date) {
setDate(parameterIndex, (java.sql.Date) in);
@@ -696,8 +622,9 @@ class PgPreparedStatement extends PgStatement implements PreparedStatement {
}
break;
//#endif
+ case Types.BOOLEAN:
case Types.BIT:
- setBoolean(parameterIndex, castToBoolean(in));
+ setBoolean(parameterIndex, BooleanTypeUtil.castToBoolean(in));
break;
case Types.BINARY:
case Types.VARBINARY:
@@ -730,6 +657,8 @@ class PgPreparedStatement extends PgStatement implements PreparedStatement {
case Types.ARRAY:
if (in instanceof Array) {
setArray(parameterIndex, (Array) in);
+ } else if (PrimitiveArraySupport.isSupportedPrimitiveArray(in)) {
+ setPrimitiveArray(parameterIndex, in);
} else {
throw new PSQLException(
GT.tr("Cannot cast an instance of {0} to type {1}",
@@ -755,6 +684,21 @@ class PgPreparedStatement extends PgStatement implements PreparedStatement {
}
}
+ private <A> void setPrimitiveArray(int parameterIndex, A in) throws SQLException {
+ final PrimitiveArraySupport<A> arrayToString = PrimitiveArraySupport.getArraySupport(in);
+
+ final TypeInfo typeInfo = connection.getTypeInfo();
+
+ final int oid = arrayToString.getDefaultArrayTypeOid(typeInfo);
+
+ if (arrayToString.supportBinaryRepresentation() && connection.getPreferQueryMode() != PreferQueryMode.SIMPLE) {
+ bindBytes(parameterIndex, arrayToString.toBinaryRepresentation(connection, in), oid);
+ } else {
+ final char delim = typeInfo.getArrayDelimiter(oid);
+ setString(parameterIndex, arrayToString.toArrayString(delim, in), oid);
+ }
+ }
+
private static String asString(final Clob in) throws SQLException {
return in.getSubString(1, (int) in.length());
}
@@ -924,38 +868,6 @@ class PgPreparedStatement extends PgStatement implements PreparedStatement {
throw cannotCastException(in.getClass().getName(), "BigDecimal");
}
- private static boolean castToBoolean(final Object in) throws SQLException {
- try {
- if (in instanceof String) {
- return ((String) in).equalsIgnoreCase("true") || ((String) in).equals("1")
- || ((String) in).equalsIgnoreCase("t");
- }
- if (in instanceof BigDecimal) {
- return ((BigDecimal) in).signum() != 0;
- }
- if (in instanceof Number) {
- return ((Number) in).longValue() != 0L;
- }
- if (in instanceof java.util.Date) {
- return ((java.util.Date) in).getTime() != 0L;
- }
- if (in instanceof Boolean) {
- return (Boolean) in;
- }
- if (in instanceof Clob) {
- final String asString = asString((Clob) in);
- return asString.equalsIgnoreCase("true") || asString.equals("1")
- || asString.equalsIgnoreCase("t");
- }
- if (in instanceof Character) {
- return (Character) in == '1' || (Character) in == 't' || (Character) in == 'T';
- }
- } catch (final Exception e) {
- throw cannotCastException(in.getClass().getName(), "boolean", e);
- }
- throw cannotCastException(in.getClass().getName(), "boolean");
- }
-
private static String castToString(final Object in) throws SQLException {
try {
if (in instanceof String) {
@@ -1046,6 +958,10 @@ class PgPreparedStatement extends PgStatement implements PreparedStatement {
//#endif
} else if (x instanceof Map) {
setMap(parameterIndex, (Map<?, ?>) x);
+ } else if (x instanceof Number) {
+ setNumber(parameterIndex, (Number) x);
+ } else if (PrimitiveArraySupport.isSupportedPrimitiveArray(x)) {
+ setPrimitiveArray(parameterIndex, x);
} else {
// Can't infer a type.
throw new PSQLException(GT.tr(
@@ -1067,7 +983,6 @@ class PgPreparedStatement extends PgStatement implements PreparedStatement {
return preparedQuery.query.toString(preparedParameters);
}
-
/**
* Note if s is a String it should be escaped by the caller to avoid SQL injection attacks. It is
* not done here for efficiency reasons as most calls to this method do not require escaping as
@@ -1175,10 +1090,8 @@ class PgPreparedStatement extends PgStatement implements PreparedStatement {
// literal from Array.toString(), such as the implementation we return
// from ResultSet.getArray(). Eventually we need a proper implementation
// here that works for any Array implementation.
-
- // Add special suffix for array identification
- String typename = x.getBaseTypeName() + "[]";
- int oid = connection.getTypeInfo().getPGType(typename);
+ String typename = x.getBaseTypeName();
+ int oid = connection.getTypeInfo().getPGArrayType(typename);
if (oid == Oid.UNSPECIFIED) {
throw new PSQLException(GT.tr("Unknown type {0}.", typename),
PSQLState.INVALID_PARAMETER_TYPE);
@@ -1248,15 +1161,29 @@ class PgPreparedStatement extends PgStatement implements PreparedStatement {
}
}
+ private String readerToString(Reader value, int maxLength) throws SQLException {
+ try {
+ int bufferSize = Math.min(maxLength, 1024);
+ StringBuilder v = new StringBuilder(bufferSize);
+ char[] buf = new char[bufferSize];
+ int nRead = 0;
+ while (nRead > -1 && v.length() < maxLength) {
+ nRead = value.read(buf, 0, Math.min(bufferSize, maxLength - v.length()));
+ if (nRead > 0) {
+ v.append(buf, 0, nRead);
+ }
+ }
+ return v.toString();
+ } catch (IOException ioe) {
+ throw new PSQLException(GT.tr("Provided Reader failed."), PSQLState.UNEXPECTED_ERROR, ioe);
+ }
+ }
+
public void setCharacterStream(int i, java.io.Reader x, int length) throws SQLException {
checkClosed();
if (x == null) {
- if (connection.haveMinimumServerVersion(ServerVersion.v7_2)) {
- setNull(i, Types.VARCHAR);
- } else {
- setNull(i, Types.CLOB);
- }
+ setNull(i, Types.VARCHAR);
return;
}
@@ -1265,60 +1192,13 @@ class PgPreparedStatement extends PgStatement implements PreparedStatement {
PSQLState.INVALID_PARAMETER_VALUE);
}
- if (connection.haveMinimumCompatibleVersion(ServerVersion.v7_2)) {
- // Version 7.2 supports CharacterStream for for the PG text types
- // As the spec/javadoc for this method indicate this is to be used for
- // large text values (i.e. LONGVARCHAR) PG doesn't have a separate
- // long varchar datatype, but with toast all the text datatypes are capable of
- // handling very large values. Thus the implementation ends up calling
- // setString() since there is no current way to stream the value to the server
- char[] l_chars = new char[length];
- int l_charsRead = 0;
- try {
- while (true) {
- int n = x.read(l_chars, l_charsRead, length - l_charsRead);
- if (n == -1) {
- break;
- }
-
- l_charsRead += n;
-
- if (l_charsRead == length) {
- break;
- }
- }
- } catch (IOException l_ioe) {
- throw new PSQLException(GT.tr("Provided Reader failed."), PSQLState.UNEXPECTED_ERROR,
- l_ioe);
- }
- setString(i, new String(l_chars, 0, l_charsRead));
- } else {
- // Version 7.1 only supported streams for LargeObjects
- // but the jdbc spec indicates that streams should be
- // available for LONGVARCHAR instead
- LargeObjectManager lom = connection.getLargeObjectAPI();
- long oid = lom.createLO();
- LargeObject lob = lom.open(oid);
- OutputStream los = lob.getOutputStream();
- try {
- // could be buffered, but then the OutputStream returned by LargeObject
- // is buffered internally anyhow, so there would be no performance
- // boost gained, if anything it would be worse!
- int c = x.read();
- int p = 0;
- while (c > -1 && p < length) {
- los.write(c);
- c = x.read();
- p++;
- }
- los.close();
- } catch (IOException se) {
- throw new PSQLException(GT.tr("Unexpected error writing large object to database."),
- PSQLState.UNEXPECTED_ERROR, se);
- }
- // lob is closed by the stream so don't call lob.close()
- setLong(i, oid);
- }
+ // Version 7.2 supports CharacterStream for for the PG text types
+ // As the spec/javadoc for this method indicate this is to be used for
+ // large text values (i.e. LONGVARCHAR) PG doesn't have a separate
+ // long varchar datatype, but with toast all the text datatypes are capable of
+ // handling very large values. Thus the implementation ends up calling
+ // setString() since there is no current way to stream the value to the server
+ setString(i, readerToString(x, length));
}
public void setClob(int i, Clob x) throws SQLException {
@@ -1512,7 +1392,7 @@ class PgPreparedStatement extends PgStatement implements PreparedStatement {
}
//#endif
- public ParameterMetaData createParameterMetaData(BaseConnection conn, int oids[])
+ public ParameterMetaData createParameterMetaData(BaseConnection conn, int[] oids)
throws SQLException {
return new PgParameterMetaData(conn, oids);
}
@@ -1554,7 +1434,13 @@ class PgPreparedStatement extends PgStatement implements PreparedStatement {
}
public void setCharacterStream(int parameterIndex, Reader value) throws SQLException {
- throw Driver.notImplemented(this.getClass(), "setCharacterStream(int, Reader)");
+ if (connection.getPreferQueryMode() == PreferQueryMode.SIMPLE) {
+ String s = (value != null) ? readerToString(value, Integer.MAX_VALUE) : null;
+ setString(parameterIndex, s);
+ return;
+ }
+ InputStream is = (value != null) ? new ReaderInputStream(value) : null;
+ setObject(parameterIndex, is, Types.LONGVARCHAR);
}
public void setBinaryStream(int parameterIndex, InputStream value, long length)
@@ -1631,10 +1517,11 @@ class PgPreparedStatement extends PgStatement implements PreparedStatement {
public void setSQLXML(int parameterIndex, SQLXML xmlObject) throws SQLException {
checkClosed();
- if (xmlObject == null || xmlObject.getString() == null) {
+ String stringValue = xmlObject == null ? null : xmlObject.getString();
+ if (stringValue == null) {
setNull(parameterIndex, Types.SQLXML);
} else {
- setString(parameterIndex, xmlObject.getString(), Oid.XML);
+ setString(parameterIndex, stringValue, Oid.XML);
}
}
@@ -1656,6 +1543,16 @@ class PgPreparedStatement extends PgStatement implements PreparedStatement {
@Override
public int[] executeBatch() throws SQLException {
try {
+ // Note: in batch prepared statements batchStatements == 1, and batchParameters is equal
+ // to the number of addBatch calls
+ // batchParameters might be empty in case of empty batch
+ if (batchParameters != null && batchParameters.size() > 1 && m_prepareThreshold > 0) {
+ // Use server-prepared statements when there's more than one statement in a batch
+ // Technically speaking, it might cause to create a server-prepared statement
+ // just for 2 executions even for prepareThreshold=5. That however should be
+ // acceptable since prepareThreshold is a optimization kind of parameter.
+ this.preparedQuery.increaseExecuteCount(m_prepareThreshold);
+ }
return super.executeBatch();
} finally {
defaultTimeZone = null;
@@ -1681,7 +1578,7 @@ class PgPreparedStatement extends PgStatement implements PreparedStatement {
connection.getQueryExecutor().execute(preparedQuery.query, preparedParameters, handler, 0, 0,
flags);
- int oids[] = preparedParameters.getTypeOIDs();
+ int[] oids = preparedParameters.getTypeOIDs();
if (oids != null) {
return createParameterMetaData(connection, oids);
}
diff --git a/pgjdbc/src/main/java/org/postgresql/jdbc/PgResultSet.java b/pgjdbc/src/main/java/org/postgresql/jdbc/PgResultSet.java
index 8adb68a..262033f 100644
--- a/pgjdbc/src/main/java/org/postgresql/jdbc/PgResultSet.java
+++ b/pgjdbc/src/main/java/org/postgresql/jdbc/PgResultSet.java
@@ -6,6 +6,7 @@
package org.postgresql.jdbc;
import org.postgresql.PGResultSetMetaData;
+import org.postgresql.PGStatement;
import org.postgresql.core.BaseConnection;
import org.postgresql.core.BaseStatement;
import org.postgresql.core.Encoding;
@@ -14,11 +15,8 @@ import org.postgresql.core.Oid;
import org.postgresql.core.Query;
import org.postgresql.core.ResultCursor;
import org.postgresql.core.ResultHandlerBase;
-import org.postgresql.core.ServerVersion;
import org.postgresql.core.TypeInfo;
import org.postgresql.core.Utils;
-import org.postgresql.largeobject.LargeObject;
-import org.postgresql.largeobject.LargeObjectManager;
import org.postgresql.util.ByteConverter;
import org.postgresql.util.GT;
import org.postgresql.util.HStoreConverter;
@@ -73,6 +71,8 @@ import java.util.Map;
import java.util.StringTokenizer;
import java.util.TimeZone;
import java.util.UUID;
+import java.util.concurrent.TimeUnit;
+import java.util.logging.Level;
public class PgResultSet implements ResultSet, org.postgresql.PGRefCursorResultSet {
@@ -96,7 +96,7 @@ public class PgResultSet implements ResultSet, org.postgresql.PGRefCursorResultS
private TimeZone defaultTimeZone;
protected final BaseConnection connection; // the connection we belong to
protected final BaseStatement statement; // the statement we belong to
- protected final Field fields[]; // Field metadata for this resultset.
+ protected final Field[] fields; // Field metadata for this resultset.
protected final Query originalQuery; // Query we originated from
protected final int maxRows; // Maximum rows in this resultset (might be 0).
@@ -160,6 +160,7 @@ public class PgResultSet implements ResultSet, org.postgresql.PGRefCursorResultS
}
public java.net.URL getURL(int columnIndex) throws SQLException {
+ connection.getLogger().log(Level.FINEST, " getURL columnIndex: {0}", columnIndex);
checkClosed();
throw org.postgresql.Driver.notImplemented(this.getClass(), "getURL(int)");
}
@@ -172,12 +173,10 @@ public class PgResultSet implements ResultSet, org.postgresql.PGRefCursorResultS
protected Object internalGetObject(int columnIndex, Field field) throws SQLException {
switch (getSQLType(columnIndex)) {
case Types.BOOLEAN:
+ case Types.BIT:
return getBoolean(columnIndex);
case Types.SQLXML:
return getSQLXML(columnIndex);
- case Types.BIT:
- // Also Types.BOOLEAN in JDBC3
- return getBoolean(columnIndex) ? Boolean.TRUE : Boolean.FALSE;
case Types.TINYINT:
case Types.SMALLINT:
case Types.INTEGER:
@@ -432,27 +431,13 @@ public class PgResultSet implements ResultSet, org.postgresql.PGRefCursorResultS
return null;
}
- if (connection.haveMinimumCompatibleVersion(ServerVersion.v7_2)) {
- // Version 7.2 supports AsciiStream for all the PG text types
- // As the spec/javadoc for this method indicate this is to be used for
- // large text values (i.e. LONGVARCHAR) PG doesn't have a separate
- // long string datatype, but with toast the text datatype is capable of
- // handling very large values. Thus the implementation ends up calling
- // getString() since there is no current way to stream the value from the server
- return new CharArrayReader(getString(i).toCharArray());
- } else {
- // In 7.1 Handle as BLOBS so return the LargeObject input stream
- Encoding encoding = connection.getEncoding();
- InputStream input = getBinaryStream(i);
-
- try {
- return encoding.getDecodingReader(input);
- } catch (IOException ioe) {
- throw new PSQLException(
- GT.tr("Unexpected error while decoding character data from a large object."),
- PSQLState.UNEXPECTED_ERROR, ioe);
- }
- }
+ // Version 7.2 supports AsciiStream for all the PG text types
+ // As the spec/javadoc for this method indicate this is to be used for
+ // large text values (i.e. LONGVARCHAR) PG doesn't have a separate
+ // long string datatype, but with toast the text datatype is capable of
+ // handling very large values. Thus the implementation ends up calling
+ // getString() since there is no current way to stream the value from the server
+ return new CharArrayReader(getString(i).toCharArray());
}
@@ -534,8 +519,14 @@ public class PgResultSet implements ResultSet, org.postgresql.PGRefCursorResultS
// If backend provides just TIMESTAMP, we use "cal" timezone
// If backend provides TIMESTAMPTZ, we ignore "cal" as we know true instant value
Timestamp timestamp = getTimestamp(i, cal);
+ long timeMillis = timestamp.getTime();
+ if (oid == Oid.TIMESTAMPTZ) {
+ // time zone == UTC since BINARY "timestamp with time zone" is always sent in UTC
+ // So we truncate days
+ return new Time(timeMillis % TimeUnit.DAYS.toMillis(1));
+ }
// Here we just truncate date part
- return connection.getTimestampUtils().convertToTime(timestamp.getTime(), tz);
+ return connection.getTimestampUtils().convertToTime(timeMillis, tz);
} else {
throw new PSQLException(
GT.tr("Cannot convert the column of type {0} to requested type {1}.",
@@ -548,6 +539,31 @@ public class PgResultSet implements ResultSet, org.postgresql.PGRefCursorResultS
return connection.getTimestampUtils().toTime(cal, string);
}
+ //#if mvn.project.property.postgresql.jdbc.spec >= "JDBC4.2"
+ private LocalTime getLocalTime(int i) throws SQLException {
+ checkResultSet(i);
+ if (wasNullFlag) {
+ return null;
+ }
+
+ if (isBinary(i)) {
+ int col = i - 1;
+ int oid = fields[col].getOID();
+ if (oid == Oid.TIME) {
+ return connection.getTimestampUtils().toLocalTimeBin(this_row[col]);
+ } else {
+ throw new PSQLException(
+ GT.tr("Cannot convert the column of type {0} to requested type {1}.",
+ Oid.toString(oid), "time"),
+ PSQLState.DATA_TYPE_MISMATCH);
+ }
+ }
+
+ String string = getString(i);
+ return connection.getTimestampUtils().toLocalTime(string);
+ }
+ //#endif
+
@Override
public Timestamp getTimestamp(int i, java.util.Calendar cal) throws SQLException {
@@ -1084,7 +1100,7 @@ public class PgResultSet implements ResultSet, org.postgresql.PGRefCursorResultS
try {
InputStreamReader reader = new InputStreamReader(x, "ASCII");
- char data[] = new char[length];
+ char[] data = new char[length];
int numRead = 0;
while (true) {
int n = reader.read(data, numRead, length - numRead);
@@ -1121,7 +1137,7 @@ public class PgResultSet implements ResultSet, org.postgresql.PGRefCursorResultS
return;
}
- byte data[] = new byte[length];
+ byte[] data = new byte[length];
int numRead = 0;
try {
while (true) {
@@ -1145,7 +1161,7 @@ public class PgResultSet implements ResultSet, org.postgresql.PGRefCursorResultS
} else {
// the stream contained less data than they said
// perhaps this is an error?
- byte data2[] = new byte[numRead];
+ byte[] data2 = new byte[numRead];
System.arraycopy(data, 0, data2, 0, numRead);
updateBytes(columnIndex, data2);
}
@@ -1175,7 +1191,7 @@ public class PgResultSet implements ResultSet, org.postgresql.PGRefCursorResultS
}
try {
- char data[] = new char[length];
+ char[] data = new char[length];
int numRead = 0;
while (true) {
int n = x.read(data, numRead, length - numRead);
@@ -1273,12 +1289,13 @@ public class PgResultSet implements ResultSet, org.postgresql.PGRefCursorResultS
selectSQL.append(" and ");
}
}
- if (connection.getLogger().logDebug()) {
- connection.getLogger().debug("selecting " + selectSQL.toString());
+ String sqlText = selectSQL.toString();
+ if (connection.getLogger().isLoggable(Level.FINE)) {
+ connection.getLogger().log(Level.FINE, "selecting {0}", sqlText);
}
// because updateable result sets do not yet support binary transfers we must request refresh
// with updateable result set to get field data in correct format
- selectStatement = connection.prepareStatement(selectSQL.toString(),
+ selectStatement = connection.prepareStatement(sqlText,
ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
@@ -1295,7 +1312,7 @@ public class PgResultSet implements ResultSet, org.postgresql.PGRefCursorResultS
rows.set(current_row, rowBuffer);
this_row = rowBuffer;
- connection.getLogger().debug("done updates");
+ connection.getLogger().log(Level.FINE, "done updates");
rs.close();
selectStatement.close();
@@ -1352,10 +1369,11 @@ public class PgResultSet implements ResultSet, org.postgresql.PGRefCursorResultS
}
}
- if (connection.getLogger().logDebug()) {
- connection.getLogger().debug("updating " + updateSQL.toString());
+ String sqlText = updateSQL.toString();
+ if (connection.getLogger().isLoggable(Level.FINE)) {
+ connection.getLogger().log(Level.FINE, "updating {0}", sqlText);
}
- updateStatement = connection.prepareStatement(updateSQL.toString());
+ updateStatement = connection.prepareStatement(sqlText);
int i = 0;
Iterator<Object> iterator = updateValues.values().iterator();
@@ -1374,11 +1392,11 @@ public class PgResultSet implements ResultSet, org.postgresql.PGRefCursorResultS
updateRowBuffer();
- connection.getLogger().debug("copying data");
+ connection.getLogger().log(Level.FINE, "copying data");
System.arraycopy(rowBuffer, 0, this_row, 0, rowBuffer.length);
rows.set(current_row, rowBuffer);
- connection.getLogger().debug("done updates");
+ connection.getLogger().log(Level.FINE, "done updates");
updateValues.clear();
doingUpdates = false;
}
@@ -1455,7 +1473,7 @@ public class PgResultSet implements ResultSet, org.postgresql.PGRefCursorResultS
}
- public synchronized void updateBytes(String columnName, byte x[]) throws SQLException {
+ public synchronized void updateBytes(String columnName, byte[] x) throws SQLException {
updateBytes(findColumn(columnName), x);
}
@@ -1522,16 +1540,16 @@ public class PgResultSet implements ResultSet, org.postgresql.PGRefCursorResultS
return true;
}
- connection.getLogger().debug("checking if rs is updateable");
+ connection.getLogger().log(Level.FINE, "checking if rs is updateable");
parseQuery();
if (!singleTable) {
- connection.getLogger().debug("not a single table");
+ connection.getLogger().log(Level.FINE, "not a single table");
return false;
}
- connection.getLogger().debug("getting primary keys");
+ connection.getLogger().log(Level.FINE, "getting primary keys");
//
// Contains the primary key?
@@ -1578,9 +1596,8 @@ public class PgResultSet implements ResultSet, org.postgresql.PGRefCursorResultS
rs.close();
}
- if (connection.getLogger().logDebug()) {
- connection.getLogger().debug("no of keys=" + i);
- }
+ connection.getLogger().log(Level.FINE, "no of keys={0}", i);
+
if (i < 1) {
throw new PSQLException(GT.tr("No primary key found for table {0}.", tableName),
@@ -1589,9 +1606,7 @@ public class PgResultSet implements ResultSet, org.postgresql.PGRefCursorResultS
updateable = (i == numPKcolumns);
- if (connection.getLogger().logDebug()) {
- connection.getLogger().debug("checking primary key " + updateable);
- }
+ connection.getLogger().log(Level.FINE, "checking primary key {0}", updateable);
return updateable;
}
@@ -1875,6 +1890,7 @@ public class PgResultSet implements ResultSet, org.postgresql.PGRefCursorResultS
}
public String getString(int columnIndex) throws SQLException {
+ connection.getLogger().log(Level.FINEST, " getString columnIndex: {0}", columnIndex);
checkResultSet(columnIndex);
if (wasNullFlag) {
return null;
@@ -1910,18 +1926,47 @@ public class PgResultSet implements ResultSet, org.postgresql.PGRefCursorResultS
}
}
+ /**
+ * Retrieves the value of the designated column in the current row of this <code>ResultSet</code>
+ * object as a <code>boolean</code> in the Java programming language.
+ * <p>
+ * If the designated column has a Character datatype and is one of the following values: "1",
+ * "true", "t", "yes", "y" or "on", a value of <code>true</code> is returned. If the designated
+ * column has a Character datatype and is one of the following values: "0", "false", "f", "no",
+ * "n" or "off", a value of <code>false</code> is returned. Leading or trailing whitespace is
+ * ignored, and case does not matter.
+ * <p>
+ * If the designated column has a Numeric datatype and is a 1, a value of <code>true</code> is
+ * returned. If the designated column has a Numeric datatype and is a 0, a value of
+ * <code>false</code> is returned.
+ *
+ * @param columnIndex the first column is 1, the second is 2, ...
+ * @return the column value; if the value is SQL <code>NULL</code>, the value returned is
+ * <code>false</code>
+ * @exception SQLException if the columnIndex is not valid; if a database access error occurs; if
+ * this method is called on a closed result set or is an invalid cast to boolean type.
+ * @see <a href="https://www.postgresql.org/docs/current/static/datatype-boolean.html">PostgreSQL
+ * Boolean Type</a>
+ */
+ @Override
public boolean getBoolean(int columnIndex) throws SQLException {
+ connection.getLogger().log(Level.FINEST, " getBoolean columnIndex: {0}", columnIndex);
checkResultSet(columnIndex);
if (wasNullFlag) {
return false; // SQL NULL
}
+ int col = columnIndex - 1;
+ if (Oid.BOOL == fields[col].getOID()) {
+ final byte[] v = this_row[col];
+ return (1 == v.length) && (116 == v[0]); // 116 = 't'
+ }
+
if (isBinary(columnIndex)) {
- int col = columnIndex - 1;
- return readDoubleValue(this_row[col], fields[col].getOID(), "boolean") == 1;
+ return BooleanTypeUtil.castToBoolean(readDoubleValue(this_row[col], fields[col].getOID(), "boolean"));
}
- return toBoolean(getString(columnIndex));
+ return BooleanTypeUtil.castToBoolean(getString(columnIndex));
}
private static final BigInteger BYTEMAX = new BigInteger(Byte.toString(Byte.MAX_VALUE));
@@ -1929,6 +1974,7 @@ public class PgResultSet implements ResultSet, org.postgresql.PGRefCursorResultS
@Override
public byte getByte(int columnIndex) throws SQLException {
+ connection.getLogger().log(Level.FINEST, " getByte columnIndex: {0}", columnIndex);
checkResultSet(columnIndex);
if (wasNullFlag) {
return 0; // SQL NULL
@@ -1975,11 +2021,9 @@ public class PgResultSet implements ResultSet, org.postgresql.PGRefCursorResultS
return 0; // SQL NULL
}
- private static final BigInteger SHORTMAX = new BigInteger(Short.toString(Short.MAX_VALUE));
- private static final BigInteger SHORTMIN = new BigInteger(Short.toString(Short.MIN_VALUE));
-
@Override
public short getShort(int columnIndex) throws SQLException {
+ connection.getLogger().log(Level.FINEST, " getShort columnIndex: {0}", columnIndex);
checkResultSet(columnIndex);
if (wasNullFlag) {
return 0; // SQL NULL
@@ -1994,35 +2038,11 @@ public class PgResultSet implements ResultSet, org.postgresql.PGRefCursorResultS
return (short) readLongValue(this_row[col], oid, Short.MIN_VALUE, Short.MAX_VALUE, "short");
}
- String s = getFixedString(columnIndex);
-
- if (s != null) {
- s = s.trim();
- try {
- return Short.parseShort(s);
- } catch (NumberFormatException e) {
- try {
- BigDecimal n = new BigDecimal(s);
- BigInteger i = n.toBigInteger();
- int gt = i.compareTo(SHORTMAX);
- int lt = i.compareTo(SHORTMIN);
-
- if (gt > 0 || lt < 0) {
- throw new PSQLException(GT.tr("Bad value for type {0} : {1}", "short", s),
- PSQLState.NUMERIC_VALUE_OUT_OF_RANGE);
- }
- return i.shortValue();
-
- } catch (NumberFormatException ne) {
- throw new PSQLException(GT.tr("Bad value for type {0} : {1}", "short", s),
- PSQLState.NUMERIC_VALUE_OUT_OF_RANGE);
- }
- }
- }
- return 0; // SQL NULL
+ return toShort(getFixedString(columnIndex));
}
public int getInt(int columnIndex) throws SQLException {
+ connection.getLogger().log(Level.FINEST, " getInt columnIndex: {0}", columnIndex);
checkResultSet(columnIndex);
if (wasNullFlag) {
return 0; // SQL NULL
@@ -2048,6 +2068,7 @@ public class PgResultSet implements ResultSet, org.postgresql.PGRefCursorResultS
}
public long getLong(int columnIndex) throws SQLException {
+ connection.getLogger().log(Level.FINEST, " getLong columnIndex: {0}", columnIndex);
checkResultSet(columnIndex);
if (wasNullFlag) {
return 0; // SQL NULL
@@ -2259,6 +2280,7 @@ public class PgResultSet implements ResultSet, org.postgresql.PGRefCursorResultS
}
public float getFloat(int columnIndex) throws SQLException {
+ connection.getLogger().log(Level.FINEST, " getFloat columnIndex: {0}", columnIndex);
checkResultSet(columnIndex);
if (wasNullFlag) {
return 0; // SQL NULL
@@ -2277,6 +2299,7 @@ public class PgResultSet implements ResultSet, org.postgresql.PGRefCursorResultS
}
public double getDouble(int columnIndex) throws SQLException {
+ connection.getLogger().log(Level.FINEST, " getDouble columnIndex: {0}", columnIndex);
checkResultSet(columnIndex);
if (wasNullFlag) {
return 0; // SQL NULL
@@ -2295,6 +2318,7 @@ public class PgResultSet implements ResultSet, org.postgresql.PGRefCursorResultS
}
public BigDecimal getBigDecimal(int columnIndex, int scale) throws SQLException {
+ connection.getLogger().log(Level.FINEST, " getBigDecimal columnIndex: {0}", columnIndex);
checkResultSet(columnIndex);
if (wasNullFlag) {
return null;
@@ -2341,6 +2365,7 @@ public class PgResultSet implements ResultSet, org.postgresql.PGRefCursorResultS
* <b>Be warned</b> If the large object is huge, then you may run out of memory.
*/
public byte[] getBytes(int columnIndex) throws SQLException {
+ connection.getLogger().log(Level.FINEST, " getBytes columnIndex: {0}", columnIndex);
checkResultSet(columnIndex);
if (wasNullFlag) {
return null;
@@ -2349,114 +2374,87 @@ public class PgResultSet implements ResultSet, org.postgresql.PGRefCursorResultS
if (isBinary(columnIndex)) {
// If the data is already binary then just return it
return this_row[columnIndex - 1];
- } else if (connection.haveMinimumCompatibleVersion(ServerVersion.v7_2)) {
- // Version 7.2 supports the bytea datatype for byte arrays
- if (fields[columnIndex - 1].getOID() == Oid.BYTEA) {
- return trimBytes(columnIndex, PGbytea.toBytes(this_row[columnIndex - 1]));
- } else {
- return trimBytes(columnIndex, this_row[columnIndex - 1]);
- }
+ }
+ if (fields[columnIndex - 1].getOID() == Oid.BYTEA) {
+ return trimBytes(columnIndex, PGbytea.toBytes(this_row[columnIndex - 1]));
} else {
- // Version 7.1 and earlier supports LargeObjects for byte arrays
- // Handle OID's as BLOBS
- if (fields[columnIndex - 1].getOID() == Oid.OID) {
- LargeObjectManager lom = connection.getLargeObjectAPI();
- LargeObject lob = lom.open(getLong(columnIndex));
- byte buf[] = lob.read(lob.size());
- lob.close();
- return trimBytes(columnIndex, buf);
- } else {
- return trimBytes(columnIndex, this_row[columnIndex - 1]);
- }
+ return trimBytes(columnIndex, this_row[columnIndex - 1]);
}
}
public java.sql.Date getDate(int columnIndex) throws SQLException {
+ connection.getLogger().log(Level.FINEST, " getDate columnIndex: {0}", columnIndex);
return getDate(columnIndex, null);
}
public Time getTime(int columnIndex) throws SQLException {
+ connection.getLogger().log(Level.FINEST, " getTime columnIndex: {0}", columnIndex);
return getTime(columnIndex, null);
}
public Timestamp getTimestamp(int columnIndex) throws SQLException {
+ connection.getLogger().log(Level.FINEST, " getTimestamp columnIndex: {0}", columnIndex);
return getTimestamp(columnIndex, null);
}
public InputStream getAsciiStream(int columnIndex) throws SQLException {
+ connection.getLogger().log(Level.FINEST, " getAsciiStream columnIndex: {0}", columnIndex);
checkResultSet(columnIndex);
if (wasNullFlag) {
return null;
}
- if (connection.haveMinimumCompatibleVersion(ServerVersion.v7_2)) {
- // Version 7.2 supports AsciiStream for all the PG text types
- // As the spec/javadoc for this method indicate this is to be used for
- // large text values (i.e. LONGVARCHAR) PG doesn't have a separate
- // long string datatype, but with toast the text datatype is capable of
- // handling very large values. Thus the implementation ends up calling
- // getString() since there is no current way to stream the value from the server
- try {
- return new ByteArrayInputStream(getString(columnIndex).getBytes("ASCII"));
- } catch (UnsupportedEncodingException l_uee) {
- throw new PSQLException(GT.tr("The JVM claims not to support the encoding: {0}", "ASCII"),
- PSQLState.UNEXPECTED_ERROR, l_uee);
- }
- } else {
- // In 7.1 Handle as BLOBS so return the LargeObject input stream
- return getBinaryStream(columnIndex);
+ // Version 7.2 supports AsciiStream for all the PG text types
+ // As the spec/javadoc for this method indicate this is to be used for
+ // large text values (i.e. LONGVARCHAR) PG doesn't have a separate
+ // long string datatype, but with toast the text datatype is capable of
+ // handling very large values. Thus the implementation ends up calling
+ // getString() since there is no current way to stream the value from the server
+ try {
+ return new ByteArrayInputStream(getString(columnIndex).getBytes("ASCII"));
+ } catch (UnsupportedEncodingException l_uee) {
+ throw new PSQLException(GT.tr("The JVM claims not to support the encoding: {0}", "ASCII"),
+ PSQLState.UNEXPECTED_ERROR, l_uee);
}
}
public InputStream getUnicodeStream(int columnIndex) throws SQLException {
+ connection.getLogger().log(Level.FINEST, " getUnicodeStream columnIndex: {0}", columnIndex);
checkResultSet(columnIndex);
if (wasNullFlag) {
return null;
}
- if (connection.haveMinimumCompatibleVersion(ServerVersion.v7_2)) {
- // Version 7.2 supports AsciiStream for all the PG text types
- // As the spec/javadoc for this method indicate this is to be used for
- // large text values (i.e. LONGVARCHAR) PG doesn't have a separate
- // long string datatype, but with toast the text datatype is capable of
- // handling very large values. Thus the implementation ends up calling
- // getString() since there is no current way to stream the value from the server
- try {
- return new ByteArrayInputStream(getString(columnIndex).getBytes("UTF-8"));
- } catch (UnsupportedEncodingException l_uee) {
- throw new PSQLException(GT.tr("The JVM claims not to support the encoding: {0}", "UTF-8"),
- PSQLState.UNEXPECTED_ERROR, l_uee);
- }
- } else {
- // In 7.1 Handle as BLOBS so return the LargeObject input stream
- return getBinaryStream(columnIndex);
+ // Version 7.2 supports AsciiStream for all the PG text types
+ // As the spec/javadoc for this method indicate this is to be used for
+ // large text values (i.e. LONGVARCHAR) PG doesn't have a separate
+ // long string datatype, but with toast the text datatype is capable of
+ // handling very large values. Thus the implementation ends up calling
+ // getString() since there is no current way to stream the value from the server
+ try {
+ return new ByteArrayInputStream(getString(columnIndex).getBytes("UTF-8"));
+ } catch (UnsupportedEncodingException l_uee) {
+ throw new PSQLException(GT.tr("The JVM claims not to support the encoding: {0}", "UTF-8"),
+ PSQLState.UNEXPECTED_ERROR, l_uee);
}
}
public InputStream getBinaryStream(int columnIndex) throws SQLException {
+ connection.getLogger().log(Level.FINEST, " getBinaryStream columnIndex: {0}", columnIndex);
checkResultSet(columnIndex);
if (wasNullFlag) {
return null;
}
- if (connection.haveMinimumCompatibleVersion(ServerVersion.v7_2)) {
- // Version 7.2 supports BinaryStream for all PG bytea type
- // As the spec/javadoc for this method indicate this is to be used for
- // large binary values (i.e. LONGVARBINARY) PG doesn't have a separate
- // long binary datatype, but with toast the bytea datatype is capable of
- // handling very large values. Thus the implementation ends up calling
- // getBytes() since there is no current way to stream the value from the server
- byte b[] = getBytes(columnIndex);
- if (b != null) {
- return new ByteArrayInputStream(b);
- }
- } else {
- // In 7.1 Handle as BLOBS so return the LargeObject input stream
- if (fields[columnIndex - 1].getOID() == Oid.OID) {
- LargeObjectManager lom = connection.getLargeObjectAPI();
- LargeObject lob = lom.open(getLong(columnIndex));
- return lob.getInputStream();
- }
+ // Version 7.2 supports BinaryStream for all PG bytea type
+ // As the spec/javadoc for this method indicate this is to be used for
+ // large binary values (i.e. LONGVARBINARY) PG doesn't have a separate
+ // long binary datatype, but with toast the bytea datatype is capable of
+ // handling very large values. Thus the implementation ends up calling
+ // getBytes() since there is no current way to stream the value from the server
+ byte[] b = getBytes(columnIndex);
+ if (b != null) {
+ return new ByteArrayInputStream(b);
}
return null;
}
@@ -2465,6 +2463,7 @@ public class PgResultSet implements ResultSet, org.postgresql.PGRefCursorResultS
return getString(findColumn(columnName));
}
+ @Override
public boolean getBoolean(String columnName) throws SQLException {
return getBoolean(findColumn(columnName));
}
@@ -2550,6 +2549,7 @@ public class PgResultSet implements ResultSet, org.postgresql.PGRefCursorResultS
}
public Object getObject(int columnIndex) throws SQLException {
+ connection.getLogger().log(Level.FINEST, " getObject columnIndex: {0}", columnIndex);
Field field;
checkResultSet(columnIndex);
@@ -2784,26 +2784,34 @@ public class PgResultSet implements ResultSet, org.postgresql.PGRefCursorResultS
// ----------------- Formatting Methods -------------------
- public static boolean toBoolean(String s) {
- if (s != null) {
- s = s.trim();
+ private static final BigInteger SHORTMAX = new BigInteger(Short.toString(Short.MAX_VALUE));
+ private static final BigInteger SHORTMIN = new BigInteger(Short.toString(Short.MIN_VALUE));
- if (s.equalsIgnoreCase("t") || s.equalsIgnoreCase("true") || s.equals("1")) {
- return true;
- }
+ public static short toShort(String s) throws SQLException {
+ if (s != null) {
+ try {
+ s = s.trim();
+ return Short.parseShort(s);
+ } catch (NumberFormatException e) {
+ try {
+ BigDecimal n = new BigDecimal(s);
+ BigInteger i = n.toBigInteger();
+ int gt = i.compareTo(SHORTMAX);
+ int lt = i.compareTo(SHORTMIN);
- if (s.equalsIgnoreCase("f") || s.equalsIgnoreCase("false") || s.equals("0")) {
- return false;
- }
+ if (gt > 0 || lt < 0) {
+ throw new PSQLException(GT.tr("Bad value for type {0} : {1}", "short", s),
+ PSQLState.NUMERIC_VALUE_OUT_OF_RANGE);
+ }
+ return i.shortValue();
- try {
- if (Double.parseDouble(s) == 1) {
- return true;
+ } catch (NumberFormatException ne) {
+ throw new PSQLException(GT.tr("Bad value for type {0} : {1}", "short", s),
+ PSQLState.NUMERIC_VALUE_OUT_OF_RANGE);
}
- } catch (NumberFormatException e) {
}
}
- return false; // SQL NULL
+ return 0; // SQL NULL
}
private static final BigInteger INTMAX = new BigInteger(Integer.toString(Integer.MAX_VALUE));
@@ -2837,8 +2845,8 @@ public class PgResultSet implements ResultSet, org.postgresql.PGRefCursorResultS
return 0; // SQL NULL
}
- private final static BigInteger LONGMAX = new BigInteger(Long.toString(Long.MAX_VALUE));
- private final static BigInteger LONGMIN = new BigInteger(Long.toString(Long.MIN_VALUE));
+ private static final BigInteger LONGMAX = new BigInteger(Long.toString(Long.MAX_VALUE));
+ private static final BigInteger LONGMIN = new BigInteger(Long.toString(Long.MIN_VALUE));
public static long toLong(String s) throws SQLException {
if (s != null) {
@@ -3102,8 +3110,6 @@ public class PgResultSet implements ResultSet, org.postgresql.PGRefCursorResultS
}
}
- ;
-
//
// We need to specify the type of NULL when updating a column to NULL, so
// NullObject is a simple extension of PGobject that always returns null
@@ -3120,8 +3126,6 @@ public class PgResultSet implements ResultSet, org.postgresql.PGRefCursorResultS
}
}
- ;
-
/**
* Used to add rows to an already existing ResultSet that exactly match the existing rows.
* Currently only used for assembling generated keys from batch statement execution.
@@ -3171,13 +3175,15 @@ public class PgResultSet implements ResultSet, org.postgresql.PGRefCursorResultS
if (sqlType == Types.NUMERIC || sqlType == Types.DECIMAL) {
return type.cast(getBigDecimal(columnIndex));
} else {
- throw new SQLException("conversion to " + type + " from " + sqlType + " not supported");
+ throw new PSQLException(GT.tr("conversion to {0} from {1} not supported", type, sqlType),
+ PSQLState.INVALID_PARAMETER_VALUE);
}
} else if (type == String.class) {
if (sqlType == Types.CHAR || sqlType == Types.VARCHAR) {
return type.cast(getString(columnIndex));
} else {
- throw new SQLException("conversion to " + type + " from " + sqlType + " not supported");
+ throw new PSQLException(GT.tr("conversion to {0} from {1} not supported", type, sqlType),
+ PSQLState.INVALID_PARAMETER_VALUE);
}
} else if (type == Boolean.class) {
if (sqlType == Types.BOOLEAN || sqlType == Types.BIT) {
@@ -3187,17 +3193,30 @@ public class PgResultSet implements ResultSet, org.postgresql.PGRefCursorResultS
}
return type.cast(booleanValue);
} else {
- throw new SQLException("conversion to " + type + " from " + sqlType + " not supported");
+ throw new PSQLException(GT.tr("conversion to {0} from {1} not supported", type, sqlType),
+ PSQLState.INVALID_PARAMETER_VALUE);
+ }
+ } else if (type == Short.class) {
+ if (sqlType == Types.SMALLINT) {
+ short shortValue = getShort(columnIndex);
+ if (wasNull()) {
+ return null;
+ }
+ return type.cast(shortValue);
+ } else {
+ throw new PSQLException(GT.tr("conversion to {0} from {1} not supported", type, sqlType),
+ PSQLState.INVALID_PARAMETER_VALUE);
}
} else if (type == Integer.class) {
- if (sqlType == Types.SMALLINT || sqlType == Types.INTEGER) {
+ if (sqlType == Types.INTEGER || sqlType == Types.SMALLINT) {
int intValue = getInt(columnIndex);
if (wasNull()) {
return null;
}
return type.cast(intValue);
} else {
- throw new SQLException("conversion to " + type + " from " + sqlType + " not supported");
+ throw new PSQLException(GT.tr("conversion to {0} from {1} not supported", type, sqlType),
+ PSQLState.INVALID_PARAMETER_VALUE);
}
} else if (type == Long.class) {
if (sqlType == Types.BIGINT) {
@@ -3207,7 +3226,19 @@ public class PgResultSet implements ResultSet, org.postgresql.PGRefCursorResultS
}
return type.cast(longValue);
} else {
- throw new SQLException("conversion to " + type + " from " + sqlType + " not supported");
+ throw new PSQLException(GT.tr("conversion to {0} from {1} not supported", type, sqlType),
+ PSQLState.INVALID_PARAMETER_VALUE);
+ }
+ } else if (type == BigInteger.class) {
+ if (sqlType == Types.BIGINT) {
+ long longValue = getLong(columnIndex);
+ if (wasNull()) {
+ return null;
+ }
+ return type.cast(BigInteger.valueOf(longValue));
+ } else {
+ throw new PSQLException(GT.tr("conversion to {0} from {1} not supported", type, sqlType),
+ PSQLState.INVALID_PARAMETER_VALUE);
}
} else if (type == Float.class) {
if (sqlType == Types.REAL) {
@@ -3217,7 +3248,8 @@ public class PgResultSet implements ResultSet, org.postgresql.PGRefCursorResultS
}
return type.cast(floatValue);
} else {
- throw new SQLException("conversion to " + type + " from " + sqlType + " not supported");
+ throw new PSQLException(GT.tr("conversion to {0} from {1} not supported", type, sqlType),
+ PSQLState.INVALID_PARAMETER_VALUE);
}
} else if (type == Double.class) {
if (sqlType == Types.FLOAT || sqlType == Types.DOUBLE) {
@@ -3227,19 +3259,22 @@ public class PgResultSet implements ResultSet, org.postgresql.PGRefCursorResultS
}
return type.cast(doubleValue);
} else {
- throw new SQLException("conversion to " + type + " from " + sqlType + " not supported");
+ throw new PSQLException(GT.tr("conversion to {0} from {1} not supported", type, sqlType),
+ PSQLState.INVALID_PARAMETER_VALUE);
}
} else if (type == Date.class) {
if (sqlType == Types.DATE) {
return type.cast(getDate(columnIndex));
} else {
- throw new SQLException("conversion to " + type + " from " + sqlType + " not supported");
+ throw new PSQLException(GT.tr("conversion to {0} from {1} not supported", type, sqlType),
+ PSQLState.INVALID_PARAMETER_VALUE);
}
} else if (type == Time.class) {
if (sqlType == Types.TIME) {
return type.cast(getTime(columnIndex));
} else {
- throw new SQLException("conversion to " + type + " from " + sqlType + " not supported");
+ throw new PSQLException(GT.tr("conversion to {0} from {1} not supported", type, sqlType),
+ PSQLState.INVALID_PARAMETER_VALUE);
}
} else if (type == Timestamp.class) {
if (sqlType == Types.TIMESTAMP
@@ -3249,7 +3284,8 @@ public class PgResultSet implements ResultSet, org.postgresql.PGRefCursorResultS
) {
return type.cast(getTimestamp(columnIndex));
} else {
- throw new SQLException("conversion to " + type + " from " + sqlType + " not supported");
+ throw new PSQLException(GT.tr("conversion to {0} from {1} not supported", type, sqlType),
+ PSQLState.INVALID_PARAMETER_VALUE);
}
} else if (type == Calendar.class) {
if (sqlType == Types.TIMESTAMP
@@ -3258,41 +3294,54 @@ public class PgResultSet implements ResultSet, org.postgresql.PGRefCursorResultS
//#endif
) {
Timestamp timestampValue = getTimestamp(columnIndex);
+ if (wasNull()) {
+ return null;
+ }
Calendar calendar = Calendar.getInstance(getDefaultCalendar().getTimeZone());
calendar.setTimeInMillis(timestampValue.getTime());
return type.cast(calendar);
} else {
- throw new SQLException("conversion to " + type + " from " + sqlType + " not supported");
+ throw new PSQLException(GT.tr("conversion to {0} from {1} not supported", type, sqlType),
+ PSQLState.INVALID_PARAMETER_VALUE);
}
} else if (type == Blob.class) {
if (sqlType == Types.BLOB || sqlType == Types.BINARY || sqlType == Types.BIGINT) {
return type.cast(getBlob(columnIndex));
} else {
- throw new SQLException("conversion to " + type + " from " + sqlType + " not supported");
+ throw new PSQLException(GT.tr("conversion to {0} from {1} not supported", type, sqlType),
+ PSQLState.INVALID_PARAMETER_VALUE);
}
} else if (type == Clob.class) {
if (sqlType == Types.CLOB || sqlType == Types.BIGINT) {
return type.cast(getClob(columnIndex));
} else {
- throw new SQLException("conversion to " + type + " from " + sqlType + " not supported");
+ throw new PSQLException(GT.tr("conversion to {0} from {1} not supported", type, sqlType),
+ PSQLState.INVALID_PARAMETER_VALUE);
}
- } else if (type == NClob.class) {
- if (sqlType == Types.NCLOB) {
- return type.cast(getNClob(columnIndex));
+ } else if (type == java.util.Date.class) {
+ if (sqlType == Types.TIMESTAMP) {
+ Timestamp timestamp = getTimestamp(columnIndex);
+ if (wasNull()) {
+ return null;
+ }
+ return type.cast(new java.util.Date(timestamp.getTime()));
} else {
- throw new SQLException("conversion to " + type + " from " + sqlType + " not supported");
+ throw new PSQLException(GT.tr("conversion to {0} from {1} not supported", type, sqlType),
+ PSQLState.INVALID_PARAMETER_VALUE);
}
} else if (type == Array.class) {
if (sqlType == Types.ARRAY) {
return type.cast(getArray(columnIndex));
} else {
- throw new SQLException("conversion to " + type + " from " + sqlType + " not supported");
+ throw new PSQLException(GT.tr("conversion to {0} from {1} not supported", type, sqlType),
+ PSQLState.INVALID_PARAMETER_VALUE);
}
} else if (type == SQLXML.class) {
if (sqlType == Types.SQLXML) {
return type.cast(getSQLXML(columnIndex));
} else {
- throw new SQLException("conversion to " + type + " from " + sqlType + " not supported");
+ throw new PSQLException(GT.tr("conversion to {0} from {1} not supported", type, sqlType),
+ PSQLState.INVALID_PARAMETER_VALUE);
}
} else if (type == UUID.class) {
return type.cast(getObject(columnIndex));
@@ -3314,25 +3363,37 @@ public class PgResultSet implements ResultSet, org.postgresql.PGRefCursorResultS
if (wasNull()) {
return null;
}
+ long time = dateValue.getTime();
+ if (time == PGStatement.DATE_POSITIVE_INFINITY) {
+ return type.cast(LocalDate.MAX);
+ }
+ if (time == PGStatement.DATE_NEGATIVE_INFINITY) {
+ return type.cast(LocalDate.MIN);
+ }
return type.cast(dateValue.toLocalDate());
+ } else if (sqlType == Types.TIMESTAMP) {
+ LocalDateTime localDateTimeValue = getLocalDateTime(columnIndex);
+ if (wasNull()) {
+ return null;
+ }
+ return type.cast(localDateTimeValue.toLocalDate());
} else {
- throw new SQLException("conversion to " + type + " from " + sqlType + " not supported");
+ throw new PSQLException(GT.tr("conversion to {0} from {1} not supported", type, sqlType),
+ PSQLState.INVALID_PARAMETER_VALUE);
}
} else if (type == LocalTime.class) {
if (sqlType == Types.TIME) {
- Time timeValue = getTime(columnIndex);
- if (wasNull()) {
- return null;
- }
- return type.cast(timeValue.toLocalTime());
+ return type.cast(getLocalTime(columnIndex));
} else {
- throw new SQLException("conversion to " + type + " from " + sqlType + " not supported");
+ throw new PSQLException(GT.tr("conversion to {0} from {1} not supported", type, sqlType),
+ PSQLState.INVALID_PARAMETER_VALUE);
}
} else if (type == LocalDateTime.class) {
if (sqlType == Types.TIMESTAMP) {
return type.cast(getLocalDateTime(columnIndex));
} else {
- throw new SQLException("conversion to " + type + " from " + sqlType + " not supported");
+ throw new PSQLException(GT.tr("conversion to {0} from {1} not supported", type, sqlType),
+ PSQLState.INVALID_PARAMETER_VALUE);
}
} else if (type == OffsetDateTime.class) {
if (sqlType == Types.TIMESTAMP_WITH_TIMEZONE || sqlType == Types.TIMESTAMP) {
@@ -3340,11 +3401,19 @@ public class PgResultSet implements ResultSet, org.postgresql.PGRefCursorResultS
if (wasNull()) {
return null;
}
+ long time = timestampValue.getTime();
+ if (time == PGStatement.DATE_POSITIVE_INFINITY) {
+ return type.cast(OffsetDateTime.MAX);
+ }
+ if (time == PGStatement.DATE_NEGATIVE_INFINITY) {
+ return type.cast(OffsetDateTime.MIN);
+ }
// Postgres stores everything in UTC and does not keep original time zone
OffsetDateTime offsetDateTime = OffsetDateTime.ofInstant(timestampValue.toInstant(), ZoneOffset.UTC);
return type.cast(offsetDateTime);
} else {
- throw new SQLException("conversion to " + type + " from " + sqlType + " not supported");
+ throw new PSQLException(GT.tr("conversion to {0} from {1} not supported", type, sqlType),
+ PSQLState.INVALID_PARAMETER_VALUE);
}
//#endif
} else if (PGobject.class.isAssignableFrom(type)) {
@@ -3356,7 +3425,8 @@ public class PgResultSet implements ResultSet, org.postgresql.PGRefCursorResultS
}
return type.cast(object);
}
- throw new SQLException("unsupported conversion to " + type);
+ throw new PSQLException(GT.tr("conversion to {0} from {1} not supported", type, sqlType),
+ PSQLState.INVALID_PARAMETER_VALUE);
}
public <T> T getObject(String columnLabel, Class<T> type) throws SQLException {
@@ -3394,6 +3464,7 @@ public class PgResultSet implements ResultSet, org.postgresql.PGRefCursorResultS
//#endif
public RowId getRowId(int columnIndex) throws SQLException {
+ connection.getLogger().log(Level.FINEST, " getRowId columnIndex: {0}", columnIndex);
throw org.postgresql.Driver.notImplemented(this.getClass(), "getRowId(int)");
}
@@ -3450,6 +3521,7 @@ public class PgResultSet implements ResultSet, org.postgresql.PGRefCursorResultS
}
public NClob getNClob(int columnIndex) throws SQLException {
+ connection.getLogger().log(Level.FINEST, " getNClob columnIndex: {0}", columnIndex);
throw org.postgresql.Driver.notImplemented(this.getClass(), "getNClob(int)");
}
@@ -3493,6 +3565,7 @@ public class PgResultSet implements ResultSet, org.postgresql.PGRefCursorResultS
}
public SQLXML getSQLXML(int columnIndex) throws SQLException {
+ connection.getLogger().log(Level.FINEST, " getSQLXML columnIndex: {0}", columnIndex);
String data = getString(columnIndex);
if (data == null) {
return null;
@@ -3514,6 +3587,7 @@ public class PgResultSet implements ResultSet, org.postgresql.PGRefCursorResultS
}
public String getNString(int columnIndex) throws SQLException {
+ connection.getLogger().log(Level.FINEST, " getNString columnIndex: {0}", columnIndex);
throw org.postgresql.Driver.notImplemented(this.getClass(), "getNString(int)");
}
@@ -3522,6 +3596,7 @@ public class PgResultSet implements ResultSet, org.postgresql.PGRefCursorResultS
}
public Reader getNCharacterStream(int columnIndex) throws SQLException {
+ connection.getLogger().log(Level.FINEST, " getNCharacterStream columnIndex: {0}", columnIndex);
throw org.postgresql.Driver.notImplemented(this.getClass(), "getNCharacterStream(int)");
}
diff --git a/pgjdbc/src/main/java/org/postgresql/jdbc/PgResultSetMetaData.java b/pgjdbc/src/main/java/org/postgresql/jdbc/PgResultSetMetaData.java
index 34fab12..cdf25f4 100644
--- a/pgjdbc/src/main/java/org/postgresql/jdbc/PgResultSetMetaData.java
+++ b/pgjdbc/src/main/java/org/postgresql/jdbc/PgResultSetMetaData.java
@@ -8,6 +8,7 @@ package org.postgresql.jdbc;
import org.postgresql.PGResultSetMetaData;
import org.postgresql.core.BaseConnection;
import org.postgresql.core.Field;
+import org.postgresql.core.ServerVersion;
import org.postgresql.util.GT;
import org.postgresql.util.JdbcBlackHole;
import org.postgresql.util.LruCache;
@@ -233,9 +234,14 @@ public class PgResultSetMetaData implements ResultSetMetaData, PGResultSetMetaDa
StringBuilder sql = new StringBuilder(
"SELECT c.oid, a.attnum, a.attname, c.relname, n.nspname, "
- + "a.attnotnull OR (t.typtype = 'd' AND t.typnotnull), "
- + "pg_catalog.pg_get_expr(d.adbin, d.adrelid) LIKE '%nextval(%' "
- + "FROM pg_catalog.pg_class c "
+ + "a.attnotnull OR (t.typtype = 'd' AND t.typnotnull), ");
+
+ if ( connection.haveMinimumServerVersion(ServerVersion.v10)) {
+ sql.append("a.attidentity != '' OR pg_catalog.pg_get_expr(d.adbin, d.adrelid) LIKE '%nextval(%' ");
+ } else {
+ sql.append("pg_catalog.pg_get_expr(d.adbin, d.adrelid) LIKE '%nextval(%' ");
+ }
+ sql.append( "FROM pg_catalog.pg_class c "
+ "JOIN pg_catalog.pg_namespace n ON (c.relnamespace = n.oid) "
+ "JOIN pg_catalog.pg_attribute a ON (c.oid = a.attrelid) "
+ "JOIN pg_catalog.pg_type t ON (a.atttypid = t.oid) "
@@ -392,7 +398,7 @@ public class PgResultSetMetaData implements ResultSetMetaData, PGResultSetMetaDa
*
* @param column the first column is 1, the second is 2...
*
- * @return column name, or "" if not applicable
+ * @return 0 if column data foramt is TEXT, or 1 if BINARY
*
* @exception SQLException if a database access error occurs
*/
diff --git a/pgjdbc/src/main/java/org/postgresql/jdbc/PgStatement.java b/pgjdbc/src/main/java/org/postgresql/jdbc/PgStatement.java
index d7c7c0f..b70d54c 100644
--- a/pgjdbc/src/main/java/org/postgresql/jdbc/PgStatement.java
+++ b/pgjdbc/src/main/java/org/postgresql/jdbc/PgStatement.java
@@ -5,7 +5,6 @@
package org.postgresql.jdbc;
-
import org.postgresql.Driver;
import org.postgresql.core.BaseConnection;
import org.postgresql.core.BaseStatement;
@@ -24,7 +23,6 @@ import org.postgresql.util.PSQLState;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
-import java.sql.SQLFeatureNotSupportedException;
import java.sql.SQLWarning;
import java.sql.Statement;
import java.util.ArrayList;
@@ -100,11 +98,7 @@ public class PgStatement implements Statement, BaseStatement {
/**
* The warnings chain.
*/
- protected SQLWarning warnings = null;
- /**
- * The last warning of the warning chain.
- */
- protected SQLWarning lastWarning = null;
+ protected volatile PSQLWarningWrapper warnings = null;
/**
* Maximum number of rows to return, 0 = unlimited
@@ -220,13 +214,10 @@ public class PgStatement implements Statement, BaseStatement {
}
@Override
- public void handleCompletion() throws SQLException {
- SQLWarning warning = getWarning();
- if (warning != null) {
- PgStatement.this.addWarning(warning);
- }
- super.handleCompletion();
+ public void handleWarning(SQLWarning warning) {
+ PgStatement.this.addWarning(warning);
}
+
}
public java.sql.ResultSet executeQuery(String p_sql) throws SQLException {
@@ -234,28 +225,41 @@ public class PgStatement implements Statement, BaseStatement {
throw new PSQLException(GT.tr("No results were returned by the query."), PSQLState.NO_DATA);
}
- if (result.getNext() != null) {
- throw new PSQLException(GT.tr("Multiple ResultSets were returned by the query."),
- PSQLState.TOO_MANY_RESULTS);
- }
+ return getSingleResultSet();
+ }
+
+ protected java.sql.ResultSet getSingleResultSet() throws SQLException {
+ synchronized (this) {
+ checkClosed();
+ if (result.getNext() != null) {
+ throw new PSQLException(GT.tr("Multiple ResultSets were returned by the query."),
+ PSQLState.TOO_MANY_RESULTS);
+ }
- return result.getResultSet();
+ return result.getResultSet();
+ }
}
public int executeUpdate(String p_sql) throws SQLException {
executeWithFlags(p_sql, QueryExecutor.QUERY_NO_RESULTS);
+ return getNoResultUpdateCount();
+ }
- ResultWrapper iter = result;
- while (iter != null) {
- if (iter.getResultSet() != null) {
- throw new PSQLException(GT.tr("A result was returned when none was expected."),
- PSQLState.TOO_MANY_RESULTS);
+ protected int getNoResultUpdateCount() throws SQLException {
+ synchronized (this) {
+ checkClosed();
+ ResultWrapper iter = result;
+ while (iter != null) {
+ if (iter.getResultSet() != null) {
+ throw new PSQLException(GT.tr("A result was returned when none was expected."),
+ PSQLState.TOO_MANY_RESULTS);
+ }
+ iter = iter.getNext();
}
- iter = iter.getNext();
- }
- return getUpdateCount();
+ return getUpdateCount();
+ }
}
public boolean execute(String p_sql) throws SQLException {
@@ -274,7 +278,7 @@ public class PgStatement implements Statement, BaseStatement {
Object key = queryExecutor
.createQueryKey(sql, replaceProcessingEnabled, shouldUseParameterized, columnNames);
CachedQuery cachedQuery;
- boolean shouldCache = preferQueryMode == PreferQueryMode.EXTENDED_CACHE_EVERYTING;
+ boolean shouldCache = preferQueryMode == PreferQueryMode.EXTENDED_CACHE_EVERYTHING;
if (shouldCache) {
cachedQuery = queryExecutor.borrowQueryByKey(key);
} else {
@@ -301,7 +305,10 @@ public class PgStatement implements Statement, BaseStatement {
flags |= QueryExecutor.QUERY_EXECUTE_AS_SIMPLE;
}
execute(simpleQuery, null, flags);
- return (result != null && result.getResultSet() != null);
+ synchronized (this) {
+ checkClosed();
+ return (result != null && result.getResultSet() != null);
+ }
}
public boolean executeWithFlags(int flags) throws SQLException {
@@ -315,20 +322,22 @@ public class PgStatement implements Statement, BaseStatement {
clearWarnings();
// Close any existing resultsets associated with this statement.
- while (firstUnclosedResult != null) {
- ResultSet rs = firstUnclosedResult.getResultSet();
- if (rs != null) {
- rs.close();
+ synchronized (this) {
+ while (firstUnclosedResult != null) {
+ ResultSet rs = firstUnclosedResult.getResultSet();
+ if (rs != null) {
+ rs.close();
+ }
+ firstUnclosedResult = firstUnclosedResult.getNext();
}
- firstUnclosedResult = firstUnclosedResult.getNext();
- }
- result = null;
+ result = null;
- if (generatedKeys != null) {
- if (generatedKeys.getResultSet() != null) {
- generatedKeys.getResultSet().close();
+ if (generatedKeys != null) {
+ if (generatedKeys.getResultSet() != null) {
+ generatedKeys.getResultSet().close();
+ }
+ generatedKeys = null;
}
- generatedKeys = null;
}
}
@@ -424,7 +433,9 @@ public class PgStatement implements Statement, BaseStatement {
}
StatementResultHandler handler = new StatementResultHandler();
- result = null;
+ synchronized (this) {
+ result = null;
+ }
try {
startTimer();
connection.getQueryExecutor().execute(queryToExecute, queryParameters, handler, maxrows,
@@ -432,17 +443,19 @@ public class PgStatement implements Statement, BaseStatement {
} finally {
killTimerTask();
}
- result = firstUnclosedResult = handler.getResults();
+ synchronized (this) {
+ checkClosed();
+ result = firstUnclosedResult = handler.getResults();
- if (wantsGeneratedKeysOnce || wantsGeneratedKeysAlways) {
- generatedKeys = result;
- result = result.getNext();
+ if (wantsGeneratedKeysOnce || wantsGeneratedKeysAlways) {
+ generatedKeys = result;
+ result = result.getNext();
- if (wantsGeneratedKeysOnce) {
- wantsGeneratedKeysOnce = false;
+ if (wantsGeneratedKeysOnce) {
+ wantsGeneratedKeysOnce = false;
+ }
}
}
-
}
public void setCursorName(String name) throws SQLException {
@@ -450,35 +463,38 @@ public class PgStatement implements Statement, BaseStatement {
// No-op.
}
- // This is intentionally non-volatile to avoid performance hit in isClosed checks
- // see #close()
- protected boolean isClosed = false;
+ private volatile boolean isClosed = false;
public int getUpdateCount() throws SQLException {
- checkClosed();
- if (result == null || result.getResultSet() != null) {
- return -1;
- }
+ synchronized (this) {
+ checkClosed();
+ if (result == null || result.getResultSet() != null) {
+ return -1;
+ }
- return result.getUpdateCount();
+ return result.getUpdateCount();
+ }
}
public boolean getMoreResults() throws SQLException {
- if (result == null) {
- return false;
- }
+ synchronized (this) {
+ checkClosed();
+ if (result == null) {
+ return false;
+ }
- result = result.getNext();
+ result = result.getNext();
- // Close preceding resultsets.
- while (firstUnclosedResult != result) {
- if (firstUnclosedResult.getResultSet() != null) {
- firstUnclosedResult.getResultSet().close();
+ // Close preceding resultsets.
+ while (firstUnclosedResult != result) {
+ if (firstUnclosedResult.getResultSet() != null) {
+ firstUnclosedResult.getResultSet().close();
+ }
+ firstUnclosedResult = firstUnclosedResult.getNext();
}
- firstUnclosedResult = firstUnclosedResult.getNext();
- }
- return (result != null && result.getResultSet() != null);
+ return (result != null && result.getResultSet() != null);
+ }
}
public int getMaxRows() throws SQLException {
@@ -538,25 +554,29 @@ public class PgStatement implements Statement, BaseStatement {
}
/**
- * This adds a warning to the warning chain. We track the tail of the warning chain as well to
- * avoid O(N) behavior for adding a new warning to an existing chain. Some server functions which
- * RAISE NOTICE (or equivalent) produce a ton of warnings.
+ * Either initializes new warning wrapper, or adds warning onto the chain.
+ *
+ * Although warnings are expected to be added sequentially, the warnings chain may be cleared
+ * concurrently at any time via {@link #clearWarnings()}, therefore it is possible that a warning
+ * added via this method is placed onto the end of the previous warning chain
*
* @param warn warning to add
*/
public void addWarning(SQLWarning warn) {
- if (warnings == null) {
- warnings = warn;
- lastWarning = warn;
+ //copy reference to avoid NPE from concurrent modification of this.warnings
+ final PSQLWarningWrapper warnWrap = this.warnings;
+ if (warnWrap == null) {
+ this.warnings = new PSQLWarningWrapper(warn);
} else {
- lastWarning.setNextWarning(warn);
- lastWarning = warn;
+ warnWrap.addWarning(warn);
}
}
public SQLWarning getWarnings() throws SQLException {
checkClosed();
- return warnings;
+ //copy reference to avoid NPE from concurrent modification of this.warnings
+ final PSQLWarningWrapper warnWrap = this.warnings;
+ return warnWrap != null ? warnWrap.getFirstWarning() : null;
}
public int getMaxFieldSize() throws SQLException {
@@ -573,19 +593,27 @@ public class PgStatement implements Statement, BaseStatement {
maxfieldSize = max;
}
+ /**
+ * Clears the warning chain.<p>
+ * Note that while it is safe to clear warnings while the query is executing, warnings that are
+ * added between calls to {@link #getWarnings()} and #clearWarnings() may be missed.
+ * Therefore you should hold a reference to the tail of the previous warning chain
+ * and verify if its {@link SQLWarning#getNextWarning()} value is holds any new value.
+ */
public void clearWarnings() throws SQLException {
warnings = null;
- lastWarning = null;
}
public java.sql.ResultSet getResultSet() throws SQLException {
- checkClosed();
+ synchronized (this) {
+ checkClosed();
- if (result == null) {
- return null;
- }
+ if (result == null) {
+ return null;
+ }
- return result.getResultSet();
+ return result.getResultSet();
+ }
}
/**
@@ -594,17 +622,27 @@ public class PgStatement implements Statement, BaseStatement {
*
* {@inheritDoc}
*/
- public void close() throws SQLException {
+ public final void close() throws SQLException {
// closing an already closed Statement is a no-op.
- if (isClosed) {
- return;
+ synchronized (this) {
+ if (isClosed) {
+ return;
+ }
+ isClosed = true;
}
- cleanupTimer();
+ cancel();
closeForNextExecution();
- isClosed = true;
+ closeImpl();
+ }
+
+ /**
+ * This is guaranteed to be called exactly once even in case of concurrent {@link #close()} calls.
+ * @throws SQLException in case of error
+ */
+ protected void closeImpl() throws SQLException {
}
/*
@@ -614,11 +652,13 @@ public class PgStatement implements Statement, BaseStatement {
*/
public long getLastOID() throws SQLException {
- checkClosed();
- if (result == null) {
- return 0;
+ synchronized (this) {
+ checkClosed();
+ if (result == null) {
+ return 0;
+ }
+ return result.getInsertOID();
}
- return result.getInsertOID();
}
public void setPrepareThreshold(int newThreshold) throws SQLException {
@@ -645,7 +685,7 @@ public class PgStatement implements Statement, BaseStatement {
}
protected void checkClosed() throws SQLException {
- if (isClosed) {
+ if (isClosed()) {
throw new PSQLException(GT.tr("This statement has been closed."),
PSQLState.OBJECT_NOT_IN_STATE);
}
@@ -736,7 +776,7 @@ public class PgStatement implements Statement, BaseStatement {
// If executing the same query twice in a batch, make sure the statement
// is server-prepared. In other words, "oneshot" only if the query is one in the batch
// or the queries are different
- && isOneShotQuery(null)) {
+ || isOneShotQuery(null)) {
flags |= QueryExecutor.QUERY_ONESHOT;
} else {
// If a batch requests generated keys and isn't already described,
@@ -786,7 +826,9 @@ public class PgStatement implements Statement, BaseStatement {
}
}
- result = null;
+ synchronized (this) {
+ result = null;
+ }
try {
startTimer();
@@ -795,8 +837,11 @@ public class PgStatement implements Statement, BaseStatement {
} finally {
killTimerTask();
// There might be some rows generated even in case of failures
- if (wantsGeneratedKeysAlways) {
- generatedKeys = new ResultWrapper(handler.getGeneratedKeys());
+ synchronized (this) {
+ checkClosed();
+ if (wantsGeneratedKeysAlways) {
+ generatedKeys = new ResultWrapper(handler.getGeneratedKeys());
+ }
}
}
@@ -804,18 +849,20 @@ public class PgStatement implements Statement, BaseStatement {
}
public void cancel() throws SQLException {
- if (!STATE_UPDATER.compareAndSet(this, StatementCancelState.IN_QUERY, StatementCancelState.CANCELING)) {
+ if (statementState == StatementCancelState.IDLE) {
+ return;
+ }
+ if (!STATE_UPDATER.compareAndSet(this, StatementCancelState.IN_QUERY,
+ StatementCancelState.CANCELING)) {
// Not in query, there's nothing to cancel
return;
}
- try {
- // Synchronize on connection to avoid spinning in killTimerTask
- synchronized (connection) {
+ // Synchronize on connection to avoid spinning in killTimerTask
+ synchronized (connection) {
+ try {
connection.cancelQuery();
- }
- } finally {
- STATE_UPDATER.set(this, StatementCancelState.CANCELLED);
- synchronized (connection) {
+ } finally {
+ STATE_UPDATER.set(this, StatementCancelState.CANCELLED);
connection.notifyAll(); // wake-up killTimerTask
}
}
@@ -924,8 +971,10 @@ public class PgStatement implements Statement, BaseStatement {
// "timeout error"
// We wait till state becomes "cancelled"
boolean interrupted = false;
- while (!STATE_UPDATER.compareAndSet(this, StatementCancelState.CANCELLED, StatementCancelState.IDLE)) {
- synchronized (connection) {
+ synchronized (connection) {
+ // state check is performed under synchronized so it detects "cancelled" state faster
+ // In other words, it prevents unnecessary ".wait()" call
+ while (!STATE_UPDATER.compareAndSet(this, StatementCancelState.CANCELLED, StatementCancelState.IDLE)) {
try {
// Note: wait timeout here is irrelevant since synchronized(connection) would block until
// .cancel finishes
@@ -969,11 +1018,11 @@ public class PgStatement implements Statement, BaseStatement {
throw Driver.notImplemented(this.getClass(), "executeLargeUpdate");
}
- public long executeLargeUpdate(String sql, int columnIndexes[]) throws SQLException {
+ public long executeLargeUpdate(String sql, int[] columnIndexes) throws SQLException {
throw Driver.notImplemented(this.getClass(), "executeLargeUpdate");
}
- public long executeLargeUpdate(String sql, String columnNames[]) throws SQLException {
+ public long executeLargeUpdate(String sql, String[] columnNames) throws SQLException {
throw Driver.notImplemented(this.getClass(), "executeLargeUpdate");
}
@@ -1006,10 +1055,6 @@ public class PgStatement implements Statement, BaseStatement {
throw new SQLException("Cannot unwrap to " + iface.getName());
}
- public java.util.logging.Logger getParentLogger() throws SQLFeatureNotSupportedException {
- throw Driver.notImplemented(this.getClass(), "getParentLogger()");
- }
-
public void closeOnCompletion() throws SQLException {
closeOnCompletion = true;
}
@@ -1023,12 +1068,14 @@ public class PgStatement implements Statement, BaseStatement {
return;
}
- ResultWrapper result = firstUnclosedResult;
- while (result != null) {
- if (result.getResultSet() != null && !result.getResultSet().isClosed()) {
- return;
+ synchronized (this) {
+ ResultWrapper result = firstUnclosedResult;
+ while (result != null) {
+ if (result.getResultSet() != null && !result.getResultSet().isClosed()) {
+ return;
+ }
+ result = result.getNext();
}
- result = result.getNext();
}
// prevent all ResultSet.close arising from Statement.close to loop here
@@ -1042,39 +1089,44 @@ public class PgStatement implements Statement, BaseStatement {
}
public boolean getMoreResults(int current) throws SQLException {
- // CLOSE_CURRENT_RESULT
- if (current == Statement.CLOSE_CURRENT_RESULT && result != null
- && result.getResultSet() != null) {
- result.getResultSet().close();
- }
+ synchronized (this) {
+ checkClosed();
+ // CLOSE_CURRENT_RESULT
+ if (current == Statement.CLOSE_CURRENT_RESULT && result != null
+ && result.getResultSet() != null) {
+ result.getResultSet().close();
+ }
- // Advance resultset.
- if (result != null) {
- result = result.getNext();
- }
+ // Advance resultset.
+ if (result != null) {
+ result = result.getNext();
+ }
- // CLOSE_ALL_RESULTS
- if (current == Statement.CLOSE_ALL_RESULTS) {
- // Close preceding resultsets.
- while (firstUnclosedResult != result) {
- if (firstUnclosedResult.getResultSet() != null) {
- firstUnclosedResult.getResultSet().close();
+ // CLOSE_ALL_RESULTS
+ if (current == Statement.CLOSE_ALL_RESULTS) {
+ // Close preceding resultsets.
+ while (firstUnclosedResult != result) {
+ if (firstUnclosedResult.getResultSet() != null) {
+ firstUnclosedResult.getResultSet().close();
+ }
+ firstUnclosedResult = firstUnclosedResult.getNext();
}
- firstUnclosedResult = firstUnclosedResult.getNext();
}
- }
- // Done.
- return (result != null && result.getResultSet() != null);
+ // Done.
+ return (result != null && result.getResultSet() != null);
+ }
}
public ResultSet getGeneratedKeys() throws SQLException {
- checkClosed();
- if (generatedKeys == null || generatedKeys.getResultSet() == null) {
- return createDriverResultSet(new Field[0], new ArrayList<byte[][]>());
- }
+ synchronized (this) {
+ checkClosed();
+ if (generatedKeys == null || generatedKeys.getResultSet() == null) {
+ return createDriverResultSet(new Field[0], new ArrayList<byte[][]>());
+ }
- return generatedKeys.getResultSet();
+ return generatedKeys.getResultSet();
+ }
}
public int executeUpdate(String sql, int autoGeneratedKeys) throws SQLException {
@@ -1085,7 +1137,7 @@ public class PgStatement implements Statement, BaseStatement {
return executeUpdate(sql, (String[]) null);
}
- public int executeUpdate(String sql, int columnIndexes[]) throws SQLException {
+ public int executeUpdate(String sql, int[] columnIndexes) throws SQLException {
if (columnIndexes == null || columnIndexes.length == 0) {
return executeUpdate(sql);
}
@@ -1094,7 +1146,7 @@ public class PgStatement implements Statement, BaseStatement {
PSQLState.NOT_IMPLEMENTED);
}
- public int executeUpdate(String sql, String columnNames[]) throws SQLException {
+ public int executeUpdate(String sql, String[] columnNames) throws SQLException {
if (columnNames != null && columnNames.length == 0) {
return executeUpdate(sql);
}
@@ -1113,7 +1165,7 @@ public class PgStatement implements Statement, BaseStatement {
return execute(sql, (String[]) null);
}
- public boolean execute(String sql, int columnIndexes[]) throws SQLException {
+ public boolean execute(String sql, int[] columnIndexes) throws SQLException {
if (columnIndexes != null && columnIndexes.length == 0) {
return execute(sql);
}
@@ -1122,7 +1174,7 @@ public class PgStatement implements Statement, BaseStatement {
PSQLState.NOT_IMPLEMENTED);
}
- public boolean execute(String sql, String columnNames[]) throws SQLException {
+ public boolean execute(String sql, String[] columnNames) throws SQLException {
if (columnNames != null && columnNames.length == 0) {
return execute(sql);
}
diff --git a/pgjdbc/src/main/java/org/postgresql/jdbc/PreferQueryMode.java b/pgjdbc/src/main/java/org/postgresql/jdbc/PreferQueryMode.java
index 1516d4a..42501e1 100644
--- a/pgjdbc/src/main/java/org/postgresql/jdbc/PreferQueryMode.java
+++ b/pgjdbc/src/main/java/org/postgresql/jdbc/PreferQueryMode.java
@@ -17,7 +17,7 @@ public enum PreferQueryMode {
SIMPLE("simple"),
EXTENDED_FOR_PREPARED("extendedForPrepared"),
EXTENDED("extended"),
- EXTENDED_CACHE_EVERYTING("extendedCacheEveryting");
+ EXTENDED_CACHE_EVERYTHING("extendedCacheEverything");
private final String value;
diff --git a/pgjdbc/src/main/java/org/postgresql/jdbc/PrimitiveArraySupport.java b/pgjdbc/src/main/java/org/postgresql/jdbc/PrimitiveArraySupport.java
new file mode 100644
index 0000000..b92f01b
--- /dev/null
+++ b/pgjdbc/src/main/java/org/postgresql/jdbc/PrimitiveArraySupport.java
@@ -0,0 +1,488 @@
+/*
+ * Copyright (c) 2004, PostgreSQL Global Development Group
+ * See the LICENSE file in the project root for more information.
+ */
+
+package org.postgresql.jdbc;
+
+import org.postgresql.core.Oid;
+import org.postgresql.core.TypeInfo;
+import org.postgresql.util.ByteConverter;
+
+import java.sql.Connection;
+import java.sql.SQLFeatureNotSupportedException;
+import java.util.HashMap;
+import java.util.Map;
+
+abstract class PrimitiveArraySupport<A> {
+
+ public abstract int getDefaultArrayTypeOid(TypeInfo tiCache);
+
+ public abstract String toArrayString(char delim, A array);
+
+ public abstract void appendArray(StringBuilder sb, char delim, A array);
+
+ public boolean supportBinaryRepresentation() {
+ return true;
+ }
+
+ public abstract byte[] toBinaryRepresentation(Connection connection, A array) throws SQLFeatureNotSupportedException;
+
+ private static final PrimitiveArraySupport<long[]> LONG_ARRAY = new PrimitiveArraySupport<long[]>() {
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public int getDefaultArrayTypeOid(TypeInfo tiCache) {
+ return Oid.INT8_ARRAY;
+ }
+
+ @Override
+ public String toArrayString(char delim, long[] array) {
+ final StringBuilder sb = new StringBuilder(Math.max(64, array.length * 8));
+ appendArray(sb, delim, array);
+ return sb.toString();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void appendArray(StringBuilder sb, char delim, long[] array) {
+ sb.append('{');
+ for (int i = 0; i < array.length; ++i) {
+ if (i > 0) {
+ sb.append(delim);
+ }
+ sb.append(array[i]);
+ }
+ sb.append('}');
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public byte[] toBinaryRepresentation(Connection connection, long[] array) {
+
+ int length = 20 + (12 * array.length);
+ final byte[] bytes = new byte[length];
+
+ // 1 dimension
+ ByteConverter.int4(bytes, 0, 1);
+ // no null
+ ByteConverter.int4(bytes, 4, 0);
+ // oid
+ ByteConverter.int4(bytes, 8, Oid.INT8);
+ // length
+ ByteConverter.int4(bytes, 12, array.length);
+
+ int idx = 20;
+ for (int i = 0; i < array.length; ++i) {
+ bytes[idx + 3] = 8;
+ ByteConverter.int8(bytes, idx + 4, array[i]);
+ idx += 12;
+ }
+
+ return bytes;
+ }
+ };
+
+ private static final PrimitiveArraySupport<int[]> INT_ARRAY = new PrimitiveArraySupport<int[]>() {
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public int getDefaultArrayTypeOid(TypeInfo tiCache) {
+ return Oid.INT4_ARRAY;
+ }
+
+ @Override
+ public String toArrayString(char delim, int[] array) {
+ final StringBuilder sb = new StringBuilder(Math.max(32, array.length * 6));
+ appendArray(sb, delim, array);
+ return sb.toString();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void appendArray(StringBuilder sb, char delim, int[] array) {
+ sb.append('{');
+ for (int i = 0; i < array.length; ++i) {
+ if (i > 0) {
+ sb.append(delim);
+ }
+ sb.append(array[i]);
+ }
+ sb.append('}');
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public byte[] toBinaryRepresentation(Connection connection, int[] array) {
+
+ int length = 20 + (8 * array.length);
+ final byte[] bytes = new byte[length];
+
+ // 1 dimension
+ ByteConverter.int4(bytes, 0, 1);
+ // no null
+ ByteConverter.int4(bytes, 4, 0);
+ // oid
+ ByteConverter.int4(bytes, 8, Oid.INT4);
+ // length
+ ByteConverter.int4(bytes, 12, array.length);
+
+ int idx = 20;
+ for (int i = 0; i < array.length; ++i) {
+ bytes[idx + 3] = 4;
+ ByteConverter.int4(bytes, idx + 4, array[i]);
+ idx += 8;
+ }
+
+ return bytes;
+ }
+ };
+
+ private static final PrimitiveArraySupport<short[]> SHORT_ARRAY = new PrimitiveArraySupport<short[]>() {
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public int getDefaultArrayTypeOid(TypeInfo tiCache) {
+ return Oid.INT2_ARRAY;
+ }
+
+ @Override
+ public String toArrayString(char delim, short[] array) {
+ final StringBuilder sb = new StringBuilder(Math.max(32, array.length * 4));
+ appendArray(sb, delim, array);
+ return sb.toString();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void appendArray(StringBuilder sb, char delim, short[] array) {
+ sb.append('{');
+ for (int i = 0; i < array.length; ++i) {
+ if (i > 0) {
+ sb.append(delim);
+ }
+ sb.append(array[i]);
+ }
+ sb.append('}');
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public byte[] toBinaryRepresentation(Connection connection, short[] array) {
+
+ int length = 20 + (6 * array.length);
+ final byte[] bytes = new byte[length];
+
+ // 1 dimension
+ ByteConverter.int4(bytes, 0, 1);
+ // no null
+ ByteConverter.int4(bytes, 4, 0);
+ // oid
+ ByteConverter.int4(bytes, 8, Oid.INT2);
+ // length
+ ByteConverter.int4(bytes, 12, array.length);
+
+ int idx = 20;
+ for (int i = 0; i < array.length; ++i) {
+ bytes[idx + 3] = 2;
+ ByteConverter.int2(bytes, idx + 4, array[i]);
+ idx += 6;
+ }
+
+ return bytes;
+ }
+
+ };
+
+ private static final PrimitiveArraySupport<double[]> DOUBLE_ARRAY = new PrimitiveArraySupport<double[]>() {
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public int getDefaultArrayTypeOid(TypeInfo tiCache) {
+ return Oid.FLOAT8_ARRAY;
+ }
+
+ @Override
+ public String toArrayString(char delim, double[] array) {
+ final StringBuilder sb = new StringBuilder(Math.max(64, array.length * 8));
+ appendArray(sb, delim, array);
+ return sb.toString();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void appendArray(StringBuilder sb, char delim, double[] array) {
+ sb.append('{');
+ for (int i = 0; i < array.length; ++i) {
+ if (i > 0) {
+ sb.append(delim);
+ }
+ // use quotes to account for any issues with scientific notation
+ sb.append('"');
+ sb.append(array[i]);
+ sb.append('"');
+ }
+ sb.append('}');
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public byte[] toBinaryRepresentation(Connection connection, double[] array) {
+
+ int length = 20 + (12 * array.length);
+ final byte[] bytes = new byte[length];
+
+ // 1 dimension
+ ByteConverter.int4(bytes, 0, 1);
+ // no null
+ ByteConverter.int4(bytes, 4, 0);
+ // oid
+ ByteConverter.int4(bytes, 8, Oid.FLOAT8);
+ // length
+ ByteConverter.int4(bytes, 12, array.length);
+
+ int idx = 20;
+ for (int i = 0; i < array.length; ++i) {
+ bytes[idx + 3] = 8;
+ ByteConverter.float8(bytes, idx + 4, array[i]);
+ idx += 12;
+ }
+
+ return bytes;
+ }
+
+ };
+
+ private static final PrimitiveArraySupport<float[]> FLOAT_ARRAY = new PrimitiveArraySupport<float[]>() {
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public int getDefaultArrayTypeOid(TypeInfo tiCache) {
+ return Oid.FLOAT4_ARRAY;
+ }
+
+ @Override
+ public String toArrayString(char delim, float[] array) {
+ final StringBuilder sb = new StringBuilder(Math.max(64, array.length * 8));
+ appendArray(sb, delim, array);
+ return sb.toString();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void appendArray(StringBuilder sb, char delim, float[] array) {
+ sb.append('{');
+ for (int i = 0; i < array.length; ++i) {
+ if (i > 0) {
+ sb.append(delim);
+ }
+ // use quotes to account for any issues with scientific notation
+ sb.append('"');
+ sb.append(array[i]);
+ sb.append('"');
+ }
+ sb.append('}');
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public byte[] toBinaryRepresentation(Connection connection, float[] array) {
+
+ int length = 20 + (8 * array.length);
+ final byte[] bytes = new byte[length];
+
+ // 1 dimension
+ ByteConverter.int4(bytes, 0, 1);
+ // no null
+ ByteConverter.int4(bytes, 4, 0);
+ // oid
+ ByteConverter.int4(bytes, 8, Oid.FLOAT4);
+ // length
+ ByteConverter.int4(bytes, 12, array.length);
+
+ int idx = 20;
+ for (int i = 0; i < array.length; ++i) {
+ bytes[idx + 3] = 4;
+ ByteConverter.float4(bytes, idx + 4, array[i]);
+ idx += 8;
+ }
+
+ return bytes;
+ }
+
+ };
+
+ private static final PrimitiveArraySupport<boolean[]> BOOLEAN_ARRAY = new PrimitiveArraySupport<boolean[]>() {
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public int getDefaultArrayTypeOid(TypeInfo tiCache) {
+ return Oid.BOOL_ARRAY;
+ }
+
+ @Override
+ public String toArrayString(char delim, boolean[] array) {
+ final StringBuilder sb = new StringBuilder(Math.max(64, array.length * 8));
+ appendArray(sb, delim, array);
+ return sb.toString();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void appendArray(StringBuilder sb, char delim, boolean[] array) {
+ sb.append('{');
+ for (int i = 0; i < array.length; ++i) {
+ if (i > 0) {
+ sb.append(delim);
+ }
+ sb.append(array[i] ? '1' : '0');
+ }
+ sb.append('}');
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @throws SQLFeatureNotSupportedException
+ * Because this feature is not supported.
+ */
+ @Override
+ public byte[] toBinaryRepresentation(Connection connection, boolean[] array) throws SQLFeatureNotSupportedException {
+ int length = 20 + (5 * array.length);
+ final byte[] bytes = new byte[length];
+
+ // 1 dimension
+ ByteConverter.int4(bytes, 0, 1);
+ // no null
+ ByteConverter.int4(bytes, 4, 0);
+ // oid
+ ByteConverter.int4(bytes, 8, Oid.BOOL);
+ // length
+ ByteConverter.int4(bytes, 12, array.length);
+
+ int idx = 20;
+ for (int i = 0; i < array.length; ++i) {
+ bytes[idx + 3] = 1;
+ ByteConverter.bool(bytes, idx + 4, array[i]);
+ idx += 5;
+ }
+
+ return bytes;
+ }
+
+ };
+
+ private static final PrimitiveArraySupport<String[]> STRING_ARRAY = new PrimitiveArraySupport<String[]>() {
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public int getDefaultArrayTypeOid(TypeInfo tiCache) {
+ return Oid.VARCHAR_ARRAY;
+ }
+
+ @Override
+ public String toArrayString(char delim, String[] array) {
+ final StringBuilder sb = new StringBuilder(Math.max(64, array.length * 8));
+ appendArray(sb, delim, array);
+ return sb.toString();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void appendArray(StringBuilder sb, char delim, String[] array) {
+ sb.append('{');
+ for (int i = 0; i < array.length; ++i) {
+ if (i > 0) {
+ sb.append(delim);
+ }
+ if (array[i] == null) {
+ sb.append('N');
+ sb.append('U');
+ sb.append('L');
+ sb.append('L');
+ } else {
+ PgArray.escapeArrayElement(sb, array[i]);
+ }
+ }
+ sb.append('}');
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public boolean supportBinaryRepresentation() {
+ return false;
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @throws SQLFeatureNotSupportedException
+ * Because this feature is not supported.
+ */
+ @Override
+ public byte[] toBinaryRepresentation(Connection connection, String[] array) throws SQLFeatureNotSupportedException {
+ throw new SQLFeatureNotSupportedException();
+ }
+
+ };
+
+ private static final Map<Class, PrimitiveArraySupport> ARRAY_CLASS_TO_SUPPORT = new HashMap<Class, PrimitiveArraySupport>((int) (7 / .75) + 1);
+
+ static {
+ ARRAY_CLASS_TO_SUPPORT.put(long[].class, LONG_ARRAY);
+ ARRAY_CLASS_TO_SUPPORT.put(int[].class, INT_ARRAY);
+ ARRAY_CLASS_TO_SUPPORT.put(short[].class, SHORT_ARRAY);
+ ARRAY_CLASS_TO_SUPPORT.put(double[].class, DOUBLE_ARRAY);
+ ARRAY_CLASS_TO_SUPPORT.put(float[].class, FLOAT_ARRAY);
+ ARRAY_CLASS_TO_SUPPORT.put(boolean[].class, BOOLEAN_ARRAY);
+ ARRAY_CLASS_TO_SUPPORT.put(String[].class, STRING_ARRAY);
+ }
+
+ public static boolean isSupportedPrimitiveArray(Object obj) {
+ return obj != null && ARRAY_CLASS_TO_SUPPORT.containsKey(obj.getClass());
+ }
+
+ public static <A> PrimitiveArraySupport<A> getArraySupport(A array) {
+ return ARRAY_CLASS_TO_SUPPORT.get(array.getClass());
+ }
+}
diff --git a/pgjdbc/src/main/java/org/postgresql/jdbc/TimestampUtils.java b/pgjdbc/src/main/java/org/postgresql/jdbc/TimestampUtils.java
index 8207f9f..cfdb922 100644
--- a/pgjdbc/src/main/java/org/postgresql/jdbc/TimestampUtils.java
+++ b/pgjdbc/src/main/java/org/postgresql/jdbc/TimestampUtils.java
@@ -6,6 +6,7 @@
package org.postgresql.jdbc;
import org.postgresql.PGStatement;
+import org.postgresql.core.JavaVersion;
import org.postgresql.core.Oid;
import org.postgresql.core.Provider;
import org.postgresql.util.ByteConverter;
@@ -24,7 +25,9 @@ import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.OffsetDateTime;
import java.time.ZoneOffset;
+import java.time.ZonedDateTime;
import java.time.chrono.IsoEra;
+import java.time.format.DateTimeParseException;
import java.time.temporal.ChronoField;
//#endif
import java.util.Calendar;
@@ -84,12 +87,16 @@ public class TimestampUtils {
// This saves the creation of a clone everytime, and the memory associated to all these clones.
Field tzField;
try {
- tzField = TimeZone.class.getDeclaredField("defaultTimeZone");
- tzField.setAccessible(true);
- TimeZone defaultTz = TimeZone.getDefault();
- Object tzFromField = tzField.get(null);
- if (defaultTz == null || !defaultTz.equals(tzFromField)) {
- tzField = null;
+ tzField = null;
+ // Avoid reflective access in Java 9+
+ if (JavaVersion.getRuntimeVersion().compareTo(JavaVersion.v1_8) <= 0) {
+ tzField = TimeZone.class.getDeclaredField("defaultTimeZone");
+ tzField.setAccessible(true);
+ TimeZone defaultTz = TimeZone.getDefault();
+ Object tzFromField = tzField.get(null);
+ if (defaultTz == null || !defaultTz.equals(tzFromField)) {
+ tzField = null;
+ }
}
} catch (Exception e) {
tzField = null;
@@ -107,19 +114,13 @@ public class TimestampUtils {
private Calendar calCache;
private int calCacheZone;
- private final boolean min74;
- private final boolean min82;
-
/**
* True if the backend uses doubles for time values. False if long is used.
*/
private final boolean usesDouble;
private final Provider<TimeZone> timeZoneProvider;
- TimestampUtils(boolean min74, boolean min82, boolean usesDouble,
- Provider<TimeZone> timeZoneProvider) {
- this.min74 = min74;
- this.min82 = min82;
+ TimestampUtils(boolean usesDouble, Provider<TimeZone> timeZoneProvider) {
this.usesDouble = usesDouble;
this.timeZoneProvider = timeZoneProvider;
}
@@ -314,13 +315,11 @@ public class TimestampUtils {
}
tzsec = 0;
- if (min82) {
- sep = charAt(s, start);
- if (sep == ':') {
- end = firstNonDigit(s, start + 1); // Skip ':'
- tzsec = number(s, start + 1, end);
- start = end;
- }
+ sep = charAt(s, start);
+ if (sep == ':') {
+ end = firstNonDigit(s, start + 1); // Skip ':'
+ tzsec = number(s, start + 1, end);
+ start = end;
}
// Setting offset does not seem to work correctly in all
@@ -402,6 +401,32 @@ public class TimestampUtils {
//#if mvn.project.property.postgresql.jdbc.spec >= "JDBC4.2"
/**
+ * Parse a string and return a LocalTime representing its value.
+ *
+ * @param s The ISO formated time string to parse.
+ * @return null if s is null or a LocalTime of the parsed string s.
+ * @throws SQLException if there is a problem parsing s.
+ */
+ public LocalTime toLocalTime(String s) throws SQLException {
+ if (s == null) {
+ return null;
+ }
+
+ if (s.equals("24:00:00")) {
+ return LocalTime.MAX;
+ }
+
+ try {
+ return LocalTime.parse(s);
+ } catch (DateTimeParseException nfe) {
+ throw new PSQLException(
+ GT.tr("Bad value for type timestamp/date/time: {1}", s),
+ PSQLState.BAD_DATETIME_FORMAT, nfe);
+ }
+
+ }
+
+ /**
* Parse a string and return a LocalDateTime representing its value.
*
* @param s The ISO formated date string to parse.
@@ -439,25 +464,45 @@ public class TimestampUtils {
public synchronized Time toTime(Calendar cal, String s) throws SQLException {
// 1) Parse backend string
- Timestamp timestamp = toTimestamp(cal, s);
-
- if (timestamp == null) {
+ if (s == null) {
return null;
}
-
- long millis = timestamp.getTime();
- // infinity cannot be represented as Time
- // so there's not much we can do here.
- if (millis <= PGStatement.DATE_NEGATIVE_INFINITY
- || millis >= PGStatement.DATE_POSITIVE_INFINITY) {
- throw new PSQLException(
- GT.tr("Infinite value found for timestamp/date. This cannot be represented as time."),
- PSQLState.DATETIME_OVERFLOW);
+ ParsedTimestamp ts = parseBackendTimestamp(s);
+ Calendar useCal = ts.tz != null ? ts.tz : setupCalendar(cal);
+ if (ts.tz == null) {
+ // When no time zone provided (e.g. time or timestamp)
+ // We get the year-month-day from the string, then truncate the day to 1970-01-01
+ // This is used for timestamp -> time conversion
+ // Note: this cannot be merged with "else" branch since
+ // timestamps at which the time flips to/from DST depend on the date
+ // For instance, 2000-03-26 02:00:00 is invalid timestamp in Europe/Moscow time zone
+ // and the valid one is 2000-03-26 03:00:00. That is why we parse full timestamp
+ // then set year to 1970 later
+ useCal.set(Calendar.ERA, ts.era);
+ useCal.set(Calendar.YEAR, ts.year);
+ useCal.set(Calendar.MONTH, ts.month - 1);
+ useCal.set(Calendar.DAY_OF_MONTH, ts.day);
+ } else {
+ // When time zone is given, we just pick the time part and assume date to be 1970-01-01
+ // this is used for time, timez, and timestamptz parsing
+ useCal.set(Calendar.ERA, GregorianCalendar.AD);
+ useCal.set(Calendar.YEAR, 1970);
+ useCal.set(Calendar.MONTH, Calendar.JANUARY);
+ useCal.set(Calendar.DAY_OF_MONTH, 1);
}
+ useCal.set(Calendar.HOUR_OF_DAY, ts.hour);
+ useCal.set(Calendar.MINUTE, ts.minute);
+ useCal.set(Calendar.SECOND, ts.second);
+ useCal.set(Calendar.MILLISECOND, 0);
+ long timeMillis = useCal.getTimeInMillis() + ts.nanos / 1000000;
+ if (ts.tz != null || (ts.year == 1970 && ts.era == GregorianCalendar.AD)) {
+ // time with time zone has proper time zone, so the value can be returned as is
+ return new Time(timeMillis);
+ }
- // 2) Truncate date part so in given time zone the date would be formatted as 00:00
- return convertToTime(timestamp.getTime(), cal == null ? null : cal.getTimeZone());
+ // 2) Truncate date part so in given time zone the date would be formatted as 01/01/1970
+ return convertToTime(timeMillis, useCal == null ? null : useCal.getTimeZone());
}
public synchronized Date toDate(Calendar cal, String s) throws SQLException {
@@ -562,7 +607,7 @@ public class TimestampUtils {
appendTime(sbuf, cal, cal.get(Calendar.MILLISECOND) * 1000000);
// The 'time' parser for <= 7.3 doesn't like timezones.
- if (min74 && withTimeZone) {
+ if (withTimeZone) {
appendTimeZone(sbuf, cal);
}
@@ -609,21 +654,28 @@ public class TimestampUtils {
sb.append(':');
sb.append(NUMBERS[seconds]);
- // Add nanoseconds.
+ // Add microseconds, rounded.
// This won't work for server versions < 7.2 which only want
// a two digit fractional second, but we don't need to support 7.1
// anymore and getting the version number here is difficult.
//
- if (nanos == 0) {
+ int microseconds = (nanos / 1000) + (((nanos % 1000) + 500) / 1000);
+ if (microseconds == 0) {
return;
}
sb.append('.');
int len = sb.length();
- sb.append(nanos / 1000); // append microseconds
+ sb.append(microseconds);
int needZeros = 6 - (sb.length() - len);
if (needZeros > 0) {
sb.insert(len, ZEROS, 0, needZeros);
}
+
+ int end = sb.length() - 1;
+ while (sb.charAt(end) == '0') {
+ sb.deleteCharAt(end);
+ end--;
+ }
}
private void appendTimeZone(StringBuilder sb, java.util.Calendar cal) {
@@ -649,7 +701,7 @@ public class TimestampUtils {
sb.append(NUMBERS[mins]);
- if (min82 && secs != 0) {
+ if (secs != 0) {
sb.append(':');
sb.append(NUMBERS[secs]);
}
@@ -678,14 +730,13 @@ public class TimestampUtils {
}
public synchronized String toString(LocalTime localTime) {
- if (LocalTime.MAX.equals(localTime)) {
- return "infinity";
- } else if (LocalTime.MIN.equals(localTime)) {
- return "-infinity";
- }
sbuf.setLength(0);
+ if (localTime.equals( LocalTime.MAX )) {
+ return "24:00:00";
+ }
+
appendTime(sbuf, localTime);
return sbuf.toString();
@@ -712,6 +763,10 @@ public class TimestampUtils {
return sbuf.toString();
}
+ /**
+ * Formats {@link LocalDateTime} to be sent to the backend, thus it adds time zone.
+ * Do not use this method in {@link java.sql.ResultSet#getString(int)}
+ */
public synchronized String toString(LocalDateTime localDateTime) {
if (LocalDateTime.MAX.equals(localDateTime)) {
return "infinity";
@@ -719,15 +774,9 @@ public class TimestampUtils {
return "-infinity";
}
- sbuf.setLength(0);
-
- LocalDate localDate = localDateTime.toLocalDate();
- appendDate(sbuf, localDate);
- sbuf.append(' ');
- appendTime(sbuf, localDateTime.toLocalTime());
- appendEra(sbuf, localDate);
-
- return sbuf.toString();
+ // LocalDateTime is always passed with time zone so backend can decide between timestamp and timestamptz
+ ZonedDateTime zonedDateTime = localDateTime.atZone(getDefaultTz().toZoneId());
+ return toString(zonedDateTime.toOffsetDateTime());
}
private static void appendDate(StringBuilder sb, LocalDate localDate) {
@@ -816,14 +865,15 @@ public class TimestampUtils {
long secs = toJavaSecs(days * 86400L);
long millis = secs * 1000L;
- // Here be dragons: backend did not provide us the timezone, so we guess the actual point in
- // time
- millis = guessTimestamp(millis, tz);
-
if (millis <= PGStatement.DATE_NEGATIVE_SMALLER_INFINITY) {
millis = PGStatement.DATE_NEGATIVE_INFINITY;
} else if (millis >= PGStatement.DATE_POSITIVE_SMALLER_INFINITY) {
millis = PGStatement.DATE_POSITIVE_INFINITY;
+ } else {
+ // Here be dragons: backend did not provide us the timezone, so we guess the actual point in
+ // time
+
+ millis = guessTimestamp(millis, tz);
}
return new Date(millis);
}
@@ -883,19 +933,50 @@ public class TimestampUtils {
timeOffset = ByteConverter.int4(bytes, 8);
timeOffset *= -1000;
millis -= timeOffset;
- } else {
- if (tz == null) {
- tz = getDefaultTz();
- }
+ return new Time(millis);
+ }
- // Here be dragons: backend did not provide us the timezone, so we guess the actual point in
- // time
- millis = guessTimestamp(millis, tz);
+ if (tz == null) {
+ tz = getDefaultTz();
}
+ // Here be dragons: backend did not provide us the timezone, so we guess the actual point in
+ // time
+ millis = guessTimestamp(millis, tz);
+
return convertToTime(millis, tz); // Ensure date part is 1970-01-01
}
+
+ //#if mvn.project.property.postgresql.jdbc.spec >= "JDBC4.2"
+ /**
+ * Returns the SQL Time object matching the given bytes with {@link Oid#TIME}.
+ *
+ * @param bytes The binary encoded time value.
+ * @return The parsed time object.
+ * @throws PSQLException If binary format could not be parsed.
+ */
+ public LocalTime toLocalTimeBin(byte[] bytes) throws PSQLException {
+ if (bytes.length != 8) {
+ throw new PSQLException(GT.tr("Unsupported binary encoding of {0}.", "time"),
+ PSQLState.BAD_DATETIME_FORMAT);
+ }
+
+ long micros;
+
+ if (usesDouble) {
+ double seconds = ByteConverter.float8(bytes, 0);
+
+ micros = (long) (seconds * 1000000d);
+ } else {
+ micros = ByteConverter.int8(bytes, 0);
+ }
+
+
+ return LocalTime.ofNanoOfDay(micros * 1000);
+ }
+ //#endif
+
/**
* Returns the SQL Timestamp object matching the given bytes with {@link Oid#TIMESTAMP} or
* {@link Oid#TIMESTAMPTZ}.
@@ -1002,7 +1083,7 @@ public class TimestampUtils {
if (parsedTimestamp.infinity == Infinity.POSITIVE) {
return LocalDateTime.MAX;
} else if (parsedTimestamp.infinity == Infinity.NEGATIVE) {
- return LocalDateTime.MAX;
+ return LocalDateTime.MIN;
}
return LocalDateTime.ofEpochSecond(parsedTimestamp.millis / 1000L, parsedTimestamp.nanos, ZoneOffset.UTC);
diff --git a/pgjdbc/src/main/java/org/postgresql/jdbc/TypeInfoCache.java b/pgjdbc/src/main/java/org/postgresql/jdbc/TypeInfoCache.java
index fc047cd..c55f1d7 100644
--- a/pgjdbc/src/main/java/org/postgresql/jdbc/TypeInfoCache.java
+++ b/pgjdbc/src/main/java/org/postgresql/jdbc/TypeInfoCache.java
@@ -64,7 +64,7 @@ public class TypeInfoCache implements TypeInfo {
// 2 - sql type
// 3 - java class
// 4 - array type oid
- private static final Object types[][] = {
+ private static final Object[][] types = {
{"int2", Oid.INT2, Types.SMALLINT, "java.lang.Integer", Oid.INT2_ARRAY},
{"int4", Oid.INT4, Types.INTEGER, "java.lang.Integer", Oid.INT4_ARRAY},
{"oid", Oid.OID, Types.BIGINT, "java.lang.Long", Oid.OID_ARRAY},
@@ -98,7 +98,7 @@ public class TypeInfoCache implements TypeInfo {
* PG maps several alias to real type names. When we do queries against pg_catalog, we must use
* the real type, not an alias, so use this mapping.
*/
- private final static HashMap<String, String> typeAliases;
+ private static final HashMap<String, String> typeAliases;
static {
typeAliases = new HashMap<String, String>();
@@ -196,13 +196,12 @@ public class TypeInfoCache implements TypeInfo {
// Other types use typelem that aren't actually arrays, like box.
//
String sql;
- if (_conn.haveMinimumServerVersion(ServerVersion.v8_0)) {
- // in case of multiple records (in different schemas) choose the one from the current
- // schema,
- // otherwise take the last version of a type that is at least more deterministic then before
- // (keeping old behaviour of finding types, that should not be found without correct search
- // path)
- sql = "SELECT typinput='array_in'::regproc, typtype "
+ // in case of multiple records (in different schemas) choose the one from the current
+ // schema,
+ // otherwise take the last version of a type that is at least more deterministic then before
+ // (keeping old behaviour of finding types, that should not be found without correct search
+ // path)
+ sql = "SELECT typinput='array_in'::regproc, typtype "
+ " FROM pg_catalog.pg_type "
+ " LEFT "
+ " JOIN (select ns.oid as nspoid, ns.nspname, r.r "
@@ -215,12 +214,6 @@ public class TypeInfoCache implements TypeInfo {
+ " ON sp.nspoid = typnamespace "
+ " WHERE typname = ? "
+ " ORDER BY sp.r, pg_type.oid DESC LIMIT 1;";
- } else if (_conn.haveMinimumServerVersion(ServerVersion.v7_3)) {
- sql =
- "SELECT typinput='array_in'::regproc, typtype FROM pg_catalog.pg_type WHERE typname = ? ORDER BY oid DESC LIMIT 1";
- } else {
- sql = "SELECT typinput='array_in'::regproc, typtype FROM pg_type WHERE typname = ? LIMIT 1";
- }
_getTypeInfoStatement = _conn.prepareStatement(sql);
}
@@ -267,10 +260,9 @@ public class TypeInfoCache implements TypeInfo {
if (dotIndex == -1 && !hasQuote && !isArray) {
if (_getOidStatementSimple == null) {
String sql;
- if (_conn.haveMinimumServerVersion(ServerVersion.v8_0)) {
- // see comments in @getSQLType()
- // -- go with older way of unnesting array to be compatible with 8.0
- sql = "SELECT pg_type.oid, typname "
+ // see comments in @getSQLType()
+ // -- go with older way of unnesting array to be compatible with 8.0
+ sql = "SELECT pg_type.oid, typname "
+ " FROM pg_catalog.pg_type "
+ " LEFT "
+ " JOIN (select ns.oid as nspoid, ns.nspname, r.r "
@@ -282,11 +274,6 @@ public class TypeInfoCache implements TypeInfo {
+ " ON sp.nspoid = typnamespace "
+ " WHERE typname = ? "
+ " ORDER BY sp.r, pg_type.oid DESC LIMIT 1;";
- } else if (_conn.haveMinimumServerVersion(ServerVersion.v7_3)) {
- sql = "SELECT oid, typname FROM pg_catalog.pg_type WHERE typname = ? ORDER BY oid DESC LIMIT 1";
- } else {
- sql = "SELECT oid, typname FROM pg_type WHERE typname = ? ORDER BY oid DESC LIMIT 1";
- }
_getOidStatementSimple = _conn.prepareStatement(sql);
}
// coerce to lower case to handle upper case type names
@@ -299,12 +286,23 @@ public class TypeInfoCache implements TypeInfo {
PreparedStatement oidStatementComplex;
if (isArray) {
if (_getOidStatementComplexArray == null) {
- String sql = "SELECT t.typarray, arr.typname "
- + " FROM pg_catalog.pg_type t"
- + " JOIN pg_catalog.pg_namespace n ON t.typnamespace = n.oid"
- + " JOIN pg_catalog.pg_type arr ON arr.oid = t.typarray"
- + " WHERE t.typname = ? AND (n.nspname = ? OR ? IS NULL AND n.nspname = ANY (current_schemas(true)))"
- + " ORDER BY t.oid DESC LIMIT 1";
+ String sql;
+ if (_conn.haveMinimumServerVersion(ServerVersion.v8_3)) {
+ sql = "SELECT t.typarray, arr.typname "
+ + " FROM pg_catalog.pg_type t"
+ + " JOIN pg_catalog.pg_namespace n ON t.typnamespace = n.oid"
+ + " JOIN pg_catalog.pg_type arr ON arr.oid = t.typarray"
+ + " WHERE t.typname = ? AND (n.nspname = ? OR ? AND n.nspname = ANY (current_schemas(true)))"
+ + " ORDER BY t.oid DESC LIMIT 1";
+ } else {
+ sql = "SELECT t.oid, t.typname "
+ + " FROM pg_catalog.pg_type t"
+ + " JOIN pg_catalog.pg_namespace n ON t.typnamespace = n.oid"
+ + " WHERE t.typelem = (SELECT oid FROM pg_catalog.pg_type WHERE typname = ?)"
+ + " AND substring(t.typname, 1, 1) = '_' AND t.typlen = -1"
+ + " AND (n.nspname = ? OR ? AND n.nspname = ANY (current_schemas(true)))"
+ + " ORDER BY t.typelem DESC LIMIT 1";
+ }
_getOidStatementComplexArray = _conn.prepareStatement(sql);
}
oidStatementComplex = _getOidStatementComplexArray;
@@ -313,12 +311,14 @@ public class TypeInfoCache implements TypeInfo {
String sql = "SELECT t.oid, t.typname "
+ " FROM pg_catalog.pg_type t"
+ " JOIN pg_catalog.pg_namespace n ON t.typnamespace = n.oid"
- + " WHERE t.typname = ? AND (n.nspname = ? OR ? IS NULL AND n.nspname = ANY (current_schemas(true)))"
+ + " WHERE t.typname = ? AND (n.nspname = ? OR ? AND n.nspname = ANY (current_schemas(true)))"
+ " ORDER BY t.oid DESC LIMIT 1";
_getOidStatementComplexNonArray = _conn.prepareStatement(sql);
}
oidStatementComplex = _getOidStatementComplexNonArray;
}
+ //type name requested may be schema specific, of the form "{schema}"."typeName",
+ //or may check across all schemas where a schema is not specified.
String fullName = isArray ? pgTypeName.substring(0, pgTypeName.length() - 2) : pgTypeName;
String schema;
String name;
@@ -354,7 +354,7 @@ public class TypeInfoCache implements TypeInfo {
}
oidStatementComplex.setString(1, name);
oidStatementComplex.setString(2, schema);
- oidStatementComplex.setString(3, schema);
+ oidStatementComplex.setBoolean(3, schema == null);
return oidStatementComplex;
}
@@ -397,13 +397,9 @@ public class TypeInfoCache implements TypeInfo {
if (_getNameStatement == null) {
String sql;
- if (_conn.haveMinimumServerVersion(ServerVersion.v7_3)) {
- sql =
- "SELECT n.nspname = ANY(current_schemas(true)), n.nspname, t.typname FROM pg_catalog.pg_type t JOIN pg_catalog.pg_namespace n ON t.typnamespace = n.oid WHERE t.oid = ?";
- } else {
- sql =
- "SELECT n.nspname = ANY(current_schemas(true)), n.nspname, t.typname FROM pg_type t JOIN pg_namespace n ON t.typnamespace = n.oid WHERE t.oid = ?";
- }
+ sql = "SELECT n.nspname = ANY(current_schemas(true)), n.nspname, t.typname "
+ + "FROM pg_catalog.pg_type t "
+ + "JOIN pg_catalog.pg_namespace n ON t.typnamespace = n.oid WHERE t.oid = ?";
_getNameStatement = _conn.prepareStatement(sql);
}
@@ -475,12 +471,8 @@ public class TypeInfoCache implements TypeInfo {
if (_getArrayDelimiterStatement == null) {
String sql;
- if (_conn.haveMinimumServerVersion(ServerVersion.v7_3)) {
- sql =
- "SELECT e.typdelim FROM pg_catalog.pg_type t, pg_catalog.pg_type e WHERE t.oid = ? and t.typelem = e.oid";
- } else {
- sql = "SELECT e.typdelim FROM pg_type t, pg_type e WHERE t.oid = ? and t.typelem = e.oid";
- }
+ sql = "SELECT e.typdelim FROM pg_catalog.pg_type t, pg_catalog.pg_type e "
+ + "WHERE t.oid = ? and t.typelem = e.oid";
_getArrayDelimiterStatement = _conn.prepareStatement(sql);
}
@@ -520,13 +512,9 @@ public class TypeInfoCache implements TypeInfo {
if (_getArrayElementOidStatement == null) {
String sql;
- if (_conn.haveMinimumServerVersion(ServerVersion.v7_3)) {
- sql =
- "SELECT e.oid, n.nspname = ANY(current_schemas(true)), n.nspname, e.typname FROM pg_catalog.pg_type t JOIN pg_catalog.pg_type e ON t.typelem = e.oid JOIN pg_catalog.pg_namespace n ON t.typnamespace = n.oid WHERE t.oid = ?";
- } else {
- sql =
- "SELECT e.oid, n.nspname = ANY(current_schemas(true)), n.nspname, e.typname FROM pg_type t JOIN pg_type e ON t.typelem = e.oid JOIN pg_namespace n ON t.typnamespace = n.oid WHERE t.oid = ?";
- }
+ sql = "SELECT e.oid, n.nspname = ANY(current_schemas(true)), n.nspname, e.typname "
+ + "FROM pg_catalog.pg_type t JOIN pg_catalog.pg_type e ON t.typelem = e.oid "
+ + "JOIN pg_catalog.pg_namespace n ON t.typnamespace = n.oid WHERE t.oid = ?";
_getArrayElementOidStatement = _conn.prepareStatement(sql);
}
diff --git a/pgjdbc/src/main/java/org/postgresql/jdbc2/optional/ConnectionPool.java b/pgjdbc/src/main/java/org/postgresql/jdbc2/optional/ConnectionPool.java
index 26adeb4..b5c46fe 100644
--- a/pgjdbc/src/main/java/org/postgresql/jdbc2/optional/ConnectionPool.java
+++ b/pgjdbc/src/main/java/org/postgresql/jdbc2/optional/ConnectionPool.java
@@ -7,5 +7,9 @@ package org.postgresql.jdbc2.optional;
import org.postgresql.ds.PGConnectionPoolDataSource;
+/**
+ * @deprecated Please use {@link PGConnectionPoolDataSource}
+ */
+ at Deprecated
public class ConnectionPool extends PGConnectionPoolDataSource {
}
diff --git a/pgjdbc/src/main/java/org/postgresql/jdbc2/optional/PoolingDataSource.java b/pgjdbc/src/main/java/org/postgresql/jdbc2/optional/PoolingDataSource.java
index a6d04bd..f47d373 100644
--- a/pgjdbc/src/main/java/org/postgresql/jdbc2/optional/PoolingDataSource.java
+++ b/pgjdbc/src/main/java/org/postgresql/jdbc2/optional/PoolingDataSource.java
@@ -7,5 +7,9 @@ package org.postgresql.jdbc2.optional;
import org.postgresql.ds.PGPoolingDataSource;
+/**
+ * @deprecated Since 42.0.0, see {@link PGPoolingDataSource}
+ */
+ at Deprecated
public class PoolingDataSource extends PGPoolingDataSource {
}
diff --git a/pgjdbc/src/main/java/org/postgresql/jdbc2/optional/SimpleDataSource.java b/pgjdbc/src/main/java/org/postgresql/jdbc2/optional/SimpleDataSource.java
index 650d0f4..6ac0053 100644
--- a/pgjdbc/src/main/java/org/postgresql/jdbc2/optional/SimpleDataSource.java
+++ b/pgjdbc/src/main/java/org/postgresql/jdbc2/optional/SimpleDataSource.java
@@ -7,5 +7,9 @@ package org.postgresql.jdbc2.optional;
import org.postgresql.ds.PGSimpleDataSource;
+/**
+ * @deprecated Please use {@link PGSimpleDataSource}
+ */
+ at Deprecated
public class SimpleDataSource extends PGSimpleDataSource {
}
diff --git a/pgjdbc/src/main/java/org/postgresql/jdbc3/Jdbc3ConnectionPool.java b/pgjdbc/src/main/java/org/postgresql/jdbc3/Jdbc3ConnectionPool.java
index f4c5cae..950b017 100644
--- a/pgjdbc/src/main/java/org/postgresql/jdbc3/Jdbc3ConnectionPool.java
+++ b/pgjdbc/src/main/java/org/postgresql/jdbc3/Jdbc3ConnectionPool.java
@@ -7,5 +7,9 @@ package org.postgresql.jdbc3;
import org.postgresql.ds.PGConnectionPoolDataSource;
+/**
+ * @deprecated Please use {@link PGConnectionPoolDataSource}
+ */
+ at Deprecated
public class Jdbc3ConnectionPool extends PGConnectionPoolDataSource {
}
diff --git a/pgjdbc/src/main/java/org/postgresql/jdbc3/Jdbc3PoolingDataSource.java b/pgjdbc/src/main/java/org/postgresql/jdbc3/Jdbc3PoolingDataSource.java
index 5599a93..10b1920 100644
--- a/pgjdbc/src/main/java/org/postgresql/jdbc3/Jdbc3PoolingDataSource.java
+++ b/pgjdbc/src/main/java/org/postgresql/jdbc3/Jdbc3PoolingDataSource.java
@@ -7,5 +7,9 @@ package org.postgresql.jdbc3;
import org.postgresql.ds.PGPoolingDataSource;
+/**
+ * @deprecated Since 42.0.0, see {@link PGPoolingDataSource}
+ */
+ at Deprecated
public class Jdbc3PoolingDataSource extends PGPoolingDataSource {
}
diff --git a/pgjdbc/src/main/java/org/postgresql/jdbc3/Jdbc3SimpleDataSource.java b/pgjdbc/src/main/java/org/postgresql/jdbc3/Jdbc3SimpleDataSource.java
index 7c95932..b04e28b 100644
--- a/pgjdbc/src/main/java/org/postgresql/jdbc3/Jdbc3SimpleDataSource.java
+++ b/pgjdbc/src/main/java/org/postgresql/jdbc3/Jdbc3SimpleDataSource.java
@@ -7,5 +7,9 @@ package org.postgresql.jdbc3;
import org.postgresql.ds.PGSimpleDataSource;
+/**
+ * @deprecated Please use {@link PGSimpleDataSource}
+ */
+ at Deprecated
public class Jdbc3SimpleDataSource extends PGSimpleDataSource {
}
diff --git a/pgjdbc/src/main/java/org/postgresql/jre8/sasl/ScramAuthenticator.java b/pgjdbc/src/main/java/org/postgresql/jre8/sasl/ScramAuthenticator.java
new file mode 100644
index 0000000..87daa05
--- /dev/null
+++ b/pgjdbc/src/main/java/org/postgresql/jre8/sasl/ScramAuthenticator.java
@@ -0,0 +1,166 @@
+/*
+ * Copyright (c) 2017, PostgreSQL Global Development Group
+ * See the LICENSE file in the project root for more information.
+ */
+
+
+package org.postgresql.jre8.sasl;
+
+import org.postgresql.core.PGStream;
+import org.postgresql.util.GT;
+import org.postgresql.util.PSQLException;
+import org.postgresql.util.PSQLState;
+
+import com.ongres.scram.client.ScramClient;
+import com.ongres.scram.client.ScramSession;
+import com.ongres.scram.common.exception.ScramException;
+import com.ongres.scram.common.exception.ScramInvalidServerSignatureException;
+import com.ongres.scram.common.exception.ScramParseException;
+import com.ongres.scram.common.exception.ScramServerErrorException;
+import com.ongres.scram.common.stringprep.StringPreparations;
+
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+public class ScramAuthenticator {
+ private static final Logger LOGGER = Logger.getLogger(ScramAuthenticator.class.getName());
+
+ private final String user;
+ private final String password;
+ private final PGStream pgStream;
+ private ScramClient scramClient;
+ private ScramSession scramSession;
+ private ScramSession.ServerFirstProcessor serverFirstProcessor;
+ private ScramSession.ClientFinalProcessor clientFinalProcessor;
+
+ @FunctionalInterface
+ private interface BodySender {
+ void sendBody(PGStream pgStream) throws IOException;
+ }
+
+ private void sendAuthenticationMessage(int bodyLength, BodySender bodySender)
+ throws IOException {
+ pgStream.sendChar('p');
+ pgStream.sendInteger4(Integer.BYTES + bodyLength);
+ bodySender.sendBody(pgStream);
+ pgStream.flush();
+ }
+
+ public ScramAuthenticator(String user, String password, PGStream pgStream) {
+ this.user = user;
+ this.password = password;
+ this.pgStream = pgStream;
+ }
+
+ public void processServerMechanismsAndInit() throws IOException, PSQLException {
+ List<String> mechanisms = new ArrayList<>();
+ do {
+ mechanisms.add(pgStream.receiveString());
+ } while (pgStream.peekChar() != 0);
+ int c = pgStream.receiveChar();
+ assert c == 0;
+ if (mechanisms.size() < 1) {
+ throw new PSQLException(
+ GT.tr("No SCRAM mechanism(s) advertised by the server"),
+ PSQLState.CONNECTION_REJECTED
+ );
+ }
+
+ try {
+ scramClient = ScramClient
+ .channelBinding(ScramClient.ChannelBinding.NO)
+ .stringPreparation(StringPreparations.NO_PREPARATION)
+ .selectMechanismBasedOnServerAdvertised(mechanisms.toArray(new String[]{}))
+ .setup();
+ } catch (IllegalArgumentException e) {
+ throw new PSQLException(
+ GT.tr("Invalid or unsupported by client SCRAM mechanisms", e),
+ PSQLState.CONNECTION_REJECTED
+ );
+ }
+ LOGGER.log(Level.FINEST, " Using SCRAM mechanism {0}", scramClient.getScramMechanism().getName());
+
+ scramSession =
+ scramClient.scramSession("*"); // Real username is ignored by server, uses startup one
+ }
+
+ public void sendScramClientFirstMessage() throws IOException {
+ String clientFirstMessage = scramSession.clientFirstMessage();
+ LOGGER.log(Level.FINEST, " FE=> SASLInitialResponse( {0} )", clientFirstMessage);
+
+ String scramMechanismName = scramClient.getScramMechanism().getName();
+ byte[] scramMechanismNameBytes = scramMechanismName.getBytes(StandardCharsets.UTF_8);
+ byte[] clientFirstMessageBytes = clientFirstMessage.getBytes(StandardCharsets.UTF_8);
+ sendAuthenticationMessage(
+ (scramMechanismNameBytes.length + 1) + 4 + clientFirstMessageBytes.length,
+ s -> {
+ s.send(scramMechanismNameBytes);
+ s.sendChar(0); // List terminated in '\0'
+ s.sendInteger4(clientFirstMessageBytes.length);
+ s.send(clientFirstMessageBytes);
+ }
+ );
+ }
+
+ public void processServerFirstMessage(int length) throws IOException, PSQLException {
+ String serverFirstMessage = pgStream.receiveString(length);
+ LOGGER.log(Level.FINEST, " <=BE AuthenticationSASLContinue( {0} )", serverFirstMessage);
+
+ try {
+ serverFirstProcessor = scramSession.receiveServerFirstMessage(serverFirstMessage);
+ } catch (ScramException e) {
+ throw new PSQLException(
+ GT.tr("Invalid server-first-message: {0}", serverFirstMessage),
+ PSQLState.CONNECTION_REJECTED,
+ e
+ );
+ }
+ LOGGER.log(Level.FINEST,
+ " <=BE AuthenticationSASLContinue(salt={0}, iterations={1})",
+ new Object[] { serverFirstProcessor.getSalt(), serverFirstProcessor.getIteration() }
+ );
+
+ clientFinalProcessor = serverFirstProcessor.clientFinalProcessor(password);
+
+ String clientFinalMessage = clientFinalProcessor.clientFinalMessage();
+ LOGGER.log(Level.FINEST, " FE=> SASLResponse( {0} )", clientFinalMessage);
+
+ byte[] clientFinalMessageBytes = clientFinalMessage.getBytes(StandardCharsets.UTF_8);
+ sendAuthenticationMessage(
+ clientFinalMessageBytes.length,
+ s -> s.send(clientFinalMessageBytes)
+ );
+ }
+
+ public void verifyServerSignature(int length) throws IOException, PSQLException {
+ String serverFinalMessage = pgStream.receiveString(length);
+ LOGGER.log(Level.FINEST, " <=BE AuthenticationSASLFinal( {0} )", serverFinalMessage);
+
+ try {
+ clientFinalProcessor.receiveServerFinalMessage(serverFinalMessage);
+ } catch (ScramParseException e) {
+ throw new PSQLException(
+ GT.tr("Invalid server-final-message: {0}", serverFinalMessage),
+ PSQLState.CONNECTION_REJECTED,
+ e
+ );
+ } catch (ScramServerErrorException e) {
+ throw new PSQLException(
+ GT.tr("SCRAM authentication failed, server returned error: {0}",
+ e.getError().getErrorMessage()),
+ PSQLState.CONNECTION_REJECTED,
+ e
+ );
+ } catch (ScramInvalidServerSignatureException e) {
+ throw new PSQLException(
+ GT.tr("Invalid server SCRAM signature"),
+ PSQLState.CONNECTION_REJECTED,
+ e
+ );
+ }
+ }
+}
diff --git a/pgjdbc/src/main/java/org/postgresql/largeobject/BlobInputStream.java b/pgjdbc/src/main/java/org/postgresql/largeobject/BlobInputStream.java
index 0be87d7..95f03d3 100644
--- a/pgjdbc/src/main/java/org/postgresql/largeobject/BlobInputStream.java
+++ b/pgjdbc/src/main/java/org/postgresql/largeobject/BlobInputStream.java
@@ -41,7 +41,7 @@ public class BlobInputStream extends InputStream {
/**
* The mark position
*/
- private int mpos = 0;
+ private long mpos = 0;
/**
* The limit
@@ -156,12 +156,7 @@ public class BlobInputStream extends InputStream {
* @see java.io.InputStream#reset()
*/
public synchronized void mark(int readlimit) {
- try {
- mpos = lo.tell();
- } catch (SQLException se) {
- // Can't throw this because mark API doesn't allow it.
- // throw new IOException(se.toString());
- }
+ mpos = apos;
}
/**
@@ -174,7 +169,13 @@ public class BlobInputStream extends InputStream {
public synchronized void reset() throws IOException {
checkClosed();
try {
- lo.seek(mpos);
+ if (mpos <= Integer.MAX_VALUE) {
+ lo.seek((int)mpos);
+ } else {
+ lo.seek64(mpos, LargeObject.SEEK_SET);
+ }
+ buffer = null;
+ apos = mpos;
} catch (SQLException se) {
throw new IOException(se.toString());
}
diff --git a/pgjdbc/src/main/java/org/postgresql/largeobject/BlobOutputStream.java b/pgjdbc/src/main/java/org/postgresql/largeobject/BlobOutputStream.java
index e2ea607..e95067d 100644
--- a/pgjdbc/src/main/java/org/postgresql/largeobject/BlobOutputStream.java
+++ b/pgjdbc/src/main/java/org/postgresql/largeobject/BlobOutputStream.java
@@ -21,7 +21,7 @@ public class BlobOutputStream extends OutputStream {
/**
* Buffer
*/
- private byte buf[];
+ private byte[] buf;
/**
* Size of the buffer (default 1K)
diff --git a/pgjdbc/src/main/java/org/postgresql/largeobject/LargeObject.java b/pgjdbc/src/main/java/org/postgresql/largeobject/LargeObject.java
index e5d3d8a..38469a5 100644
--- a/pgjdbc/src/main/java/org/postgresql/largeobject/LargeObject.java
+++ b/pgjdbc/src/main/java/org/postgresql/largeobject/LargeObject.java
@@ -41,7 +41,11 @@ import java.sql.SQLException;
* @see java.sql.PreparedStatement#setBinaryStream
* @see java.sql.PreparedStatement#setUnicodeStream
*/
-public class LargeObject {
+public class LargeObject
+ //#if mvn.project.property.postgresql.jdbc.spec >= "JDBC4.1"
+ implements AutoCloseable
+ //#endif
+ /* hi, checkstyle */ {
/**
* Indicates a seek from the begining of a file
*/
@@ -96,7 +100,7 @@ public class LargeObject {
this.commitOnClose = false;
}
- FastpathArg args[] = new FastpathArg[2];
+ FastpathArg[] args = new FastpathArg[2];
args[0] = Fastpath.createOIDArg(oid);
args[1] = new FastpathArg(mode);
this.fd = fp.getInteger("lo_open", args);
@@ -137,6 +141,7 @@ public class LargeObject {
* @return the OID of this LargeObject
* @deprecated As of 8.3, replaced by {@link #getLongOID()}
*/
+ @Deprecated
public int getOID() {
return (int) oid;
}
@@ -168,7 +173,7 @@ public class LargeObject {
}
// finally close
- FastpathArg args[] = new FastpathArg[1];
+ FastpathArg[] args = new FastpathArg[1];
args[0] = new FastpathArg(fd);
fp.fastpath("lo_close", args); // true here as we dont care!!
closed = true;
@@ -188,7 +193,7 @@ public class LargeObject {
public byte[] read(int len) throws SQLException {
// This is the original method, where the entire block (len bytes)
// is retrieved in one go.
- FastpathArg args[] = new FastpathArg[2];
+ FastpathArg[] args = new FastpathArg[2];
args[0] = new FastpathArg(fd);
args[1] = new FastpathArg(len);
return fp.getData("loread", args);
@@ -203,8 +208,8 @@ public class LargeObject {
* @return the number of bytes actually read
* @throws SQLException if a database-access error occurs.
*/
- public int read(byte buf[], int off, int len) throws SQLException {
- byte b[] = read(len);
+ public int read(byte[] buf, int off, int len) throws SQLException {
+ byte[] b = read(len);
if (b.length < len) {
len = b.length;
}
@@ -218,8 +223,8 @@ public class LargeObject {
* @param buf array to write
* @throws SQLException if a database-access error occurs.
*/
- public void write(byte buf[]) throws SQLException {
- FastpathArg args[] = new FastpathArg[2];
+ public void write(byte[] buf) throws SQLException {
+ FastpathArg[] args = new FastpathArg[2];
args[0] = new FastpathArg(fd);
args[1] = new FastpathArg(buf);
fp.fastpath("lowrite", args);
@@ -233,8 +238,8 @@ public class LargeObject {
* @param len number of bytes to write
* @throws SQLException if a database-access error occurs.
*/
- public void write(byte buf[], int off, int len) throws SQLException {
- FastpathArg args[] = new FastpathArg[2];
+ public void write(byte[] buf, int off, int len) throws SQLException {
+ FastpathArg[] args = new FastpathArg[2];
args[0] = new FastpathArg(fd);
args[1] = new FastpathArg(buf, off, len);
fp.fastpath("lowrite", args);
@@ -252,7 +257,7 @@ public class LargeObject {
* @throws SQLException if a database-access error occurs.
*/
public void seek(int pos, int ref) throws SQLException {
- FastpathArg args[] = new FastpathArg[3];
+ FastpathArg[] args = new FastpathArg[3];
args[0] = new FastpathArg(fd);
args[1] = new FastpathArg(pos);
args[2] = new FastpathArg(ref);
@@ -267,7 +272,7 @@ public class LargeObject {
* @throws SQLException if a database-access error occurs.
*/
public void seek64(long pos, int ref) throws SQLException {
- FastpathArg args[] = new FastpathArg[3];
+ FastpathArg[] args = new FastpathArg[3];
args[0] = new FastpathArg(fd);
args[1] = new FastpathArg(pos);
args[2] = new FastpathArg(ref);
@@ -293,7 +298,7 @@ public class LargeObject {
* @throws SQLException if a database-access error occurs.
*/
public int tell() throws SQLException {
- FastpathArg args[] = new FastpathArg[1];
+ FastpathArg[] args = new FastpathArg[1];
args[0] = new FastpathArg(fd);
return fp.getInteger("lo_tell", args);
}
@@ -303,7 +308,7 @@ public class LargeObject {
* @throws SQLException if a database-access error occurs.
*/
public long tell64() throws SQLException {
- FastpathArg args[] = new FastpathArg[1];
+ FastpathArg[] args = new FastpathArg[1];
args[0] = new FastpathArg(fd);
return fp.getLong("lo_tell64", args);
}
@@ -349,7 +354,7 @@ public class LargeObject {
* @throws SQLException if something goes wrong
*/
public void truncate(int len) throws SQLException {
- FastpathArg args[] = new FastpathArg[2];
+ FastpathArg[] args = new FastpathArg[2];
args[0] = new FastpathArg(fd);
args[1] = new FastpathArg(len);
fp.getInteger("lo_truncate", args);
@@ -364,7 +369,7 @@ public class LargeObject {
* @throws SQLException if something goes wrong
*/
public void truncate64(long len) throws SQLException {
- FastpathArg args[] = new FastpathArg[2];
+ FastpathArg[] args = new FastpathArg[2];
args[0] = new FastpathArg(fd);
args[1] = new FastpathArg(len);
fp.getInteger("lo_truncate64", args);
diff --git a/pgjdbc/src/main/java/org/postgresql/largeobject/LargeObjectManager.java b/pgjdbc/src/main/java/org/postgresql/largeobject/LargeObjectManager.java
index f5b79df..82e9db6 100644
--- a/pgjdbc/src/main/java/org/postgresql/largeobject/LargeObjectManager.java
+++ b/pgjdbc/src/main/java/org/postgresql/largeobject/LargeObjectManager.java
@@ -5,7 +5,6 @@
package org.postgresql.largeobject;
-
import org.postgresql.core.BaseConnection;
import org.postgresql.fastpath.Fastpath;
import org.postgresql.fastpath.FastpathArg;
@@ -16,6 +15,7 @@ import org.postgresql.util.PSQLState;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
+import java.util.logging.Level;
/**
* This class implements the large object interface to org.postgresql.
@@ -149,7 +149,7 @@ public class LargeObjectManager {
res.close();
stmt.close();
- conn.getLogger().debug("Large Object initialised");
+ conn.getLogger().log(Level.FINE, "Large Object initialised");
}
/**
@@ -305,7 +305,7 @@ public class LargeObjectManager {
throw new PSQLException(GT.tr("Large Objects may not be used in auto-commit mode."),
PSQLState.NO_ACTIVE_SQL_TRANSACTION);
}
- FastpathArg args[] = new FastpathArg[1];
+ FastpathArg[] args = new FastpathArg[1];
args[0] = new FastpathArg(mode);
return fp.getOID("lo_creat", args);
}
@@ -331,7 +331,7 @@ public class LargeObjectManager {
* @throws SQLException on error
*/
public void delete(long oid) throws SQLException {
- FastpathArg args[] = new FastpathArg[1];
+ FastpathArg[] args = new FastpathArg[1];
args[0] = Fastpath.createOIDArg(oid);
fp.fastpath("lo_unlink", args);
}
diff --git a/pgjdbc/src/main/java/org/postgresql/osgi/PGBundleActivator.java b/pgjdbc/src/main/java/org/postgresql/osgi/PGBundleActivator.java
index a92418f..20c064b 100644
--- a/pgjdbc/src/main/java/org/postgresql/osgi/PGBundleActivator.java
+++ b/pgjdbc/src/main/java/org/postgresql/osgi/PGBundleActivator.java
@@ -24,8 +24,8 @@ public class PGBundleActivator implements BundleActivator {
public void start(BundleContext context) throws Exception {
Dictionary<String, Object> properties = new Hashtable<String, Object>();
properties.put(DataSourceFactory.OSGI_JDBC_DRIVER_CLASS, Driver.class.getName());
- properties.put(DataSourceFactory.OSGI_JDBC_DRIVER_NAME, "PostgreSQL JDBC Driver");
- properties.put(DataSourceFactory.OSGI_JDBC_DRIVER_VERSION, Driver.getVersion());
+ properties.put(DataSourceFactory.OSGI_JDBC_DRIVER_NAME, org.postgresql.util.DriverInfo.DRIVER_NAME);
+ properties.put(DataSourceFactory.OSGI_JDBC_DRIVER_VERSION, org.postgresql.util.DriverInfo.DRIVER_VERSION);
try {
_registration = context.registerService(DataSourceFactory.class.getName(),
new PGDataSourceFactory(), properties);
diff --git a/pgjdbc/src/main/java/org/postgresql/osgi/PGDataSourceFactory.java b/pgjdbc/src/main/java/org/postgresql/osgi/PGDataSourceFactory.java
index ef390c7..a378639 100644
--- a/pgjdbc/src/main/java/org/postgresql/osgi/PGDataSourceFactory.java
+++ b/pgjdbc/src/main/java/org/postgresql/osgi/PGDataSourceFactory.java
@@ -37,7 +37,7 @@ public class PGDataSourceFactory implements DataSourceFactory {
private static class SingleUseProperties extends Properties {
private static final long serialVersionUID = 1L;
- public SingleUseProperties(Properties initialProperties) {
+ SingleUseProperties(Properties initialProperties) {
super();
if (initialProperties != null) {
putAll(initialProperties);
diff --git a/pgjdbc/src/main/java/org/postgresql/replication/LogSequenceNumber.java b/pgjdbc/src/main/java/org/postgresql/replication/LogSequenceNumber.java
new file mode 100644
index 0000000..0a073f2
--- /dev/null
+++ b/pgjdbc/src/main/java/org/postgresql/replication/LogSequenceNumber.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright (c) 2016, PostgreSQL Global Development Group
+ * See the LICENSE file in the project root for more information.
+ */
+
+package org.postgresql.replication;
+
+import java.nio.ByteBuffer;
+
+/**
+ * LSN (Log Sequence Number) data which is a pointer to a location in the XLOG
+ */
+public final class LogSequenceNumber {
+ /**
+ * Zero is used indicate an invalid pointer. Bootstrap skips the first possible WAL segment,
+ * initializing the first WAL page at XLOG_SEG_SIZE, so no XLOG record can begin at zero.
+ */
+ public static final LogSequenceNumber INVALID_LSN = LogSequenceNumber.valueOf(0);
+
+ private final long value;
+
+ private LogSequenceNumber(long value) {
+ this.value = value;
+ }
+
+ /**
+ * @param value numeric represent position in the write-ahead log stream
+ * @return not null LSN instance
+ */
+ public static LogSequenceNumber valueOf(long value) {
+ return new LogSequenceNumber(value);
+ }
+
+ /**
+ * Create LSN instance by string represent LSN
+ *
+ * @param strValue not null string as two hexadecimal numbers of up to 8 digits each, separated by
+ * a slash. For example {@code 16/3002D50}, {@code 0/15D68C50}
+ * @return not null LSN instance where if specified string represent have not valid form {@link
+ * LogSequenceNumber#INVALID_LSN}
+ */
+ public static LogSequenceNumber valueOf(String strValue) {
+ int slashIndex = strValue.lastIndexOf('/');
+
+ if (slashIndex <= 0) {
+ return INVALID_LSN;
+ }
+
+ String logicalXLogStr = strValue.substring(0, slashIndex);
+ int logicalXlog = (int) Long.parseLong(logicalXLogStr, 16);
+ String segmentStr = strValue.substring(slashIndex + 1, strValue.length());
+ int segment = (int) Long.parseLong(segmentStr, 16);
+
+ ByteBuffer buf = ByteBuffer.allocate(8);
+ buf.putInt(logicalXlog);
+ buf.putInt(segment);
+ buf.position(0);
+ long value = buf.getLong();
+
+ return LogSequenceNumber.valueOf(value);
+ }
+
+ /**
+ * @return Long represent position in the write-ahead log stream
+ */
+ public long asLong() {
+ return value;
+ }
+
+ /**
+ * @return String represent position in the write-ahead log stream as two hexadecimal numbers of
+ * up to 8 digits each, separated by a slash. For example {@code 16/3002D50}, {@code 0/15D68C50}
+ */
+ public String asString() {
+ ByteBuffer buf = ByteBuffer.allocate(8);
+ buf.putLong(value);
+ buf.position(0);
+
+ int logicalXlog = buf.getInt();
+ int segment = buf.getInt();
+ return String.format("%X/%X", logicalXlog, segment);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+
+ LogSequenceNumber that = (LogSequenceNumber) o;
+
+ return value == that.value;
+
+ }
+
+ @Override
+ public int hashCode() {
+ return (int) (value ^ (value >>> 32));
+ }
+
+ @Override
+ public String toString() {
+ return "LSN{" + asString() + '}';
+ }
+}
diff --git a/pgjdbc/src/main/java/org/postgresql/replication/PGReplicationConnection.java b/pgjdbc/src/main/java/org/postgresql/replication/PGReplicationConnection.java
new file mode 100644
index 0000000..ab65988
--- /dev/null
+++ b/pgjdbc/src/main/java/org/postgresql/replication/PGReplicationConnection.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2016, PostgreSQL Global Development Group
+ * See the LICENSE file in the project root for more information.
+ */
+
+package org.postgresql.replication;
+
+import org.postgresql.PGProperty;
+import org.postgresql.replication.fluent.ChainedCreateReplicationSlotBuilder;
+import org.postgresql.replication.fluent.ChainedStreamBuilder;
+
+import java.sql.SQLException;
+
+/**
+ * Api available only if connection was create with required for replication properties: {@link
+ * PGProperty#REPLICATION} and {@link PGProperty#ASSUME_MIN_SERVER_VERSION}. Without it property
+ * building replication stream fail with exception.
+ */
+public interface PGReplicationConnection {
+
+ /**
+ * After start replication stream this connection not available to use for another queries until
+ * replication stream will not close.
+ *
+ * @return not null fluent api for build replication stream
+ */
+ ChainedStreamBuilder replicationStream();
+
+ /**
+ * <p>Create replication slot, that can be next use in {@link PGReplicationConnection#replicationStream()}
+ *
+ * <p>Replication slots provide an automated way to ensure that the master does not remove WAL
+ * segments until they have been received by all standbys, and that the master does not remove
+ * rows which could cause a recovery conflict even when the standby is disconnected.
+ *
+ * @return not null fluent api for build create replication slot
+ */
+ ChainedCreateReplicationSlotBuilder createReplicationSlot();
+
+ /**
+ * @param slotName not null replication slot name exists in database that should be drop
+ */
+ void dropReplicationSlot(String slotName) throws SQLException;
+}
diff --git a/pgjdbc/src/main/java/org/postgresql/replication/PGReplicationConnectionImpl.java b/pgjdbc/src/main/java/org/postgresql/replication/PGReplicationConnectionImpl.java
new file mode 100644
index 0000000..5503391
--- /dev/null
+++ b/pgjdbc/src/main/java/org/postgresql/replication/PGReplicationConnectionImpl.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2016, PostgreSQL Global Development Group
+ * See the LICENSE file in the project root for more information.
+ */
+
+package org.postgresql.replication;
+
+import org.postgresql.core.BaseConnection;
+import org.postgresql.replication.fluent.ChainedCreateReplicationSlotBuilder;
+import org.postgresql.replication.fluent.ChainedStreamBuilder;
+import org.postgresql.replication.fluent.ReplicationCreateSlotBuilder;
+import org.postgresql.replication.fluent.ReplicationStreamBuilder;
+
+import java.sql.SQLException;
+import java.sql.Statement;
+
+public class PGReplicationConnectionImpl implements PGReplicationConnection {
+ private BaseConnection connection;
+
+ public PGReplicationConnectionImpl(BaseConnection connection) {
+ this.connection = connection;
+ }
+
+ @Override
+ public ChainedStreamBuilder replicationStream() {
+ return new ReplicationStreamBuilder(connection);
+ }
+
+ @Override
+ public ChainedCreateReplicationSlotBuilder createReplicationSlot() {
+ return new ReplicationCreateSlotBuilder(connection);
+ }
+
+ @Override
+ public void dropReplicationSlot(String slotName) throws SQLException {
+ if (slotName == null || slotName.isEmpty()) {
+ throw new IllegalArgumentException("Replication slot name can't be null or empty");
+ }
+
+ Statement statement = connection.createStatement();
+ try {
+ statement.execute("DROP_REPLICATION_SLOT " + slotName);
+ } finally {
+ statement.close();
+ }
+ }
+}
diff --git a/pgjdbc/src/main/java/org/postgresql/replication/PGReplicationStream.java b/pgjdbc/src/main/java/org/postgresql/replication/PGReplicationStream.java
new file mode 100644
index 0000000..ea07a98
--- /dev/null
+++ b/pgjdbc/src/main/java/org/postgresql/replication/PGReplicationStream.java
@@ -0,0 +1,130 @@
+/*
+ * Copyright (c) 2016, PostgreSQL Global Development Group
+ * See the LICENSE file in the project root for more information.
+ */
+
+package org.postgresql.replication;
+
+import org.postgresql.replication.fluent.CommonOptions;
+import org.postgresql.replication.fluent.logical.LogicalReplicationOptions;
+
+import java.nio.ByteBuffer;
+import java.sql.SQLException;
+
+/**
+ * Not tread safe replication stream. After complete streaming should be close, for free resource on
+ * backend. Periodical status update work only when use {@link PGReplicationStream#read()} method.
+ * It means that process wal record should be fast as possible, because during process wal record
+ * lead to disconnect by timeout from server.
+ */
+public interface PGReplicationStream
+ //#if mvn.project.property.postgresql.jdbc.spec >= "JDBC4.1"
+ extends AutoCloseable
+ //#endif
+ /* hi, checkstyle */ {
+
+ /**
+ * <p>Read next wal record from backend. It method can be block until new message will not get
+ * from server.
+ *
+ * <p>A single WAL record is never split across two XLogData messages. When a WAL record crosses a
+ * WAL page boundary, and is therefore already split using continuation records, it can be split
+ * at the page boundary. In other words, the first main WAL record and its continuation records
+ * can be sent in different XLogData messages.
+ *
+ * @return not null byte array received by replication protocol, return ByteBuffer wrap around
+ * received byte array with use offset, so, use {@link ByteBuffer#array()} carefully
+ * @throws SQLException when some internal exception occurs during read from stream
+ */
+ ByteBuffer read() throws SQLException;
+
+ /**
+ * <p>Read next wal record from backend. It method can't be block and in contrast to {@link
+ * PGReplicationStream#read()}. If message from backend absent return null. It allow periodically
+ * check message in stream and if they absent sleep some time, but it time should be less than
+ * {@link CommonOptions#getStatusInterval()} to avoid disconnect from the server.
+ *
+ * <p>A single WAL record is never split across two XLogData messages. When a WAL record crosses a
+ * WAL page boundary, and is therefore already split using continuation records, it can be split
+ * at the page boundary. In other words, the first main WAL record and its continuation records
+ * can be sent in different XLogData messages.
+ *
+ * @return byte array received by replication protocol or null if pending message from server
+ * absent. Returns ByteBuffer wrap around received byte array with use offset, so, use {@link
+ * ByteBuffer#array()} carefully.
+ * @throws SQLException when some internal exception occurs during read from stream
+ */
+ ByteBuffer readPending() throws SQLException;
+
+ /**
+ * Parameter updates by execute {@link PGReplicationStream#read()} method.
+ *
+ * @return not null LSN position that was receive last time via {@link PGReplicationStream#read()}
+ * method
+ */
+ LogSequenceNumber getLastReceiveLSN();
+
+ /**
+ * Last flushed lsn send in update message to backend. Parameter updates only via {@link
+ * PGReplicationStream#setFlushedLSN(LogSequenceNumber)}
+ *
+ * @return not null location of the last WAL flushed to disk in the standby.
+ */
+ LogSequenceNumber getLastFlushedLSN();
+
+ /**
+ * Last applied lsn send in update message to backed. Parameter updates only via {@link
+ * PGReplicationStream#setAppliedLSN(LogSequenceNumber)}
+ *
+ * @return not null location of the last WAL applied in the standby.
+ */
+ LogSequenceNumber getLastAppliedLSN();
+
+ /**
+ * Set flushed LSN. It parameter will be send to backend on next update status iteration. Flushed
+ * LSN position help backend define which wal can be recycle.
+ *
+ * @param flushed not null location of the last WAL flushed to disk in the standby.
+ * @see PGReplicationStream#forceUpdateStatus()
+ */
+ void setFlushedLSN(LogSequenceNumber flushed);
+
+ /**
+ * Parameter used only physical replication and define which lsn already was apply on standby.
+ * Feedback will send to backend on next update status iteration.
+ *
+ * @param applied not null location of the last WAL applied in the standby.
+ * @see PGReplicationStream#forceUpdateStatus()
+ */
+ void setAppliedLSN(LogSequenceNumber applied);
+
+ /**
+ * Force send to backend status about last received, flushed and applied LSN. You can not use it
+ * method explicit, because {@link PGReplicationStream} send status to backend periodical by
+ * configured interval via {@link LogicalReplicationOptions#getStatusInterval}
+ *
+ * @see LogicalReplicationOptions#getStatusInterval()
+ * @throws SQLException when some internal exception occurs during read from stream
+ */
+ void forceUpdateStatus() throws SQLException;
+
+ /**
+ * @return {@code true} if replication stream was already close, otherwise return {@code false}
+ */
+ boolean isClosed();
+
+ /**
+ * <p>Stop replication changes from server and free resources. After that connection can be reuse
+ * to another queries. Also after close current stream they cannot be used anymore.
+ *
+ * <p><b>Note:</b> This method can spend much time for logical replication stream on postgresql
+ * version 9.6 and lower, because postgresql have bug - during decode big transaction to logical
+ * form and during wait new changes postgresql ignore messages from client. As workaround you can
+ * close replication connection instead of close replication stream. For more information about it
+ * problem see mailing list thread <a href="http://www.postgresql.org/message-id/CAFgjRd3hdYOa33m69TbeOfNNer2BZbwa8FFjt2V5VFzTBvUU3w@mail.gmail.com">
+ * Stopping logical replication protocol</a>
+ *
+ * @throws SQLException when some internal exception occurs during end streaming
+ */
+ void close() throws SQLException;
+}
diff --git a/pgjdbc/src/main/java/org/postgresql/replication/ReplicationType.java b/pgjdbc/src/main/java/org/postgresql/replication/ReplicationType.java
new file mode 100644
index 0000000..ab93bfd
--- /dev/null
+++ b/pgjdbc/src/main/java/org/postgresql/replication/ReplicationType.java
@@ -0,0 +1,11 @@
+/*
+ * Copyright (c) 2017, PostgreSQL Global Development Group
+ * See the LICENSE file in the project root for more information.
+ */
+
+package org.postgresql.replication;
+
+public enum ReplicationType {
+ LOGICAL,
+ PHYSICAL
+}
diff --git a/pgjdbc/src/main/java/org/postgresql/replication/fluent/AbstractCreateSlotBuilder.java b/pgjdbc/src/main/java/org/postgresql/replication/fluent/AbstractCreateSlotBuilder.java
new file mode 100644
index 0000000..54f946b
--- /dev/null
+++ b/pgjdbc/src/main/java/org/postgresql/replication/fluent/AbstractCreateSlotBuilder.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright (c) 2016, PostgreSQL Global Development Group
+ * See the LICENSE file in the project root for more information.
+ */
+
+package org.postgresql.replication.fluent;
+
+public abstract class AbstractCreateSlotBuilder<T extends ChainedCommonCreateSlotBuilder<T>>
+ implements ChainedCommonCreateSlotBuilder<T> {
+
+ protected String slotName;
+
+ protected abstract T self();
+
+ @Override
+ public T withSlotName(String slotName) {
+ this.slotName = slotName;
+ return self();
+ }
+}
diff --git a/pgjdbc/src/main/java/org/postgresql/replication/fluent/AbstractStreamBuilder.java b/pgjdbc/src/main/java/org/postgresql/replication/fluent/AbstractStreamBuilder.java
new file mode 100644
index 0000000..b93b00f
--- /dev/null
+++ b/pgjdbc/src/main/java/org/postgresql/replication/fluent/AbstractStreamBuilder.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2016, PostgreSQL Global Development Group
+ * See the LICENSE file in the project root for more information.
+ */
+
+package org.postgresql.replication.fluent;
+
+import org.postgresql.replication.LogSequenceNumber;
+
+import java.util.concurrent.TimeUnit;
+
+public abstract class AbstractStreamBuilder<T extends ChainedCommonStreamBuilder<T>>
+ implements ChainedCommonStreamBuilder<T> {
+ private static final int DEFAULT_STATUS_INTERVAL = (int) TimeUnit.SECONDS.toMillis(10L);
+ protected int statusIntervalMs = DEFAULT_STATUS_INTERVAL;
+ protected LogSequenceNumber startPosition = LogSequenceNumber.INVALID_LSN;
+ protected String slotName;
+
+ protected abstract T self();
+
+ @Override
+ public T withStatusInterval(int time, TimeUnit format) {
+ statusIntervalMs = (int) TimeUnit.MILLISECONDS.convert(time, format);
+ return self();
+ }
+
+ @Override
+ public T withStartPosition(LogSequenceNumber lsn) {
+ this.startPosition = lsn;
+ return self();
+ }
+
+ @Override
+ public T withSlotName(String slotName) {
+ this.slotName = slotName;
+ return self();
+ }
+}
diff --git a/pgjdbc/src/main/java/org/postgresql/replication/fluent/ChainedCommonCreateSlotBuilder.java b/pgjdbc/src/main/java/org/postgresql/replication/fluent/ChainedCommonCreateSlotBuilder.java
new file mode 100644
index 0000000..d171d7d
--- /dev/null
+++ b/pgjdbc/src/main/java/org/postgresql/replication/fluent/ChainedCommonCreateSlotBuilder.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 2016, PostgreSQL Global Development Group
+ * See the LICENSE file in the project root for more information.
+ */
+
+package org.postgresql.replication.fluent;
+
+import java.sql.SQLException;
+
+/**
+ * Fluent interface for specify common parameters for create Logical and Physical replication slot.
+ */
+public interface ChainedCommonCreateSlotBuilder<T extends ChainedCommonCreateSlotBuilder<T>> {
+
+ /**
+ * Replication slots provide an automated way to ensure that the master does not remove WAL
+ * segments until they have been received by all standbys, and that the master does not remove
+ * rows which could cause a recovery conflict even when the standby is disconnected.
+ *
+ * @param slotName not null unique replication slot name for create.
+ * @return T a slot builder
+ */
+ T withSlotName(String slotName);
+
+ /**
+ * Create slot with specified parameters in database
+ * @throws SQLException on error
+ */
+ void make() throws SQLException;
+}
diff --git a/pgjdbc/src/main/java/org/postgresql/replication/fluent/ChainedCommonStreamBuilder.java b/pgjdbc/src/main/java/org/postgresql/replication/fluent/ChainedCommonStreamBuilder.java
new file mode 100644
index 0000000..0d6d8b7
--- /dev/null
+++ b/pgjdbc/src/main/java/org/postgresql/replication/fluent/ChainedCommonStreamBuilder.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2016, PostgreSQL Global Development Group
+ * See the LICENSE file in the project root for more information.
+ */
+
+package org.postgresql.replication.fluent;
+
+import org.postgresql.replication.LogSequenceNumber;
+
+import java.util.concurrent.TimeUnit;
+
+/***
+ * Fluent interface for specify common parameters for Logical and Physical replication.
+ */
+public interface ChainedCommonStreamBuilder<T extends ChainedCommonStreamBuilder<T>> {
+
+ /**
+ * Replication slots provide an automated way to ensure that the master does not remove WAL
+ * segments until they have been received by all standbys, and that the master does not remove
+ * rows which could cause a recovery conflict even when the standby is disconnected.
+ *
+ * @param slotName not null replication slot already exists on server.
+ */
+ T withSlotName(String slotName);
+
+ /***
+ * Specifies the number of time between status packets sent back to the server. This allows for
+ * easier monitoring of the progress from server. A value of zero disables the periodic status
+ * updates completely, although an update will still be sent when requested by the server, to
+ * avoid timeout disconnect. The default value is 10 seconds.
+ *
+ * @param time positive time
+ * @param format format for specified time
+ * @return not null fluent
+ */
+ T withStatusInterval(int time, TimeUnit format);
+
+ /**
+ * Specify start position from wich backend will start stream changes. If parameter will not
+ * specify, streaming starts from restart_lsn. For more details see pg_replication_slots
+ * description.
+ *
+ * @param lsn not null position from which need start replicate changes
+ * @return not null fluent
+ */
+ T withStartPosition(LogSequenceNumber lsn);
+}
diff --git a/pgjdbc/src/main/java/org/postgresql/replication/fluent/ChainedCreateReplicationSlotBuilder.java b/pgjdbc/src/main/java/org/postgresql/replication/fluent/ChainedCreateReplicationSlotBuilder.java
new file mode 100644
index 0000000..73ed4a9
--- /dev/null
+++ b/pgjdbc/src/main/java/org/postgresql/replication/fluent/ChainedCreateReplicationSlotBuilder.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright (c) 2016, PostgreSQL Global Development Group
+ * See the LICENSE file in the project root for more information.
+ */
+
+package org.postgresql.replication.fluent;
+
+import org.postgresql.replication.fluent.logical.ChainedLogicalCreateSlotBuilder;
+import org.postgresql.replication.fluent.physical.ChainedPhysicalCreateSlotBuilder;
+
+/***
+ * Fluent interface for specify common parameters for Logical and Physical replication.
+ */
+public interface ChainedCreateReplicationSlotBuilder {
+ /**
+ * Example usage:
+ * <pre>
+ * {@code
+ *
+ * pgConnection
+ * .getReplicationAPI()
+ * .createReplicationSlot()
+ * .logical()
+ * .withSlotName("mySlot")
+ * .withOutputPlugin("test_decoding")
+ * .make();
+ *
+ * PGReplicationStream stream =
+ * pgConnection
+ * .getReplicationAPI()
+ * .replicationStream()
+ * .logical()
+ * .withSlotName("mySlot")
+ * .withSlotOption("include-xids", false)
+ * .withSlotOption("skip-empty-xacts", true)
+ * .start();
+ *
+ * while (true) {
+ * ByteBuffer buffer = stream.read();
+ * //process logical changes
+ * }
+ *
+ * }
+ * </pre>
+ * @return not null fluent api
+ */
+ ChainedLogicalCreateSlotBuilder logical();
+
+ /**
+ * Create physical replication stream for process wal logs in binary form.
+ *
+ * Example usage:
+ * <pre>
+ * {@code
+ *
+ * pgConnection
+ * .getReplicationAPI()
+ * .createReplicationSlot()
+ * .physical()
+ * .withSlotName("mySlot")
+ * .make();
+ *
+ * PGReplicationStream stream =
+ * pgConnection
+ * .getReplicationAPI()
+ * .replicationStream()
+ * .physical()
+ * .withSlotName("mySlot")
+ * .start();
+ *
+ * while (true) {
+ * ByteBuffer buffer = stream.read();
+ * //process binary WAL logs
+ * }
+ *
+ * }
+ * </pre>
+ * @return not null fluent api
+ */
+ ChainedPhysicalCreateSlotBuilder physical();
+}
diff --git a/pgjdbc/src/main/java/org/postgresql/replication/fluent/ChainedStreamBuilder.java b/pgjdbc/src/main/java/org/postgresql/replication/fluent/ChainedStreamBuilder.java
new file mode 100644
index 0000000..d8a9cc1
--- /dev/null
+++ b/pgjdbc/src/main/java/org/postgresql/replication/fluent/ChainedStreamBuilder.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright (c) 2016, PostgreSQL Global Development Group
+ * See the LICENSE file in the project root for more information.
+ */
+
+package org.postgresql.replication.fluent;
+
+import org.postgresql.replication.fluent.logical.ChainedLogicalStreamBuilder;
+import org.postgresql.replication.fluent.physical.ChainedPhysicalStreamBuilder;
+
+/**
+ * Start point for fluent API that build replication stream(logical or physical).
+ * Api not thread safe, and can be use only for crate single stream.
+ */
+public interface ChainedStreamBuilder {
+ /**
+ * Create logical replication stream that decode raw wal logs by output plugin to logical form.
+ * Default about logical decoding you can see by following link
+ * <a href="http://www.postgresql.org/docs/current/static/logicaldecoding-explanation.html">
+ * Logical Decoding Concepts
+ * </a>.
+ *
+ * Example usage:
+ * <pre>
+ * {@code
+ *
+ * PGReplicationStream stream =
+ * pgConnection
+ * .getReplicationAPI()
+ * .replicationStream()
+ * .logical()
+ * .withSlotName("test_decoding")
+ * .withSlotOption("include-xids", false)
+ * .withSlotOption("skip-empty-xacts", true)
+ * .start();
+ *
+ * while (true) {
+ * ByteBuffer buffer = stream.read();
+ * //process logical changes
+ * }
+ *
+ * }
+ * </pre>
+ * @return not null fluent api
+ */
+ ChainedLogicalStreamBuilder logical();
+
+ /**
+ * Create physical replication stream for process wal logs in binary form.
+ *
+ * Example usage:
+ * <pre>
+ * {@code
+ *
+ * LogSequenceNumber lsn = getCurrentLSN();
+ *
+ * PGReplicationStream stream =
+ * pgConnection
+ * .getReplicationAPI()
+ * .replicationStream()
+ * .physical()
+ * .withStartPosition(lsn)
+ * .start();
+ *
+ * while (true) {
+ * ByteBuffer buffer = stream.read();
+ * //process binary WAL logs
+ * }
+ *
+ * }
+ * </pre>
+ * @return not null fluent api
+ */
+ ChainedPhysicalStreamBuilder physical();
+}
diff --git a/pgjdbc/src/main/java/org/postgresql/replication/fluent/CommonOptions.java b/pgjdbc/src/main/java/org/postgresql/replication/fluent/CommonOptions.java
new file mode 100644
index 0000000..f0b3fe7
--- /dev/null
+++ b/pgjdbc/src/main/java/org/postgresql/replication/fluent/CommonOptions.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2016, PostgreSQL Global Development Group
+ * See the LICENSE file in the project root for more information.
+ */
+
+package org.postgresql.replication.fluent;
+
+import org.postgresql.replication.LogSequenceNumber;
+
+/**
+ * Common parameters for logical and physical replication
+ */
+public interface CommonOptions {
+ /**
+ * Replication slots provide an automated way to ensure that the master does not remove WAL
+ * segments until they have been received by all standbys, and that the master does not remove
+ * rows which could cause a recovery conflict even when the standby is disconnected.
+ *
+ * @return nullable replication slot name that already exists on server and free.
+ */
+ String getSlotName();
+
+ /**
+ * @return the position to start replication. This cannot be null.
+ */
+ LogSequenceNumber getStartLSNPosition();
+
+ /**
+ * Specifies the number of millisecond between status packets sent back to the server. This allows
+ * for easier monitoring of the progress from server. A value of zero disables the periodic status
+ * updates completely, although an update will still be sent when requested by the server, to
+ * avoid timeout disconnect. The default value is 10 seconds.
+ *
+ * @return the current status interval
+ */
+ int getStatusInterval();
+}
diff --git a/pgjdbc/src/main/java/org/postgresql/replication/fluent/ReplicationCreateSlotBuilder.java b/pgjdbc/src/main/java/org/postgresql/replication/fluent/ReplicationCreateSlotBuilder.java
new file mode 100644
index 0000000..e0067a3
--- /dev/null
+++ b/pgjdbc/src/main/java/org/postgresql/replication/fluent/ReplicationCreateSlotBuilder.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 2016, PostgreSQL Global Development Group
+ * See the LICENSE file in the project root for more information.
+ */
+
+package org.postgresql.replication.fluent;
+
+import org.postgresql.core.BaseConnection;
+import org.postgresql.replication.fluent.logical.ChainedLogicalCreateSlotBuilder;
+import org.postgresql.replication.fluent.logical.LogicalCreateSlotBuilder;
+import org.postgresql.replication.fluent.physical.ChainedPhysicalCreateSlotBuilder;
+import org.postgresql.replication.fluent.physical.PhysicalCreateSlotBuilder;
+
+public class ReplicationCreateSlotBuilder implements ChainedCreateReplicationSlotBuilder {
+ private final BaseConnection baseConnection;
+
+ public ReplicationCreateSlotBuilder(BaseConnection baseConnection) {
+ this.baseConnection = baseConnection;
+ }
+
+ @Override
+ public ChainedLogicalCreateSlotBuilder logical() {
+ return new LogicalCreateSlotBuilder(baseConnection);
+ }
+
+ @Override
+ public ChainedPhysicalCreateSlotBuilder physical() {
+ return new PhysicalCreateSlotBuilder(baseConnection);
+ }
+}
diff --git a/pgjdbc/src/main/java/org/postgresql/replication/fluent/ReplicationStreamBuilder.java b/pgjdbc/src/main/java/org/postgresql/replication/fluent/ReplicationStreamBuilder.java
new file mode 100644
index 0000000..4d8443a
--- /dev/null
+++ b/pgjdbc/src/main/java/org/postgresql/replication/fluent/ReplicationStreamBuilder.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright (c) 2016, PostgreSQL Global Development Group
+ * See the LICENSE file in the project root for more information.
+ */
+
+package org.postgresql.replication.fluent;
+
+import org.postgresql.core.BaseConnection;
+import org.postgresql.core.ReplicationProtocol;
+import org.postgresql.replication.PGReplicationStream;
+import org.postgresql.replication.fluent.logical.ChainedLogicalStreamBuilder;
+import org.postgresql.replication.fluent.logical.LogicalReplicationOptions;
+import org.postgresql.replication.fluent.logical.LogicalStreamBuilder;
+import org.postgresql.replication.fluent.logical.StartLogicalReplicationCallback;
+import org.postgresql.replication.fluent.physical.ChainedPhysicalStreamBuilder;
+import org.postgresql.replication.fluent.physical.PhysicalReplicationOptions;
+import org.postgresql.replication.fluent.physical.PhysicalStreamBuilder;
+import org.postgresql.replication.fluent.physical.StartPhysicalReplicationCallback;
+
+import java.sql.SQLException;
+
+public class ReplicationStreamBuilder implements ChainedStreamBuilder {
+ private final BaseConnection baseConnection;
+
+ /**
+ * @param connection not null connection with that will be associate replication
+ */
+ public ReplicationStreamBuilder(final BaseConnection connection) {
+ this.baseConnection = connection;
+ }
+
+ @Override
+ public ChainedLogicalStreamBuilder logical() {
+ return new LogicalStreamBuilder(new StartLogicalReplicationCallback() {
+ @Override
+ public PGReplicationStream start(LogicalReplicationOptions options) throws SQLException {
+ ReplicationProtocol protocol = baseConnection.getReplicationProtocol();
+ return protocol.startLogical(options);
+ }
+ });
+ }
+
+ @Override
+ public ChainedPhysicalStreamBuilder physical() {
+ return new PhysicalStreamBuilder(new StartPhysicalReplicationCallback() {
+ @Override
+ public PGReplicationStream start(PhysicalReplicationOptions options) throws SQLException {
+ ReplicationProtocol protocol = baseConnection.getReplicationProtocol();
+ return protocol.startPhysical(options);
+ }
+ });
+ }
+}
diff --git a/pgjdbc/src/main/java/org/postgresql/replication/fluent/logical/ChainedLogicalCreateSlotBuilder.java b/pgjdbc/src/main/java/org/postgresql/replication/fluent/logical/ChainedLogicalCreateSlotBuilder.java
new file mode 100644
index 0000000..48d2891
--- /dev/null
+++ b/pgjdbc/src/main/java/org/postgresql/replication/fluent/logical/ChainedLogicalCreateSlotBuilder.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 2016, PostgreSQL Global Development Group
+ * See the LICENSE file in the project root for more information.
+ */
+
+package org.postgresql.replication.fluent.logical;
+
+import org.postgresql.replication.fluent.ChainedCommonCreateSlotBuilder;
+
+/**
+ * Logical replication slot specific parameters
+ */
+public interface ChainedLogicalCreateSlotBuilder
+ extends ChainedCommonCreateSlotBuilder<ChainedLogicalCreateSlotBuilder> {
+
+ /**
+ * <p>Output plugin that should be use for decode physical represent WAL to some logical form.
+ * Output plugin should be installed on server(exists in shared_preload_libraries).
+ *
+ * <p>Package postgresql-contrib provides sample output plugin <b>test_decoding</b> that can be
+ * use for test logical replication api
+ *
+ * @param outputPlugin not null name of the output plugin used for logical decoding
+ * @return the logical slot builder
+ */
+ ChainedLogicalCreateSlotBuilder withOutputPlugin(String outputPlugin);
+}
diff --git a/pgjdbc/src/main/java/org/postgresql/replication/fluent/logical/ChainedLogicalStreamBuilder.java b/pgjdbc/src/main/java/org/postgresql/replication/fluent/logical/ChainedLogicalStreamBuilder.java
new file mode 100644
index 0000000..635115a
--- /dev/null
+++ b/pgjdbc/src/main/java/org/postgresql/replication/fluent/logical/ChainedLogicalStreamBuilder.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright (c) 2016, PostgreSQL Global Development Group
+ * See the LICENSE file in the project root for more information.
+ */
+
+package org.postgresql.replication.fluent.logical;
+
+import org.postgresql.replication.PGReplicationStream;
+import org.postgresql.replication.fluent.ChainedCommonStreamBuilder;
+
+import java.sql.SQLException;
+import java.util.Properties;
+
+public interface ChainedLogicalStreamBuilder
+ extends ChainedCommonStreamBuilder<ChainedLogicalStreamBuilder> {
+ /**
+ * Open logical replication stream
+ *
+ * @return not null PGReplicationStream available for fetch data in logical form
+ * @throws SQLException if there are errors
+ */
+ PGReplicationStream start() throws SQLException;
+
+ /**
+ *
+ * @param optionName name of option
+ * @param optionValue boolean value
+ * @return ChainedLogicalStreamBuilder
+ */
+
+ ChainedLogicalStreamBuilder withSlotOption(String optionName, boolean optionValue);
+
+ /**
+ *
+ * @param optionName name of option
+ * @param optionValue integer value
+ * @return ChainedLogicalStreamBuilder
+ */
+ ChainedLogicalStreamBuilder withSlotOption(String optionName, int optionValue);
+
+ /**
+ *
+ * @param optionName name of option
+ * @param optionValue String value
+ * @return ChainedLogicalStreamBuilder
+ */
+ ChainedLogicalStreamBuilder withSlotOption(String optionName, String optionValue);
+
+ /**
+ *
+ * @param options properties
+ * @return ChainedLogicalStreamBuilder
+ */
+ ChainedLogicalStreamBuilder withSlotOptions(Properties options);
+
+}
diff --git a/pgjdbc/src/main/java/org/postgresql/replication/fluent/logical/LogicalCreateSlotBuilder.java b/pgjdbc/src/main/java/org/postgresql/replication/fluent/logical/LogicalCreateSlotBuilder.java
new file mode 100644
index 0000000..0369976
--- /dev/null
+++ b/pgjdbc/src/main/java/org/postgresql/replication/fluent/logical/LogicalCreateSlotBuilder.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright (c) 2016, PostgreSQL Global Development Group
+ * See the LICENSE file in the project root for more information.
+ */
+
+package org.postgresql.replication.fluent.logical;
+
+import org.postgresql.core.BaseConnection;
+import org.postgresql.replication.fluent.AbstractCreateSlotBuilder;
+
+import java.sql.SQLException;
+import java.sql.Statement;
+
+public class LogicalCreateSlotBuilder
+ extends AbstractCreateSlotBuilder<ChainedLogicalCreateSlotBuilder>
+ implements ChainedLogicalCreateSlotBuilder {
+ private String outputPlugin;
+ private BaseConnection connection;
+
+ public LogicalCreateSlotBuilder(BaseConnection connection) {
+ this.connection = connection;
+ }
+
+ @Override
+ protected ChainedLogicalCreateSlotBuilder self() {
+ return this;
+ }
+
+ @Override
+ public ChainedLogicalCreateSlotBuilder withOutputPlugin(String outputPlugin) {
+ this.outputPlugin = outputPlugin;
+ return self();
+ }
+
+ @Override
+ public void make() throws SQLException {
+ if (outputPlugin == null || outputPlugin.isEmpty()) {
+ throw new IllegalArgumentException(
+ "OutputPlugin required parameter for logical replication slot");
+ }
+
+ if (slotName == null || slotName.isEmpty()) {
+ throw new IllegalArgumentException("Replication slotName can't be null");
+ }
+
+ Statement statement = connection.createStatement();
+ try {
+ statement.execute(String.format("CREATE_REPLICATION_SLOT %s LOGICAL %s", slotName, outputPlugin));
+ } finally {
+ statement.close();
+ }
+ }
+}
diff --git a/pgjdbc/src/main/java/org/postgresql/replication/fluent/logical/LogicalReplicationOptions.java b/pgjdbc/src/main/java/org/postgresql/replication/fluent/logical/LogicalReplicationOptions.java
new file mode 100644
index 0000000..f386161
--- /dev/null
+++ b/pgjdbc/src/main/java/org/postgresql/replication/fluent/logical/LogicalReplicationOptions.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 2016, PostgreSQL Global Development Group
+ * See the LICENSE file in the project root for more information.
+ */
+
+package org.postgresql.replication.fluent.logical;
+
+import org.postgresql.replication.fluent.CommonOptions;
+
+import java.util.Properties;
+
+public interface LogicalReplicationOptions extends CommonOptions {
+ /**
+ * Required parameter for logical replication
+ *
+ * @return not null logical replication slot name that already exists on server and free.
+ */
+ String getSlotName();
+
+ /**
+ * Parameters for output plugin. Parameters will be set to output plugin that register for
+ * specified replication slot name.
+ *
+ * @return list options that will be pass to output_plugin for that was create replication slot
+ */
+ Properties getSlotOptions();
+}
diff --git a/pgjdbc/src/main/java/org/postgresql/replication/fluent/logical/LogicalStreamBuilder.java b/pgjdbc/src/main/java/org/postgresql/replication/fluent/logical/LogicalStreamBuilder.java
new file mode 100644
index 0000000..ac9c1f8
--- /dev/null
+++ b/pgjdbc/src/main/java/org/postgresql/replication/fluent/logical/LogicalStreamBuilder.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright (c) 2016, PostgreSQL Global Development Group
+ * See the LICENSE file in the project root for more information.
+ */
+
+package org.postgresql.replication.fluent.logical;
+
+import org.postgresql.replication.LogSequenceNumber;
+import org.postgresql.replication.PGReplicationStream;
+import org.postgresql.replication.fluent.AbstractStreamBuilder;
+
+import java.sql.SQLException;
+import java.util.Properties;
+
+public class LogicalStreamBuilder extends AbstractStreamBuilder<ChainedLogicalStreamBuilder>
+ implements ChainedLogicalStreamBuilder, LogicalReplicationOptions {
+ private final Properties slotOptions;
+
+ private StartLogicalReplicationCallback startCallback;
+
+ /**
+ * @param startCallback not null callback that should be execute after build parameters for start
+ * replication
+ */
+ public LogicalStreamBuilder(StartLogicalReplicationCallback startCallback) {
+ this.startCallback = startCallback;
+ this.slotOptions = new Properties();
+ }
+
+ @Override
+ protected ChainedLogicalStreamBuilder self() {
+ return this;
+ }
+
+ @Override
+ public PGReplicationStream start() throws SQLException {
+ return startCallback.start(this);
+ }
+
+ @Override
+ public String getSlotName() {
+ return slotName;
+ }
+
+
+ @Override
+ public ChainedLogicalStreamBuilder withStartPosition(LogSequenceNumber lsn) {
+ startPosition = lsn;
+ return this;
+ }
+
+ @Override
+ public ChainedLogicalStreamBuilder withSlotOption(String optionName, boolean optionValue) {
+ slotOptions.setProperty(optionName, String.valueOf(optionValue));
+ return this;
+ }
+
+ @Override
+ public ChainedLogicalStreamBuilder withSlotOption(String optionName, int optionValue) {
+ slotOptions.setProperty(optionName, String.valueOf(optionValue));
+ return this;
+ }
+
+ @Override
+ public ChainedLogicalStreamBuilder withSlotOption(String optionName, String optionValue) {
+ slotOptions.setProperty(optionName, optionValue);
+ return this;
+ }
+
+ @Override
+ public ChainedLogicalStreamBuilder withSlotOptions(Properties options) {
+ for (String propertyName : options.stringPropertyNames()) {
+ slotOptions.setProperty(propertyName, options.getProperty(propertyName));
+ }
+ return this;
+ }
+
+ @Override
+ public LogSequenceNumber getStartLSNPosition() {
+ return startPosition;
+ }
+
+ @Override
+ public Properties getSlotOptions() {
+ return slotOptions;
+ }
+
+ @Override
+ public int getStatusInterval() {
+ return statusIntervalMs;
+ }
+}
diff --git a/pgjdbc/src/main/java/org/postgresql/replication/fluent/logical/StartLogicalReplicationCallback.java b/pgjdbc/src/main/java/org/postgresql/replication/fluent/logical/StartLogicalReplicationCallback.java
new file mode 100644
index 0000000..8612eca
--- /dev/null
+++ b/pgjdbc/src/main/java/org/postgresql/replication/fluent/logical/StartLogicalReplicationCallback.java
@@ -0,0 +1,14 @@
+/*
+ * Copyright (c) 2016, PostgreSQL Global Development Group
+ * See the LICENSE file in the project root for more information.
+ */
+
+package org.postgresql.replication.fluent.logical;
+
+import org.postgresql.replication.PGReplicationStream;
+
+import java.sql.SQLException;
+
+public interface StartLogicalReplicationCallback {
+ PGReplicationStream start(LogicalReplicationOptions options) throws SQLException;
+}
diff --git a/pgjdbc/src/main/java/org/postgresql/replication/fluent/physical/ChainedPhysicalCreateSlotBuilder.java b/pgjdbc/src/main/java/org/postgresql/replication/fluent/physical/ChainedPhysicalCreateSlotBuilder.java
new file mode 100644
index 0000000..ec9b6dd
--- /dev/null
+++ b/pgjdbc/src/main/java/org/postgresql/replication/fluent/physical/ChainedPhysicalCreateSlotBuilder.java
@@ -0,0 +1,15 @@
+/*
+ * Copyright (c) 2016, PostgreSQL Global Development Group
+ * See the LICENSE file in the project root for more information.
+ */
+
+package org.postgresql.replication.fluent.physical;
+
+import org.postgresql.replication.fluent.ChainedCommonCreateSlotBuilder;
+
+/**
+ * Physical replication slot specific parameters
+ */
+public interface ChainedPhysicalCreateSlotBuilder extends
+ ChainedCommonCreateSlotBuilder<ChainedPhysicalCreateSlotBuilder> {
+}
diff --git a/pgjdbc/src/main/java/org/postgresql/replication/fluent/physical/ChainedPhysicalStreamBuilder.java b/pgjdbc/src/main/java/org/postgresql/replication/fluent/physical/ChainedPhysicalStreamBuilder.java
new file mode 100644
index 0000000..dc55a42
--- /dev/null
+++ b/pgjdbc/src/main/java/org/postgresql/replication/fluent/physical/ChainedPhysicalStreamBuilder.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (c) 2016, PostgreSQL Global Development Group
+ * See the LICENSE file in the project root for more information.
+ */
+
+package org.postgresql.replication.fluent.physical;
+
+import org.postgresql.replication.PGReplicationStream;
+import org.postgresql.replication.fluent.ChainedCommonStreamBuilder;
+
+import java.sql.SQLException;
+
+public interface ChainedPhysicalStreamBuilder extends
+ ChainedCommonStreamBuilder<ChainedPhysicalStreamBuilder> {
+
+ /**
+ * Open physical replication stream
+ *
+ * @return not null PGReplicationStream available for fetch wal logs in binary form
+ * @throws SQLException on error
+ */
+ PGReplicationStream start() throws SQLException;
+}
diff --git a/pgjdbc/src/main/java/org/postgresql/replication/fluent/physical/PhysicalCreateSlotBuilder.java b/pgjdbc/src/main/java/org/postgresql/replication/fluent/physical/PhysicalCreateSlotBuilder.java
new file mode 100644
index 0000000..9d99fa4
--- /dev/null
+++ b/pgjdbc/src/main/java/org/postgresql/replication/fluent/physical/PhysicalCreateSlotBuilder.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) 2016, PostgreSQL Global Development Group
+ * See the LICENSE file in the project root for more information.
+ */
+
+package org.postgresql.replication.fluent.physical;
+
+import org.postgresql.core.BaseConnection;
+import org.postgresql.replication.fluent.AbstractCreateSlotBuilder;
+
+import java.sql.SQLException;
+import java.sql.Statement;
+
+public class PhysicalCreateSlotBuilder
+ extends AbstractCreateSlotBuilder<ChainedPhysicalCreateSlotBuilder>
+ implements ChainedPhysicalCreateSlotBuilder {
+ private BaseConnection connection;
+
+ public PhysicalCreateSlotBuilder(BaseConnection connection) {
+ this.connection = connection;
+ }
+
+ @Override
+ protected ChainedPhysicalCreateSlotBuilder self() {
+ return this;
+ }
+
+ @Override
+ public void make() throws SQLException {
+ if (slotName == null || slotName.isEmpty()) {
+ throw new IllegalArgumentException("Replication slotName can't be null");
+ }
+
+ Statement statement = connection.createStatement();
+ try {
+ statement.execute(String.format("CREATE_REPLICATION_SLOT %s PHYSICAL", slotName));
+ } finally {
+ statement.close();
+ }
+ }
+}
diff --git a/pgjdbc/src/main/java/org/postgresql/replication/fluent/physical/PhysicalReplicationOptions.java b/pgjdbc/src/main/java/org/postgresql/replication/fluent/physical/PhysicalReplicationOptions.java
new file mode 100644
index 0000000..58326d9
--- /dev/null
+++ b/pgjdbc/src/main/java/org/postgresql/replication/fluent/physical/PhysicalReplicationOptions.java
@@ -0,0 +1,11 @@
+/*
+ * Copyright (c) 2016, PostgreSQL Global Development Group
+ * See the LICENSE file in the project root for more information.
+ */
+
+package org.postgresql.replication.fluent.physical;
+
+import org.postgresql.replication.fluent.CommonOptions;
+
+public interface PhysicalReplicationOptions extends CommonOptions {
+}
diff --git a/pgjdbc/src/main/java/org/postgresql/replication/fluent/physical/PhysicalStreamBuilder.java b/pgjdbc/src/main/java/org/postgresql/replication/fluent/physical/PhysicalStreamBuilder.java
new file mode 100644
index 0000000..eb177d0
--- /dev/null
+++ b/pgjdbc/src/main/java/org/postgresql/replication/fluent/physical/PhysicalStreamBuilder.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 2016, PostgreSQL Global Development Group
+ * See the LICENSE file in the project root for more information.
+ */
+
+package org.postgresql.replication.fluent.physical;
+
+import org.postgresql.replication.LogSequenceNumber;
+import org.postgresql.replication.PGReplicationStream;
+import org.postgresql.replication.fluent.AbstractStreamBuilder;
+
+import java.sql.SQLException;
+
+public class PhysicalStreamBuilder extends AbstractStreamBuilder<ChainedPhysicalStreamBuilder>
+ implements ChainedPhysicalStreamBuilder, PhysicalReplicationOptions {
+
+ private final StartPhysicalReplicationCallback startCallback;
+
+ /**
+ * @param startCallback not null callback that should be execute after build parameters for start
+ * replication
+ */
+ public PhysicalStreamBuilder(StartPhysicalReplicationCallback startCallback) {
+ this.startCallback = startCallback;
+ }
+
+ @Override
+ protected ChainedPhysicalStreamBuilder self() {
+ return this;
+ }
+
+ @Override
+ public PGReplicationStream start() throws SQLException {
+ return this.startCallback.start(this);
+ }
+
+ @Override
+ public String getSlotName() {
+ return slotName;
+ }
+
+ @Override
+ public LogSequenceNumber getStartLSNPosition() {
+ return startPosition;
+ }
+
+ @Override
+ public int getStatusInterval() {
+ return statusIntervalMs;
+ }
+}
diff --git a/pgjdbc/src/main/java/org/postgresql/replication/fluent/physical/StartPhysicalReplicationCallback.java b/pgjdbc/src/main/java/org/postgresql/replication/fluent/physical/StartPhysicalReplicationCallback.java
new file mode 100644
index 0000000..543edcb
--- /dev/null
+++ b/pgjdbc/src/main/java/org/postgresql/replication/fluent/physical/StartPhysicalReplicationCallback.java
@@ -0,0 +1,14 @@
+/*
+ * Copyright (c) 2016, PostgreSQL Global Development Group
+ * See the LICENSE file in the project root for more information.
+ */
+
+package org.postgresql.replication.fluent.physical;
+
+import org.postgresql.replication.PGReplicationStream;
+
+import java.sql.SQLException;
+
+public interface StartPhysicalReplicationCallback {
+ PGReplicationStream start(PhysicalReplicationOptions options) throws SQLException;
+}
diff --git a/pgjdbc/src/main/java/org/postgresql/ssl/DbKeyStoreSocketFactory.java b/pgjdbc/src/main/java/org/postgresql/ssl/DbKeyStoreSocketFactory.java
index 6075219..ec5b1ed 100644
--- a/pgjdbc/src/main/java/org/postgresql/ssl/DbKeyStoreSocketFactory.java
+++ b/pgjdbc/src/main/java/org/postgresql/ssl/DbKeyStoreSocketFactory.java
@@ -12,7 +12,7 @@ import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManagerFactory;
-abstract public class DbKeyStoreSocketFactory extends org.postgresql.ssl.WrappedFactory {
+public abstract class DbKeyStoreSocketFactory extends org.postgresql.ssl.WrappedFactory {
/*
* Populate the WrappedFactory member _factory with an SSL Socket Factory that uses the JKS
* keystore provided by getKeyStorePassword() and getKeyStoreStream(). A subclass only needs to
@@ -52,9 +52,9 @@ abstract public class DbKeyStoreSocketFactory extends org.postgresql.ssl.Wrapped
}
}
- abstract public char[] getKeyStorePassword();
+ public abstract char[] getKeyStorePassword();
- abstract public InputStream getKeyStoreStream();
+ public abstract InputStream getKeyStoreStream();
public static class DbKeyStoreSocketException extends Exception {
public DbKeyStoreSocketException(String message) {
diff --git a/pgjdbc/src/main/java/org/postgresql/ssl/MakeSSL.java b/pgjdbc/src/main/java/org/postgresql/ssl/MakeSSL.java
index f27e615..d2e4535 100644
--- a/pgjdbc/src/main/java/org/postgresql/ssl/MakeSSL.java
+++ b/pgjdbc/src/main/java/org/postgresql/ssl/MakeSSL.java
@@ -6,7 +6,6 @@
package org.postgresql.ssl;
import org.postgresql.PGProperty;
-import org.postgresql.core.Logger;
import org.postgresql.core.PGStream;
import org.postgresql.ssl.jdbc4.LibPQFactory;
import org.postgresql.util.GT;
@@ -16,6 +15,8 @@ import org.postgresql.util.PSQLState;
import java.io.IOException;
import java.util.Properties;
+import java.util.logging.Level;
+import java.util.logging.Logger;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLSocket;
@@ -23,9 +24,11 @@ import javax.net.ssl.SSLSocketFactory;
public class MakeSSL extends ObjectFactory {
- public static void convert(PGStream stream, Properties info, Logger logger)
+ private static final Logger LOGGER = Logger.getLogger(MakeSSL.class.getName());
+
+ public static void convert(PGStream stream, Properties info)
throws PSQLException, IOException {
- logger.debug("converting regular socket connection to ssl");
+ LOGGER.log(Level.FINE, "converting regular socket connection to ssl");
SSLSocketFactory factory;
@@ -34,7 +37,7 @@ public class MakeSSL extends ObjectFactory {
// unless sslmode is set
String classname = PGProperty.SSL_FACTORY.get(info);
if (classname == null) {
- // If sslmode is set, use the libp compatible factory
+ // If sslmode is set, use the libpq compatible factory
if (sslmode != null) {
factory = new LibPQFactory(info);
} else {
diff --git a/pgjdbc/src/main/java/org/postgresql/ssl/jdbc4/LibPQFactory.java b/pgjdbc/src/main/java/org/postgresql/ssl/jdbc4/LibPQFactory.java
index 4bf3e68..32c40d4 100644
--- a/pgjdbc/src/main/java/org/postgresql/ssl/jdbc4/LibPQFactory.java
+++ b/pgjdbc/src/main/java/org/postgresql/ssl/jdbc4/LibPQFactory.java
@@ -24,7 +24,10 @@ import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.Certificate;
import java.security.cert.CertificateFactory;
+import java.security.cert.CertificateParsingException;
import java.security.cert.X509Certificate;
+import java.util.Collection;
+import java.util.List;
import java.util.Properties;
import javax.naming.InvalidNameException;
@@ -48,6 +51,8 @@ import javax.security.auth.x500.X500Principal;
*/
public class LibPQFactory extends WrappedFactory implements HostnameVerifier {
+ private static final int ALT_DNS_NAME = 2;
+
LazyKeyManager km = null;
String sslmode;
@@ -192,7 +197,7 @@ public class LibPQFactory extends WrappedFactory implements HostnameVerifier {
private char[] password = null;
- public ConsoleCallbackHandler(String password) {
+ ConsoleCallbackHandler(String password) {
if (password != null) {
this.password = password.toCharArray();
}
@@ -205,6 +210,7 @@ public class LibPQFactory extends WrappedFactory implements HostnameVerifier {
* @throws UnsupportedCallbackException If the console is not available or other than
* PasswordCallback is supplied
*/
+ @Override
public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {
Console cons = System.console();
if (cons == null && password == null) {
@@ -228,6 +234,39 @@ public class LibPQFactory extends WrappedFactory implements HostnameVerifier {
}
}
+ public static boolean verifyHostName(String hostname, String pattern) {
+ if (hostname == null || pattern == null) {
+ return false;
+ }
+ if (!pattern.startsWith("*")) {
+ // No wildcard => just compare hostnames
+ return hostname.equalsIgnoreCase(pattern);
+ }
+ // pattern starts with *, so hostname should be at least (pattern.length-1) long
+ if (hostname.length() < pattern.length() - 1) {
+ return false;
+ }
+ // Compare ignore case
+ final boolean ignoreCase = true;
+ // Below code is "hostname.endsWithIgnoreCase(pattern.withoutFirstStar())"
+
+ // E.g. hostname==sub.host.com; pattern==*.host.com
+ // We need to start the offset of ".host.com" in hostname
+ // For this we take hostname.length() - pattern.length()
+ // and +1 is required since pattern is known to start with *
+ int toffset = hostname.length() - pattern.length() + 1;
+
+ // Wildcard covers just one domain level
+ // a.b.c.com should not be covered by *.c.com
+ if (hostname.lastIndexOf('.', toffset - 1) >= 0) {
+ // If there's a dot in between 0..toffset
+ return false;
+ }
+
+ return hostname.regionMatches(ignoreCase, toffset,
+ pattern, 1, pattern.length() - 1);
+ }
+
/**
* Verifies the server certificate according to the libpq rules. The cn attribute of the
* certificate is matched against the hostname. If the cn attribute starts with an asterisk (*),
@@ -251,6 +290,26 @@ public class LibPQFactory extends WrappedFactory implements HostnameVerifier {
}
// Extract the common name
X509Certificate serverCert = peerCerts[0];
+
+ try {
+ // Check for Subject Alternative Names (see RFC 6125)
+ Collection<List<?>> subjectAltNames = serverCert.getSubjectAlternativeNames();
+
+ if (subjectAltNames != null) {
+ for (List<?> sanit : subjectAltNames) {
+ Integer type = (Integer) sanit.get(0);
+ String san = (String) sanit.get(1);
+
+ // this mimics libpq check for ALT_DNS_NAME
+ if (type != null && type == ALT_DNS_NAME && verifyHostName(hostname, san)) {
+ return true;
+ }
+ }
+ }
+ } catch (CertificateParsingException e) {
+ return false;
+ }
+
LdapName DN;
try {
DN = new LdapName(serverCert.getSubjectX500Principal().getName(X500Principal.RFC2253));
@@ -265,17 +324,6 @@ public class LibPQFactory extends WrappedFactory implements HostnameVerifier {
break;
}
}
- if (CN == null) {
- return false;
- } else if (CN.startsWith("*")) { // We have a wildcard
- if (hostname.endsWith(CN.substring(1))) {
- // Avoid IndexOutOfBoundsException because hostname already ends with CN
- return !(hostname.substring(0, hostname.length() - CN.length() + 1).contains("."));
- } else {
- return false;
- }
- } else {
- return CN.equals(hostname);
- }
+ return verifyHostName(hostname, CN);
}
}
diff --git a/pgjdbc/src/main/java/org/postgresql/sspi/NTDSAPI.java b/pgjdbc/src/main/java/org/postgresql/sspi/NTDSAPI.java
index 1b51632..e83f8c9 100644
--- a/pgjdbc/src/main/java/org/postgresql/sspi/NTDSAPI.java
+++ b/pgjdbc/src/main/java/org/postgresql/sspi/NTDSAPI.java
@@ -36,7 +36,7 @@ interface NTDSAPI extends StdCallLibrary {
* terminator (out)
* @param spn SPN buffer (in/out)
* @return Error code ERROR_SUCCESS, ERROR_BUFFER_OVERFLOW or ERROR_INVALID_PARAMETER
- * @see http://msdn.microsoft.com/en-us/library/ms676007(v=vs.85).aspx
+ * @see "http://msdn.microsoft.com/en-us/library/ms676007(v=vs.85).aspx"
*/
int DsMakeSpnW(WString serviceClass, /* in */
WString serviceName, /* in */
diff --git a/pgjdbc/src/main/java/org/postgresql/sspi/SSPIClient.java b/pgjdbc/src/main/java/org/postgresql/sspi/SSPIClient.java
index 6fa64ec..a41c954 100644
--- a/pgjdbc/src/main/java/org/postgresql/sspi/SSPIClient.java
+++ b/pgjdbc/src/main/java/org/postgresql/sspi/SSPIClient.java
@@ -6,7 +6,6 @@
package org.postgresql.sspi;
-import org.postgresql.core.Logger;
import org.postgresql.core.PGStream;
import org.postgresql.util.HostSpec;
import org.postgresql.util.PSQLException;
@@ -23,6 +22,8 @@ import waffle.windows.auth.impl.WindowsSecurityContextImpl;
import java.io.IOException;
import java.sql.SQLException;
+import java.util.logging.Level;
+import java.util.logging.Logger;
/**
* Use Waffle-JNI to support SSPI authentication when PgJDBC is running on a Windows client and
@@ -36,7 +37,7 @@ public class SSPIClient implements ISSPIClient {
public static String SSPI_DEFAULT_SPN_SERVICE_CLASS = "POSTGRES";
- private final Logger logger;
+ private static final Logger LOGGER = Logger.getLogger(SSPIClient.class.getName());
private final PGStream pgStream;
private final String spnServiceClass;
private final boolean enableNegotiate;
@@ -57,11 +58,8 @@ public class SSPIClient implements ISSPIClient {
* @param pgStream PostgreSQL connection stream
* @param spnServiceClass SSPI SPN service class, defaults to POSTGRES if null
* @param enableNegotiate enable negotiate
- * @param logger logger
*/
- public SSPIClient(PGStream pgStream, String spnServiceClass, boolean enableNegotiate,
- Logger logger) {
- this.logger = logger;
+ public SSPIClient(PGStream pgStream, String spnServiceClass, boolean enableNegotiate) {
this.pgStream = pgStream;
/* If blank or unspecified, SPN service class should be POSTGRES */
@@ -90,21 +88,17 @@ public class SSPIClient implements ISSPIClient {
* won't have JNA and this will throw a NoClassDefFoundError.
*/
if (!Platform.isWindows()) {
- logger.debug("SSPI not supported: non-Windows host");
+ LOGGER.log(Level.WARNING, "SSPI not supported: non-Windows host");
return false;
}
/* Waffle must be on the CLASSPATH */
Class.forName("waffle.windows.auth.impl.WindowsSecurityContextImpl");
return true;
} catch (NoClassDefFoundError ex) {
- if (logger.logDebug()) {
- logger.debug("SSPI unavailable (no Waffle/JNA libraries?)", ex);
- }
+ LOGGER.log(Level.WARNING, "SSPI unavailable (no Waffle/JNA libraries?)", ex);
return false;
} catch (ClassNotFoundException ex) {
- if (logger.logDebug()) {
- logger.debug("SSPI unavailable (no Waffle/JNA libraries?)", ex);
- }
+ LOGGER.log(Level.WARNING, "SSPI unavailable (no Waffle/JNA libraries?)", ex);
return false;
}
}
@@ -136,9 +130,7 @@ public class SSPIClient implements ISSPIClient {
*/
final String securityPackage = enableNegotiate ? "negotiate" : "kerberos";
- if (logger.logDebug()) {
- logger.debug("Beginning SSPI/Kerberos negotiation with SSPI package: " + securityPackage);
- }
+ LOGGER.log(Level.FINEST, "Beginning SSPI/Kerberos negotiation with SSPI package: {0}", securityPackage);
try {
/*
@@ -160,9 +152,7 @@ public class SSPIClient implements ISSPIClient {
try {
targetName = makeSPN();
- if (logger.logDebug()) {
- logger.debug("SSPI target name: " + targetName);
- }
+ LOGGER.log(Level.FINEST, "SSPI target name: {0}", targetName);
sspiContext = new WindowsSecurityContextImpl();
sspiContext.setPrincipalName(targetName);
@@ -175,7 +165,7 @@ public class SSPIClient implements ISSPIClient {
}
sendSSPIResponse(sspiContext.getToken());
- logger.debug("Sent first SSPI negotiation message");
+ LOGGER.log(Level.FINEST, "Sent first SSPI negotiation message");
} catch (NoClassDefFoundError ex) {
throw new PSQLException(
"SSPI cannot be used, Waffle or its dependencies are missing from the classpath",
@@ -197,7 +187,7 @@ public class SSPIClient implements ISSPIClient {
throw new IllegalStateException("Cannot continue SSPI authentication that we didn't begin");
}
- logger.debug("Continuing SSPI negotiation");
+ LOGGER.log(Level.FINEST, "Continuing SSPI negotiation");
/* Read the response token from the server */
byte[] receivedToken = pgStream.receive(msgLength);
@@ -214,9 +204,9 @@ public class SSPIClient implements ISSPIClient {
byte[] responseToken = sspiContext.getToken();
if (responseToken.length > 0) {
sendSSPIResponse(responseToken);
- logger.debug("Sent SSPI negotiation continuation message");
+ LOGGER.log(Level.FINEST, "Sent SSPI negotiation continuation message");
} else {
- logger.debug("SSPI authentication complete, no reply required");
+ LOGGER.log(Level.FINEST, "SSPI authentication complete, no reply required");
}
}
diff --git a/pgjdbc/src/main/java/org/postgresql/translation/bg.po b/pgjdbc/src/main/java/org/postgresql/translation/bg.po
index 3509731..862096b 100755
--- a/pgjdbc/src/main/java/org/postgresql/translation/bg.po
+++ b/pgjdbc/src/main/java/org/postgresql/translation/bg.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: JDBC Driver for PostgreSQL 8.x\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-01-07 13:37+0300\n"
+"POT-Creation-Date: 2018-03-10 23:24+0300\n"
"PO-Revision-Date: 2009-12-28 00:01+0100\n"
"Last-Translator: <usun0v at mail.bg>\n"
"Language-Team: <bg at li.org>\n"
@@ -17,420 +17,411 @@ msgstr ""
"X-Poedit-Language: Bulgarian\n"
"X-Poedit-Country: BULGARIA\n"
-#: org/postgresql/copy/CopyManager.java:57
-#, java-format
-msgid "Requested CopyIn but got {0}"
-msgstr "Зададено CopyIn но получено {0}"
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:164
+msgid "The sslfactoryarg property may not be empty."
+msgstr ""
-#: org/postgresql/copy/CopyManager.java:69
-#, java-format
-msgid "Requested CopyOut but got {0}"
-msgstr "Зададено CopyOut но получено {0}"
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:180
+msgid ""
+"The environment variable containing the server's SSL certificate must not be "
+"empty."
+msgstr ""
-#: org/postgresql/copy/PGCopyInputStream.java:54
-#, java-format
-msgid "Copying from database failed: {0}"
-msgstr "Копирането от базата данни бе неуспешно: {0}"
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:188
+msgid ""
+"The system property containing the server's SSL certificate must not be "
+"empty."
+msgstr ""
-#: org/postgresql/copy/PGCopyInputStream.java:70
-#: org/postgresql/copy/PGCopyOutputStream.java:97
-msgid "This copy stream is closed."
-msgstr "Потока за копиране на данните е затворен."
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:195
+msgid ""
+"The sslfactoryarg property must start with the prefix file:, classpath:, "
+"env:, sys:, or -----BEGIN CERTIFICATE-----."
+msgstr ""
-#: org/postgresql/copy/PGCopyInputStream.java:113
-msgid "Read from copy failed."
-msgstr "Четене от копието неуспешно."
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:207
+#, fuzzy
+msgid "An error occurred reading the certificate"
+msgstr "Възникна грешка при осъществяване на SSL връзката."
-#: org/postgresql/copy/PGCopyOutputStream.java:74
-#, java-format
-msgid "Cannot write to copy a byte of value {0}"
-msgstr "Няма пишещи права, за да копира байтова стойност {0}"
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:240
+msgid "No X509TrustManager found"
+msgstr ""
-#: org/postgresql/core/ConnectionFactory.java:74
-#, java-format
-msgid "A connection could not be made using the requested protocol {0}."
-msgstr "Не може да осъществи връзка, ползвайки искания протокол {0}."
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:133
+msgid ""
+"Could not find a java cryptographic algorithm: X.509 CertificateFactory not "
+"available."
+msgstr ""
-#: org/postgresql/core/Oid.java:114
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:143
#, java-format
-msgid "oid type {0} not known and not a number"
+msgid "Could not open SSL certificate file {0}."
msgstr ""
-#: org/postgresql/core/Parser.java:616
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:148
#, java-format
-msgid "Malformed function or procedure escape syntax at offset {0}."
-msgstr "Непозволен синтаксис на функция или процедура при офсет {0}."
+msgid "Loading the SSL certificate {0} into a KeyManager failed."
+msgstr ""
-#: org/postgresql/core/PGStream.java:497
-#, java-format
-msgid "Premature end of input stream, expected {0} bytes, but only read {1}."
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:205
+msgid "Enter SSL password: "
msgstr ""
-"Преждевременен край на входящ поток на данни, очаквани {0} байта, но "
-"прочетени само {1}."
-#: org/postgresql/core/PGStream.java:538
-#, java-format
-msgid "Expected an EOF from server, got: {0}"
-msgstr "Очакван край на файла от сървъра, но получено: {0}"
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:212
+msgid "Could not read password for SSL key file, console is not available."
+msgstr ""
-#: org/postgresql/core/SetupQueryRunner.java:90
-msgid "An unexpected result was returned by a query."
-msgstr "Заявката върна неочакван резултат."
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:217
+#, java-format
+msgid "Could not read password for SSL key file by callbackhandler {0}."
+msgstr ""
-#: org/postgresql/core/UTF8Encoding.java:31
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:236
#, java-format
-msgid ""
-"Illegal UTF-8 sequence: byte {0} of {1} byte sequence is not 10xxxxxx: {2}"
+msgid "Could not decrypt SSL key file {0}."
msgstr ""
-"Невалидна UTF-8 последователност: байта {0} от байтова последователност {1} "
-"не е 10xxxxxx: {2}"
-#: org/postgresql/core/UTF8Encoding.java:69
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:250
#, java-format
-msgid "Illegal UTF-8 sequence: {0} bytes used to encode a {1} byte value: {2}"
+msgid "Could not read SSL key file {0}."
msgstr ""
-"Невалидна UTF-8 последователност: {0} байта използвани за кодирането на {1} "
-"байтова стойност: {2}"
-#: org/postgresql/core/UTF8Encoding.java:104
-#: org/postgresql/core/UTF8Encoding.java:131
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:253
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:176
#, java-format
-msgid "Illegal UTF-8 sequence: initial byte is {0}: {1}"
-msgstr "Невалидна UTF-8 последователност: първоначален байт е {0}: {1}"
+msgid "Could not find a java cryptographic algorithm: {0}."
+msgstr ""
+
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:99
+#, fuzzy, java-format
+msgid "The password callback class provided {0} could not be instantiated."
+msgstr "Класът SSLSocketFactory връща {0} и не може да бъде инстанцииран."
-#: org/postgresql/core/UTF8Encoding.java:137
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:132
#, java-format
-msgid "Illegal UTF-8 sequence: final value is out of range: {0}"
+msgid "Could not open SSL root certificate file {0}."
msgstr ""
-"Невалидна UTF-8 последователност: крайната стойност е извън стойностните "
-"граници: {0}"
-#: org/postgresql/core/UTF8Encoding.java:153
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:147
#, java-format
-msgid "Illegal UTF-8 sequence: final value is a surrogate value: {0}"
+msgid "Could not read SSL root certificate file {0}."
msgstr ""
-"Невалидна UTF-8 последователност: крайната стойност е заместителна стойност: "
-"{0}"
-#: org/postgresql/core/Utils.java:119 org/postgresql/core/Utils.java:136
-msgid "Zero bytes may not occur in string parameters."
-msgstr "Не може да има нула байта в низ параметрите."
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:151
+#, java-format
+msgid "Loading the SSL root certificate {0} into a TrustManager failed."
+msgstr ""
-#: org/postgresql/core/Utils.java:146 org/postgresql/core/Utils.java:217
-msgid "No IOException expected from StringBuffer or StringBuilder"
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:170
+msgid "Could not initialize SSL context."
msgstr ""
-#: org/postgresql/core/Utils.java:206
-msgid "Zero bytes may not occur in identifiers."
-msgstr "Не може да има нула байта в идентификаторите."
+#: org/postgresql/ssl/MakeSSL.java:52
+#, java-format
+msgid "The SSLSocketFactory class provided {0} could not be instantiated."
+msgstr "Класът SSLSocketFactory връща {0} и не може да бъде инстанцииран."
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:72
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:87
-#, fuzzy, java-format
-msgid "Invalid sslmode value: {0}"
-msgstr "Невалидна дължина {0} на потока данни."
+#: org/postgresql/ssl/MakeSSL.java:67
+#, java-format
+msgid "SSL error: {0}"
+msgstr ""
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:87
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:111
+#: org/postgresql/ssl/MakeSSL.java:78
#, fuzzy, java-format
-msgid "Invalid targetServerType value: {0}"
-msgstr "Невалидна дължина {0} на потока данни."
+msgid "The HostnameVerifier class provided {0} could not be instantiated."
+msgstr "Класът SSLSocketFactory връща {0} и не може да бъде инстанцииран."
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:152
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:228
+#: org/postgresql/ssl/MakeSSL.java:84
#, java-format
-msgid "Could not find a server with specified targetServerType: {0}"
+msgid "The hostname {0} could not be verified by hostnameverifier {1}."
msgstr ""
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:172
-msgid ""
-"Connection refused. Check that the hostname and port are correct and that "
-"the postmaster is accepting TCP/IP connections."
+#: org/postgresql/ssl/MakeSSL.java:93
+#, java-format
+msgid "The hostname {0} could not be verified."
msgstr ""
-"Връзката отказана. Проверете дали името на хоста и порта са верни и дали "
-"postmaster приема ТСР / IP връзки."
-
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:181
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:262
-msgid "The connection attempt failed."
-msgstr "Опита за връзка бе неуспешен."
-
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:192
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:273
-#, fuzzy
-msgid "The connection url is invalid."
-msgstr "Опита за връзка бе неуспешен."
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:218
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:233
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:324
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:339
-msgid "The server does not support SSL."
-msgstr "Сървърът не поддържа SSL."
+#: org/postgresql/gss/GssAction.java:126
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2550
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2581
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2585
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2640
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2650
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2659
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:655
+msgid "Protocol error. Session setup failed."
+msgstr "Грешка в протокола. Неуспешна настройка на сесията."
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:249
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:355
-msgid "An error occurred while setting up the SSL connection."
-msgstr "Възникна грешка при осъществяване на SSL връзката."
+#: org/postgresql/gss/GssAction.java:137 org/postgresql/gss/MakeGSS.java:66
+#: org/postgresql/gss/MakeGSS.java:74
+msgid "GSS Authentication failed"
+msgstr "GSS удостоверяването бе неуспешно"
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:300
+#: org/postgresql/core/Parser.java:933
#, java-format
-msgid "Connection rejected: {0}."
-msgstr "Връзката отказана: {0}."
+msgid "Malformed function or procedure escape syntax at offset {0}."
+msgstr "Непозволен синтаксис на функция или процедура при офсет {0}."
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:321
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:349
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:375
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:456
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:486
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:515
-msgid ""
-"The server requested password-based authentication, but no password was "
-"provided."
-msgstr "Сървърът изисква идентифициране с парола, но парола не бе въведена."
+#: org/postgresql/core/SocketFactoryFactory.java:41
+#, fuzzy, java-format
+msgid "The SocketFactory class provided {0} could not be instantiated."
+msgstr "Класът SSLSocketFactory връща {0} и не може да бъде инстанцииран."
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:405
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:625
-#, java-format
-msgid ""
-"The authentication type {0} is not supported. Check that you have configured "
-"the pg_hba.conf file to include the client''s IP address or subnet, and that "
-"it is using an authentication scheme supported by the driver."
+#: org/postgresql/core/Utils.java:93 org/postgresql/core/Utils.java:110
+msgid "Zero bytes may not occur in string parameters."
+msgstr "Не може да има нула байта в низ параметрите."
+
+#: org/postgresql/core/Utils.java:120 org/postgresql/core/Utils.java:170
+msgid "No IOException expected from StringBuffer or StringBuilder"
msgstr ""
-"Тип на удостоверяване {0} не се поддържа. Проверете дали сте конфигурирали "
-"pg_hba.conf файла, да включва IP адреса на клиента или подмрежата, и че се "
-"използва схема за удостоверяване, поддържана от драйвъра."
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:412
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:455
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:632
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:688
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:744
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:754
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:763
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:774
-#: org/postgresql/gss/GssAction.java:130
-msgid "Protocol error. Session setup failed."
-msgstr "Грешка в протокола. Неуспешна настройка на сесията."
+#: org/postgresql/core/Utils.java:159
+msgid "Zero bytes may not occur in identifiers."
+msgstr "Не може да има нула байта в идентификаторите."
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:443
-#, java-format
-msgid "Backend start-up failed: {0}."
-msgstr "Неуспешен опит за стартиране на backend: {0}."
-
-#: org/postgresql/core/v2/FastpathParameterList.java:63
-#: org/postgresql/core/v2/FastpathParameterList.java:89
-#: org/postgresql/core/v2/FastpathParameterList.java:100
-#: org/postgresql/core/v2/FastpathParameterList.java:111
-#: org/postgresql/core/v2/SimpleParameterList.java:70
-#: org/postgresql/core/v2/SimpleParameterList.java:94
-#: org/postgresql/core/v2/SimpleParameterList.java:105
-#: org/postgresql/core/v2/SimpleParameterList.java:116
-#: org/postgresql/core/v2/SimpleParameterList.java:127
-#: org/postgresql/core/v3/CompositeParameterList.java:36
-#: org/postgresql/core/v3/SimpleParameterList.java:53
-#: org/postgresql/core/v3/SimpleParameterList.java:64
-#: org/postgresql/jdbc/PgResultSet.java:2715
-#: org/postgresql/jdbc/PgResultSetMetaData.java:472
+#: org/postgresql/core/UTF8Encoding.java:28
#, java-format
-msgid "The column index is out of range: {0}, number of columns: {1}."
-msgstr "Индексът на колоната е извън стойностен обхват: {0}, брой колони: {1}."
+msgid ""
+"Illegal UTF-8 sequence: byte {0} of {1} byte sequence is not 10xxxxxx: {2}"
+msgstr ""
+"Невалидна UTF-8 последователност: байта {0} от байтова последователност {1} "
+"не е 10xxxxxx: {2}"
-#: org/postgresql/core/v2/FastpathParameterList.java:164
-#: org/postgresql/core/v2/SimpleParameterList.java:191
-#: org/postgresql/core/v3/SimpleParameterList.java:225
+#: org/postgresql/core/UTF8Encoding.java:66
#, java-format
-msgid "No value specified for parameter {0}."
-msgstr "Няма стойност, определена за параметър {0}."
+msgid "Illegal UTF-8 sequence: {0} bytes used to encode a {1} byte value: {2}"
+msgstr ""
+"Невалидна UTF-8 последователност: {0} байта използвани за кодирането на {1} "
+"байтова стойност: {2}"
-#: org/postgresql/core/v2/QueryExecutorImpl.java:87
-#: org/postgresql/core/v2/QueryExecutorImpl.java:347
-#: org/postgresql/core/v3/QueryExecutorImpl.java:404
-#: org/postgresql/core/v3/QueryExecutorImpl.java:465
+#: org/postgresql/core/UTF8Encoding.java:102
+#: org/postgresql/core/UTF8Encoding.java:129
#, java-format
-msgid "Expected command status BEGIN, got {0}."
-msgstr "Очаквана команда BEGIN, получена {0}."
+msgid "Illegal UTF-8 sequence: initial byte is {0}: {1}"
+msgstr "Невалидна UTF-8 последователност: първоначален байт е {0}: {1}"
-#: org/postgresql/core/v2/QueryExecutorImpl.java:92
-#: org/postgresql/core/v3/QueryExecutorImpl.java:470
-#: org/postgresql/jdbc/PgResultSet.java:1731
+#: org/postgresql/core/UTF8Encoding.java:135
#, java-format
-msgid "Unexpected command status: {0}."
-msgstr "Неочакван статус на команда: {0}."
-
-#: org/postgresql/core/v2/QueryExecutorImpl.java:127
-#: org/postgresql/core/v2/QueryExecutorImpl.java:136
-#: org/postgresql/core/v2/QueryExecutorImpl.java:185
-#: org/postgresql/core/v2/QueryExecutorImpl.java:376
-#: org/postgresql/core/v3/QueryExecutorImpl.java:226
-#: org/postgresql/core/v3/QueryExecutorImpl.java:364
-#: org/postgresql/core/v3/QueryExecutorImpl.java:441
-#: org/postgresql/core/v3/QueryExecutorImpl.java:505
-#: org/postgresql/core/v3/QueryExecutorImpl.java:587
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2211
-#: org/postgresql/util/StreamWrapper.java:133
-#, fuzzy
-msgid "An I/O error occurred while sending to the backend."
-msgstr "Входно/изходна грешка при изпращане към backend."
+msgid "Illegal UTF-8 sequence: final value is out of range: {0}"
+msgstr ""
+"Невалидна UTF-8 последователност: крайната стойност е извън стойностните "
+"граници: {0}"
-#: org/postgresql/core/v2/QueryExecutorImpl.java:180
-#: org/postgresql/core/v2/QueryExecutorImpl.java:235
-#: org/postgresql/core/v2/QueryExecutorImpl.java:249
-#: org/postgresql/core/v3/QueryExecutorImpl.java:582
-#: org/postgresql/core/v3/QueryExecutorImpl.java:642
+#: org/postgresql/core/UTF8Encoding.java:151
#, java-format
-msgid "Unknown Response Type {0}."
-msgstr "Неизвестен тип на отговор {0}."
+msgid "Illegal UTF-8 sequence: final value is a surrogate value: {0}"
+msgstr ""
+"Невалидна UTF-8 последователност: крайната стойност е заместителна стойност: "
+"{0}"
-#: org/postgresql/core/v2/QueryExecutorImpl.java:453
-#: org/postgresql/core/v2/QueryExecutorImpl.java:503
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1962
-msgid "Ran out of memory retrieving query results."
-msgstr "Недостатъчна памет при представяна на резултатите от заявката."
+#: org/postgresql/core/SetupQueryRunner.java:64
+msgid "An unexpected result was returned by a query."
+msgstr "Заявката върна неочакван резултат."
-#: org/postgresql/core/v2/QueryExecutorImpl.java:640
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2328
+#: org/postgresql/core/PGStream.java:486
#, java-format
-msgid "Unable to interpret the update count in command completion tag: {0}."
+msgid "Premature end of input stream, expected {0} bytes, but only read {1}."
msgstr ""
-"Не може да осъществи актуализация на брояча при командно допълнение: {0}."
-
-#: org/postgresql/core/v2/QueryExecutorImpl.java:654
-msgid "Copy not implemented for protocol version 2"
-msgstr "Копирането не е възможно при версия 2 на протокола"
-
-#: org/postgresql/core/v2/SocketFactoryFactory.java:36
-#, fuzzy, java-format
-msgid "The SocketFactory class provided {0} could not be instantiated."
-msgstr "Класът SSLSocketFactory връща {0} и не може да бъде инстанцииран."
+"Преждевременен край на входящ поток на данни, очаквани {0} байта, но "
+"прочетени само {1}."
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:253
-#, fuzzy, java-format
-msgid ""
-"Connection to {0} refused. Check that the hostname and port are correct and "
-"that the postmaster is accepting TCP/IP connections."
-msgstr ""
-"Връзката отказана. Проверете дали името на хоста и порта са верни и дали "
-"postmaster приема ТСР / IP връзки."
+#: org/postgresql/core/PGStream.java:528
+#, java-format
+msgid "Expected an EOF from server, got: {0}"
+msgstr "Очакван край на файла от сървъра, но получено: {0}"
-#: org/postgresql/core/v3/CopyOperationImpl.java:57
+#: org/postgresql/core/v3/CopyOperationImpl.java:54
msgid "CommandComplete expected COPY but got: "
msgstr "Очаквано командно допълнение COPY но получено: "
-#: org/postgresql/core/v3/QueryExecutorImpl.java:83
+#: org/postgresql/core/v3/CopyInImpl.java:47
+msgid "CopyIn copy direction can't receive data"
+msgstr ""
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:161
msgid "Tried to obtain lock while already holding it"
msgstr "Опит за получаване на заключване/резервация докато вече е получено"
-#: org/postgresql/core/v3/QueryExecutorImpl.java:98
+#: org/postgresql/core/v3/QueryExecutorImpl.java:177
msgid "Tried to break lock on database connection"
msgstr ""
"Опит за премахване на заключването/резервацията при връзка към базата данни"
-#: org/postgresql/core/v3/QueryExecutorImpl.java:115
+#: org/postgresql/core/v3/QueryExecutorImpl.java:195
msgid "Interrupted while waiting to obtain lock on database connection"
msgstr ""
"Прекъсване при чакане да получи заключване/резервация при връзка към базата "
"данни"
-#: org/postgresql/core/v3/QueryExecutorImpl.java:220
+#: org/postgresql/core/v3/QueryExecutorImpl.java:327
msgid "Unable to bind parameter values for statement."
msgstr "Не може да подготви параметрите на командата."
-#: org/postgresql/core/v3/QueryExecutorImpl.java:689
+#: org/postgresql/core/v3/QueryExecutorImpl.java:333
+#: org/postgresql/core/v3/QueryExecutorImpl.java:485
+#: org/postgresql/core/v3/QueryExecutorImpl.java:559
+#: org/postgresql/core/v3/QueryExecutorImpl.java:602
+#: org/postgresql/core/v3/QueryExecutorImpl.java:729
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2372
+#: org/postgresql/util/StreamWrapper.java:130
+#, fuzzy
+msgid "An I/O error occurred while sending to the backend."
+msgstr "Входно/изходна грешка при изпращане към backend."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:534
+#: org/postgresql/core/v3/QueryExecutorImpl.java:576
+#, java-format
+msgid "Expected command status BEGIN, got {0}."
+msgstr "Очаквана команда BEGIN, получена {0}."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:581
+#: org/postgresql/jdbc/PgResultSet.java:1778
+#, java-format
+msgid "Unexpected command status: {0}."
+msgstr "Неочакван статус на команда: {0}."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:687
+#, fuzzy
+msgid "An error occurred while trying to get the socket timeout."
+msgstr "Входно/изходна грешка при изпращане към backend."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:722
+#: org/postgresql/core/v3/QueryExecutorImpl.java:798
+#, java-format
+msgid "Unknown Response Type {0}."
+msgstr "Неизвестен тип на отговор {0}."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:745
+#, fuzzy
+msgid "An error occurred while trying to reset the socket timeout."
+msgstr "Входно/изходна грешка при изпращане към backend."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:843
msgid "Database connection failed when starting copy"
msgstr "Неосъществена връзка към базата данни при започване на копирането"
-#: org/postgresql/core/v3/QueryExecutorImpl.java:724
+#: org/postgresql/core/v3/QueryExecutorImpl.java:878
msgid "Tried to cancel an inactive copy operation"
msgstr "Опит за прекъсване на неактивно копиране"
-#: org/postgresql/core/v3/QueryExecutorImpl.java:765
+#: org/postgresql/core/v3/QueryExecutorImpl.java:917
msgid "Database connection failed when canceling copy operation"
msgstr "Неосъществена връзка към базата данни при прекъсване на копирането"
-#: org/postgresql/core/v3/QueryExecutorImpl.java:781
+#: org/postgresql/core/v3/QueryExecutorImpl.java:933
msgid "Missing expected error response to copy cancel request"
msgstr "Липсва очакван отговор при грешка да прекъсне копирането"
-#: org/postgresql/core/v3/QueryExecutorImpl.java:785
+#: org/postgresql/core/v3/QueryExecutorImpl.java:937
#, java-format
msgid "Got {0} error responses to single copy cancel request"
msgstr ""
"Получени {0} отговори за грешка при единствено искане да се прекъсне "
"копирането"
-#: org/postgresql/core/v3/QueryExecutorImpl.java:800
+#: org/postgresql/core/v3/QueryExecutorImpl.java:952
msgid "Tried to end inactive copy"
msgstr "Опит за прекъсване на неактивно копиране"
-#: org/postgresql/core/v3/QueryExecutorImpl.java:815
+#: org/postgresql/core/v3/QueryExecutorImpl.java:967
msgid "Database connection failed when ending copy"
msgstr "Неосъществена връзка към базата данни при завършване на копирането"
-#: org/postgresql/core/v3/QueryExecutorImpl.java:833
-#: org/postgresql/core/v3/QueryExecutorImpl.java:855
+#: org/postgresql/core/v3/QueryExecutorImpl.java:985
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1005
msgid "Tried to write to an inactive copy operation"
msgstr "Опит за писане при неактивна операция за копиране"
-#: org/postgresql/core/v3/QueryExecutorImpl.java:848
-#: org/postgresql/core/v3/QueryExecutorImpl.java:863
+#: org/postgresql/core/v3/QueryExecutorImpl.java:998
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1013
msgid "Database connection failed when writing to copy"
msgstr "Неосъществена връзка към базата данни при опит за копиране"
-#: org/postgresql/core/v3/QueryExecutorImpl.java:877
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1028
msgid "Tried to read from inactive copy"
msgstr "Опит за четене при неактивно копиране"
-#: org/postgresql/core/v3/QueryExecutorImpl.java:884
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1035
msgid "Database connection failed when reading from copy"
msgstr "Неосъществена връзка към базата данни при четене от копие"
-#: org/postgresql/core/v3/QueryExecutorImpl.java:956
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1101
#, java-format
msgid "Received CommandComplete ''{0}'' without an active copy operation"
msgstr "Получено командно допълнение ''{0}'' без активна команда за копиране"
-#: org/postgresql/core/v3/QueryExecutorImpl.java:983
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1126
#, java-format
msgid "Got CopyInResponse from server during an active {0}"
msgstr "Получен CopyInResponse отговор от сървъра при активно {0}"
-#: org/postgresql/core/v3/QueryExecutorImpl.java:999
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1140
#, java-format
msgid "Got CopyOutResponse from server during an active {0}"
msgstr "Получен CopyOutResponse отговор от сървъра при активно {0}"
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1017
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1154
+#, fuzzy, java-format
+msgid "Got CopyBothResponse from server during an active {0}"
+msgstr "Получен CopyOutResponse отговор от сървъра при активно {0}"
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1170
msgid "Got CopyData without an active copy operation"
msgstr "Получено CopyData без наличие на активна операция за копиране"
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1021
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1174
#, java-format
msgid "Unexpected copydata from server for {0}"
msgstr "Неочаквано CopyData от сървъра за {0}"
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1061
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2037
-#, fuzzy, java-format
-msgid ""
-"The server''s client_encoding parameter was changed to {0}. The JDBC driver "
-"requires client_encoding to be UTF8 for correct operation."
-msgstr ""
-"Параметърът client_encoding при сървъра бе променен на {0}. JDBC драйвъра "
-"изисква client_encoding да бъде UNICODE за да функционира правилно."
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1234
+#, java-format
+msgid "Unexpected packet type during copy: {0}"
+msgstr "Неочакван тип пакет при копиране: {0}"
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1069
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2045
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1524
#, java-format
msgid ""
-"The server''s DateStyle parameter was changed to {0}. The JDBC driver "
-"requires DateStyle to begin with ISO for correct operation."
+"Bind message length {0} too long. This can be caused by very large or "
+"incorrect length specifications on InputStream parameters."
+msgstr ""
+"Прекалено голяма дължина {0} на съобщението. Това може да е причинено от "
+"прекалено голяма или неправилно зададена дължина на InputStream параметри."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2145
+msgid "Ran out of memory retrieving query results."
+msgstr "Недостатъчна памет при представяна на резултатите от заявката."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2313
+msgid "The driver currently does not support COPY operations."
+msgstr "За момента драйвъра не поддържа COPY команди."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2487
+#, fuzzy, java-format
+msgid "Unable to parse the count in command completion tag: {0}."
+msgstr ""
+"Не може да осъществи актуализация на брояча при командно допълнение: {0}."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2603
+#, fuzzy, java-format
+msgid ""
+"The server''s client_encoding parameter was changed to {0}. The JDBC driver "
+"requires client_encoding to be UTF8 for correct operation."
+msgstr ""
+"Параметърът client_encoding при сървъра бе променен на {0}. JDBC драйвъра "
+"изисква client_encoding да бъде UNICODE за да функционира правилно."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2611
+#, java-format
+msgid ""
+"The server''s DateStyle parameter was changed to {0}. The JDBC driver "
+"requires DateStyle to begin with ISO for correct operation."
msgstr ""
"Параметърът DateStyle при сървъра бе променен на {0}. JDBC драйвъра изисква "
"DateStyle започва с ISO за да функционира правилно."
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1083
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2059
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2624
#, java-format
msgid ""
"The server''s standard_conforming_strings parameter was reported as {0}. The "
@@ -439,66 +430,193 @@ msgstr ""
"Параметърът standard_conforming_strings при сървъра бе докладван като {0}. "
"JDBC драйвъра очаква този параметър да бъде on или off."
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1122
+#: org/postgresql/core/v3/SimpleParameterList.java:54
+#: org/postgresql/core/v3/SimpleParameterList.java:65
+#: org/postgresql/core/v3/CompositeParameterList.java:33
+#: org/postgresql/jdbc/PgResultSetMetaData.java:493
+#: org/postgresql/jdbc/PgResultSet.java:2751
#, java-format
-msgid "Unexpected packet type during copy: {0}"
-msgstr "Неочакван тип пакет при копиране: {0}"
+msgid "The column index is out of range: {0}, number of columns: {1}."
+msgstr "Индексът на колоната е извън стойностен обхват: {0}, брой колони: {1}."
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1393
+#: org/postgresql/core/v3/SimpleParameterList.java:257
#, java-format
+msgid "No value specified for parameter {0}."
+msgstr "Няма стойност, определена за параметър {0}."
+
+#: org/postgresql/core/v3/SimpleParameterList.java:431
+#, fuzzy, java-format
+msgid "Added parameters index out of range: {0}, number of columns: {1}."
+msgstr "Параметърният индекс е извън обхват: {0}, брой параметри: {1}."
+
+#: org/postgresql/core/v3/replication/V3ReplicationProtocol.java:133
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:257
+msgid "The connection attempt failed."
+msgstr "Опита за връзка бе неуспешен."
+
+#: org/postgresql/core/v3/replication/V3PGReplicationStream.java:144
+#, fuzzy, java-format
+msgid "Unexpected packet type during replication: {0}"
+msgstr "Неочакван тип пакет при копиране: {0}"
+
+#: org/postgresql/core/v3/replication/V3PGReplicationStream.java:269
+#, fuzzy
+msgid "This replication stream has been closed."
+msgstr "Връзката бе прекъсната."
+
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:109
+#, fuzzy, java-format
+msgid "Invalid sslmode value: {0}"
+msgstr "Невалидна дължина {0} на потока данни."
+
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:124
+#, fuzzy, java-format
+msgid "Invalid targetServerType value: {0}"
+msgstr "Невалидна дължина {0} на потока данни."
+
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:246
+#, fuzzy, java-format
msgid ""
-"Bind message length {0} too long. This can be caused by very large or "
-"incorrect length specifications on InputStream parameters."
+"Connection to {0} refused. Check that the hostname and port are correct and "
+"that the postmaster is accepting TCP/IP connections."
msgstr ""
-"Прекалено голяма дължина {0} на съобщението. Това може да е причинено от "
-"прекалено голяма или неправилно зададена дължина на InputStream параметри."
+"Връзката отказана. Проверете дали името на хоста и порта са верни и дали "
+"postmaster приема ТСР / IP връзки."
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2131
-msgid "The driver currently does not support COPY operations."
-msgstr "За момента драйвъра не поддържа COPY команди."
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:272
+#, java-format
+msgid "Could not find a server with specified targetServerType: {0}"
+msgstr ""
-#: org/postgresql/Driver.java:234
-msgid "Error loading default settings from driverconfig.properties"
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:366
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:379
+msgid "The server does not support SSL."
+msgstr "Сървърът не поддържа SSL."
+
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:393
+msgid "An error occurred while setting up the SSL connection."
+msgstr "Възникна грешка при осъществяване на SSL връзката."
+
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:494
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:521
+msgid ""
+"The server requested password-based authentication, but no password was "
+"provided."
+msgstr "Сървърът изисква идентифициране с парола, но парола не бе въведена."
+
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:624
+msgid ""
+"SCRAM authentication is not supported by this driver. You need JDK >= 8 and "
+"pgjdbc >= 42.2.0 (not \".jre\" vesions)"
msgstr ""
-"Грешка при зареждане на настройките по подразбиране от файла driverconfig."
-"properties"
-#: org/postgresql/Driver.java:247
-msgid "Properties for the driver contains a non-string value for the key "
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:648
+#, java-format
+msgid ""
+"The authentication type {0} is not supported. Check that you have configured "
+"the pg_hba.conf file to include the client''s IP address or subnet, and that "
+"it is using an authentication scheme supported by the driver."
+msgstr ""
+"Тип на удостоверяване {0} не се поддържа. Проверете дали сте конфигурирали "
+"pg_hba.conf файла, да включва IP адреса на клиента или подмрежата, и че се "
+"използва схема за удостоверяване, поддържана от драйвъра."
+
+#: org/postgresql/core/ConnectionFactory.java:57
+#, java-format
+msgid "A connection could not be made using the requested protocol {0}."
+msgstr "Не може да осъществи връзка, ползвайки искания протокол {0}."
+
+#: org/postgresql/core/Oid.java:116
+#, java-format
+msgid "oid type {0} not known and not a number"
msgstr ""
-#: org/postgresql/Driver.java:290
+#: org/postgresql/util/HStoreConverter.java:43
+#: org/postgresql/util/HStoreConverter.java:74
+#: org/postgresql/jdbc/PgArray.java:210
+#: org/postgresql/jdbc/PgResultSet.java:1924
msgid ""
-"Your security policy has prevented the connection from being attempted. You "
-"probably need to grant the connect java.net.SocketPermission to the database "
-"server host and port that you wish to connect to."
+"Invalid character data was found. This is most likely caused by stored data "
+"containing characters that are invalid for the character set the database "
+"was created in. The most common example of this is storing 8bit data in a "
+"SQL_ASCII database."
msgstr ""
-"Връзката не бе осъществена, поради вашите настройки за сигурност. Може би "
-"трябва да предоставите java.net.SocketPermission права на сървъра и порта с "
-"базата данни, към който искате да се свържете."
+"Бяха намерени невалидни данни. Това най-вероятно се дължи на съхранявани "
+"данни, съдържащи символи, които са невалидни за набора от знаци при "
+"създаване на базата данни. Чест пример за това е съхраняване на 8bit данни в "
+"SQL_ASCII бази данни."
+
+#: org/postgresql/util/PGmoney.java:62
+msgid "Conversion of money failed."
+msgstr "Неуспешно валутно преобразуване."
+
+#: org/postgresql/util/StreamWrapper.java:56
+#: org/postgresql/jdbc/PgPreparedStatement.java:1449
+msgid "Object is too large to send over the protocol."
+msgstr ""
+
+#: org/postgresql/util/PGInterval.java:152
+msgid "Conversion of interval failed"
+msgstr "Неуспешно преобразуване на интервал"
-#: org/postgresql/Driver.java:296 org/postgresql/Driver.java:362
+#: org/postgresql/util/ServerErrorMessage.java:45
+#, java-format
msgid ""
-"Something unusual has occurred to cause the driver to fail. Please report "
-"this exception."
+" (pgjdbc: autodetected server-encoding to be {0}, if the message is not "
+"readable, please check database logs and/or host, port, dbname, user, "
+"password, pg_hba.conf)"
msgstr ""
-"Възникна неочаквана грешка с драйвъра. Моля докадвайте това изключение. "
-#: org/postgresql/Driver.java:370
-msgid "Connection attempt timed out."
-msgstr "Времето за осъществяване на връзката изтече (таймаут)."
+#: org/postgresql/util/ServerErrorMessage.java:176
+#, java-format
+msgid "Detail: {0}"
+msgstr "Подробност: {0}"
-#: org/postgresql/Driver.java:383
-msgid "Interrupted while attempting to connect."
-msgstr "Опита за осъществяване на връзка бе своевременно прекъснат. "
+#: org/postgresql/util/ServerErrorMessage.java:181
+#, java-format
+msgid "Hint: {0}"
+msgstr "Забележка: {0}"
-#: org/postgresql/Driver.java:645
+#: org/postgresql/util/ServerErrorMessage.java:185
#, java-format
-msgid "Method {0} is not yet implemented."
-msgstr "Методът {0} все още не е функционален."
+msgid "Position: {0}"
+msgstr "Позиция: {0}"
+
+#: org/postgresql/util/ServerErrorMessage.java:189
+#, java-format
+msgid "Where: {0}"
+msgstr "Където: {0}"
+
+#: org/postgresql/util/ServerErrorMessage.java:195
+#, java-format
+msgid "Internal Query: {0}"
+msgstr "Вътрешна заявка: {0}"
+
+#: org/postgresql/util/ServerErrorMessage.java:199
+#, java-format
+msgid "Internal Position: {0}"
+msgstr "Вътрешна позиция: {0}"
+
+#: org/postgresql/util/ServerErrorMessage.java:206
+#, java-format
+msgid "Location: File: {0}, Routine: {1}, Line: {2}"
+msgstr "Местоположение: Файл: {0}, Функция: {1}, Ред: {2}"
+
+#: org/postgresql/util/ServerErrorMessage.java:211
+#, java-format
+msgid "Server SQLState: {0}"
+msgstr "SQL статус на сървъра: {0}"
+
+#: org/postgresql/ds/PGPoolingDataSource.java:269
+msgid "Failed to setup DataSource."
+msgstr ""
+
+#: org/postgresql/ds/PGPoolingDataSource.java:371
+msgid "DataSource has been closed."
+msgstr "Източникът на данни е прекъснат."
-#: org/postgresql/ds/common/BaseDataSource.java:1037
-#: org/postgresql/ds/common/BaseDataSource.java:1047
+#: org/postgresql/ds/common/BaseDataSource.java:1132
+#: org/postgresql/ds/common/BaseDataSource.java:1142
#, fuzzy, java-format
msgid "Unsupported property name: {0}"
msgstr "Неподдържана стойност за тип: {0}"
@@ -507,7 +625,7 @@ msgstr "Неподдържана стойност за тип: {0}"
msgid "This PooledConnection has already been closed."
msgstr "Тази PooledConnection връзка бе вече прекъсната."
-#: org/postgresql/ds/PGPooledConnection.java:313
+#: org/postgresql/ds/PGPooledConnection.java:314
msgid ""
"Connection has been closed automatically because a new connection was opened "
"for the same PooledConnection or the PooledConnection has been closed."
@@ -515,393 +633,532 @@ msgstr ""
"Връзката бе автоматично прекъсната, защото нова връзка за същата беше "
"осъществена или PooledConnection връзката е вече прекъсната."
-#: org/postgresql/ds/PGPooledConnection.java:314
+#: org/postgresql/ds/PGPooledConnection.java:315
msgid "Connection has been closed."
msgstr "Връзката бе прекъсната."
-#: org/postgresql/ds/PGPooledConnection.java:418
+#: org/postgresql/ds/PGPooledConnection.java:420
msgid "Statement has been closed."
msgstr "Командата е завършена."
-#: org/postgresql/ds/PGPoolingDataSource.java:269
-msgid "Failed to setup DataSource."
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:68
+msgid "No SCRAM mechanism(s) advertised by the server"
msgstr ""
-#: org/postgresql/ds/PGPoolingDataSource.java:371
-msgid "DataSource has been closed."
-msgstr "Източникът на данни е прекъснат."
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:81
+msgid "Invalid or unsupported by client SCRAM mechanisms"
+msgstr ""
-#: org/postgresql/fastpath/Fastpath.java:82
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:117
#, fuzzy, java-format
-msgid "Fastpath call {0} - No result was returned and we expected a numeric."
-msgstr "Извикване на {0} - няма резултати и а бе очаквано цяло число."
+msgid "Invalid server-first-message: {0}"
+msgstr "Невалидна дължина {0} на потока данни."
-#: org/postgresql/fastpath/Fastpath.java:165
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:147
+#, fuzzy, java-format
+msgid "Invalid server-final-message: {0}"
+msgstr "Невалидна дължина {0} на потока данни."
+
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:153
#, java-format
-msgid "Fastpath call {0} - No result was returned and we expected an integer."
-msgstr "Извикване на {0} - няма резултати и а бе очаквано цяло число."
+msgid "SCRAM authentication failed, server returned error: {0}"
+msgstr ""
-#: org/postgresql/fastpath/Fastpath.java:174
-#, fuzzy, java-format
-msgid ""
-"Fastpath call {0} - No result was returned or wrong size while expecting an "
-"integer."
-msgstr "Извикване на {0} - няма резултати и а бе очаквано цяло число."
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:160
+msgid "Invalid server SCRAM signature"
+msgstr ""
-#: org/postgresql/fastpath/Fastpath.java:191
+#: org/postgresql/osgi/PGDataSourceFactory.java:82
#, fuzzy, java-format
-msgid "Fastpath call {0} - No result was returned and we expected a long."
-msgstr "Извикване на {0} - няма резултати и а бе очаквано цяло число."
+msgid "Unsupported properties: {0}"
+msgstr "Неподдържана стойност за тип: {0}"
-#: org/postgresql/fastpath/Fastpath.java:200
-#, fuzzy, java-format
+#: org/postgresql/Driver.java:214
+msgid "Error loading default settings from driverconfig.properties"
+msgstr ""
+"Грешка при зареждане на настройките по подразбиране от файла driverconfig."
+"properties"
+
+#: org/postgresql/Driver.java:226
+msgid "Properties for the driver contains a non-string value for the key "
+msgstr ""
+
+#: org/postgresql/Driver.java:270
msgid ""
-"Fastpath call {0} - No result was returned or wrong size while expecting a "
-"long."
-msgstr "Извикване на {0} - няма резултати и а бе очаквано цяло число."
+"Your security policy has prevented the connection from being attempted. You "
+"probably need to grant the connect java.net.SocketPermission to the database "
+"server host and port that you wish to connect to."
+msgstr ""
+"Връзката не бе осъществена, поради вашите настройки за сигурност. Може би "
+"трябва да предоставите java.net.SocketPermission права на сървъра и порта с "
+"базата данни, към който искате да се свържете."
+
+#: org/postgresql/Driver.java:276 org/postgresql/Driver.java:408
+msgid ""
+"Something unusual has occurred to cause the driver to fail. Please report "
+"this exception."
+msgstr ""
+"Възникна неочаквана грешка с драйвъра. Моля докадвайте това изключение. "
-#: org/postgresql/fastpath/Fastpath.java:312
+#: org/postgresql/Driver.java:416
+msgid "Connection attempt timed out."
+msgstr "Времето за осъществяване на връзката изтече (таймаут)."
+
+#: org/postgresql/Driver.java:429
+msgid "Interrupted while attempting to connect."
+msgstr "Опита за осъществяване на връзка бе своевременно прекъснат. "
+
+#: org/postgresql/Driver.java:682
#, java-format
-msgid "The fastpath function {0} is unknown."
-msgstr "Функцията {0} е неизвестна."
+msgid "Method {0} is not yet implemented."
+msgstr "Методът {0} все още не е функционален."
-#: org/postgresql/geometric/PGbox.java:79
-#: org/postgresql/geometric/PGcircle.java:76
-#: org/postgresql/geometric/PGcircle.java:84
-#: org/postgresql/geometric/PGline.java:109
-#: org/postgresql/geometric/PGline.java:118
-#: org/postgresql/geometric/PGlseg.java:72
-#: org/postgresql/geometric/PGpoint.java:78
+#: org/postgresql/geometric/PGlseg.java:70
+#: org/postgresql/geometric/PGline.java:107
+#: org/postgresql/geometric/PGline.java:116
+#: org/postgresql/geometric/PGcircle.java:74
+#: org/postgresql/geometric/PGcircle.java:82
+#: org/postgresql/geometric/PGpoint.java:76
+#: org/postgresql/geometric/PGbox.java:77
#, java-format
msgid "Conversion to type {0} failed: {1}."
msgstr "Неуспешно преобразуване към тип {0}: {1}."
-#: org/postgresql/geometric/PGpath.java:73
+#: org/postgresql/geometric/PGpath.java:70
#, java-format
msgid "Cannot tell if path is open or closed: {0}."
msgstr "Не може да определи дали адреса е отворен или затворен: {0}."
-#: org/postgresql/gss/GssAction.java:141 org/postgresql/gss/MakeGSS.java:69
-#: org/postgresql/gss/MakeGSS.java:77
-msgid "GSS Authentication failed"
-msgstr "GSS удостоверяването бе неуспешно"
-
-#: org/postgresql/jdbc/AbstractBlobClob.java:89
+#: org/postgresql/xa/PGXAConnection.java:128
msgid ""
-"Truncation of large objects is only implemented in 8.3 and later servers."
-msgstr "Скъсяване на големи обекти LOB е осъществено само във версии след 8.3."
-
-#: org/postgresql/jdbc/AbstractBlobClob.java:94
-msgid "Cannot truncate LOB to a negative length."
+"Transaction control methods setAutoCommit(true), commit, rollback and "
+"setSavePoint not allowed while an XA transaction is active."
msgstr ""
-#: org/postgresql/jdbc/AbstractBlobClob.java:101
-#: org/postgresql/jdbc/AbstractBlobClob.java:245
+#: org/postgresql/xa/PGXAConnection.java:177
+#: org/postgresql/xa/PGXAConnection.java:253
+#: org/postgresql/xa/PGXAConnection.java:347
#, java-format
-msgid "PostgreSQL LOBs can only index to: {0}"
-msgstr "PostgreSQL индексира големи обекти LOB само до: {0}"
-
-#: org/postgresql/jdbc/AbstractBlobClob.java:241
-msgid "LOB positioning offsets start at 1."
-msgstr "Позиционалният офсет при големи обекти LOB започва от 1."
+msgid "Invalid flags {0}"
+msgstr "Невалидни флагове {0}"
-#: org/postgresql/jdbc/AbstractBlobClob.java:257
-msgid "free() was called on this LOB previously"
-msgstr "Функцията free() бе вече извикана за този голям обект LOB"
+#: org/postgresql/xa/PGXAConnection.java:181
+#: org/postgresql/xa/PGXAConnection.java:257
+#: org/postgresql/xa/PGXAConnection.java:449
+msgid "xid must not be null"
+msgstr "xid не може да бъде null"
-#: org/postgresql/jdbc/BatchResultHandler.java:41
-#: org/postgresql/jdbc/PgConnection.java:474
-#: org/postgresql/jdbc/PgPreparedStatement.java:138
-#: org/postgresql/jdbc/PgStatement.java:299
-msgid "A result was returned when none was expected."
-msgstr "Бе получен резултат, когато такъв не бе очакван."
+#: org/postgresql/xa/PGXAConnection.java:185
+msgid "Connection is busy with another transaction"
+msgstr "Връзката е заета с друга транзакция"
-#: org/postgresql/jdbc/BatchResultHandler.java:59
-msgid "Too many update results were returned."
-msgstr "Твърде много резултати бяха получени при актуализацията."
+#: org/postgresql/xa/PGXAConnection.java:194
+#: org/postgresql/xa/PGXAConnection.java:267
+msgid "suspend/resume not implemented"
+msgstr "спиране / започване не се поддържа за момента"
-#: org/postgresql/jdbc/BatchResultHandler.java:88
+#: org/postgresql/xa/PGXAConnection.java:202
+#: org/postgresql/xa/PGXAConnection.java:209
+#: org/postgresql/xa/PGXAConnection.java:213
#, java-format
msgid ""
-"Batch entry {0} {1} was aborted. Call getNextException to see the cause."
+"Invalid protocol state requested. Attempted transaction interleaving is not "
+"supported. xid={0}, currentXid={1}, state={2}, flags={3}"
msgstr ""
-"Партида {0} {1} беше прекратена. Изпълнете функция getNextException за да "
-"видите причината."
+"Транзакция в транзакция не се поддържа за момента. xid={0}, currentXid={1}, "
+"state={2}, flags={3}"
-#: org/postgresql/jdbc/EscapedFunctions.java:243
-#, java-format
-msgid "{0} function takes four and only four argument."
-msgstr "Функцията {0} може да приеме четири и само четири аргумента."
+#: org/postgresql/xa/PGXAConnection.java:224
+msgid "Error disabling autocommit"
+msgstr "Грешка при изключване на autocommit"
-#: org/postgresql/jdbc/EscapedFunctions.java:273
-#: org/postgresql/jdbc/EscapedFunctions.java:347
-#: org/postgresql/jdbc/EscapedFunctions.java:752
-#: org/postgresql/jdbc/EscapedFunctions.java:790
+#: org/postgresql/xa/PGXAConnection.java:261
#, java-format
-msgid "{0} function takes two and only two arguments."
-msgstr "Функцията {0} може да приеме два и само два аргумента."
+msgid ""
+"tried to call end without corresponding start call. state={0}, start "
+"xid={1}, currentXid={2}, preparedXid={3}"
+msgstr ""
+"опита да извика end без съответстващо извикване на start. state={0}, start "
+"xid={1}, currentXid={2}, preparedXid={3}"
-#: org/postgresql/jdbc/EscapedFunctions.java:291
-#: org/postgresql/jdbc/EscapedFunctions.java:329
-#: org/postgresql/jdbc/EscapedFunctions.java:449
-#: org/postgresql/jdbc/EscapedFunctions.java:464
-#: org/postgresql/jdbc/EscapedFunctions.java:479
-#: org/postgresql/jdbc/EscapedFunctions.java:494
-#: org/postgresql/jdbc/EscapedFunctions.java:509
-#: org/postgresql/jdbc/EscapedFunctions.java:524
-#: org/postgresql/jdbc/EscapedFunctions.java:539
-#: org/postgresql/jdbc/EscapedFunctions.java:554
-#: org/postgresql/jdbc/EscapedFunctions.java:569
-#: org/postgresql/jdbc/EscapedFunctions.java:584
-#: org/postgresql/jdbc/EscapedFunctions.java:599
-#: org/postgresql/jdbc/EscapedFunctions.java:614
-#: org/postgresql/jdbc/EscapedFunctions.java:778
-#, java-format
-msgid "{0} function takes one and only one argument."
-msgstr "Функцията {0} може да приеме само един единствен аргумент."
+#: org/postgresql/xa/PGXAConnection.java:297
+#, fuzzy, java-format
+msgid ""
+"Preparing already prepared transaction, the prepared xid {0}, prepare xid={1}"
+msgstr ""
+"Грешка при възстановяване на състоянието преди подготвена транзакция. "
+"rollback xid={0}, preparedXid={1}, currentXid={2}"
-#: org/postgresql/jdbc/EscapedFunctions.java:313
-#: org/postgresql/jdbc/EscapedFunctions.java:394
+#: org/postgresql/xa/PGXAConnection.java:300
#, java-format
-msgid "{0} function takes two or three arguments."
-msgstr "Функцията {0} може да приеме два или три аргумента."
+msgid "Current connection does not have an associated xid. prepare xid={0}"
+msgstr ""
-#: org/postgresql/jdbc/EscapedFunctions.java:419
-#: org/postgresql/jdbc/EscapedFunctions.java:434
-#: org/postgresql/jdbc/EscapedFunctions.java:737
-#: org/postgresql/jdbc/EscapedFunctions.java:767
+#: org/postgresql/xa/PGXAConnection.java:307
#, java-format
-msgid "{0} function doesn''t take any argument."
-msgstr "Функцията {0} не може да приема аргументи."
+msgid ""
+"Not implemented: Prepare must be issued using the same connection that "
+"started the transaction. currentXid={0}, prepare xid={1}"
+msgstr ""
+"Невъзможна комбинация: Prepare трябва да бъде издадено чрез използване на "
+"същата връзка, при която е започната транзакцията. currentXid={0}, prepare "
+"xid={1}"
-#: org/postgresql/jdbc/EscapedFunctions.java:630
-#: org/postgresql/jdbc/EscapedFunctions.java:683
+#: org/postgresql/xa/PGXAConnection.java:311
#, java-format
-msgid "{0} function takes three and only three arguments."
-msgstr "Функцията {0} може да приеме три и само три аргумента."
+msgid "Prepare called before end. prepare xid={0}, state={1}"
+msgstr "Prepare извикано преди края. prepare xid={0}, state={1}"
-#: org/postgresql/jdbc/EscapedFunctions.java:643
-#: org/postgresql/jdbc/EscapedFunctions.java:664
-#: org/postgresql/jdbc/EscapedFunctions.java:667
-#: org/postgresql/jdbc/EscapedFunctions.java:700
-#: org/postgresql/jdbc/EscapedFunctions.java:713
-#: org/postgresql/jdbc/EscapedFunctions.java:716
+#: org/postgresql/xa/PGXAConnection.java:331
#, java-format
-msgid "Interval {0} not yet implemented"
-msgstr "Интервалът {0} не е валиден все още."
+msgid "Error preparing transaction. prepare xid={0}"
+msgstr "Грешка при подготвяне на транзакция. prepare xid={0}"
-#: org/postgresql/jdbc/PgArray.java:166 org/postgresql/jdbc/PgArray.java:822
-#, java-format
-msgid "The array index is out of range: {0}"
-msgstr "Индексът на масив е извън обхвата: {0}"
+#: org/postgresql/xa/PGXAConnection.java:382
+msgid "Error during recover"
+msgstr "Грешка при възстановяване"
-#: org/postgresql/jdbc/PgArray.java:183 org/postgresql/jdbc/PgArray.java:839
+#: org/postgresql/xa/PGXAConnection.java:438
#, java-format
-msgid "The array index is out of range: {0}, number of elements: {1}."
-msgstr "Индексът на масив е извън обхвата: {0}, брой елементи: {1}."
+msgid ""
+"Error rolling back prepared transaction. rollback xid={0}, preparedXid={1}, "
+"currentXid={2}"
+msgstr ""
+"Грешка при възстановяване на състоянието преди подготвена транзакция. "
+"rollback xid={0}, preparedXid={1}, currentXid={2}"
-#: org/postgresql/jdbc/PgArray.java:215
-#: org/postgresql/jdbc/PgResultSet.java:1885
-#: org/postgresql/util/HStoreConverter.java:38
-#: org/postgresql/util/HStoreConverter.java:69
+#: org/postgresql/xa/PGXAConnection.java:471
+#, java-format
msgid ""
-"Invalid character data was found. This is most likely caused by stored data "
-"containing characters that are invalid for the character set the database "
-"was created in. The most common example of this is storing 8bit data in a "
-"SQL_ASCII database."
+"One-phase commit called for xid {0} but connection was prepared with xid {1}"
msgstr ""
-"Бяха намерени невалидни данни. Това най-вероятно се дължи на съхранявани "
-"данни, съдържащи символи, които са невалидни за набора от знаци при "
-"създаване на базата данни. Чест пример за това е съхраняване на 8bit данни в "
-"SQL_ASCII бази данни."
-#: org/postgresql/jdbc/PgCallableStatement.java:90
-#: org/postgresql/jdbc/PgCallableStatement.java:96
-msgid "A CallableStatement was executed with nothing returned."
-msgstr "CallableStatement функция бе обработена, но няма резултати."
+#: org/postgresql/xa/PGXAConnection.java:479
+msgid ""
+"Not implemented: one-phase commit must be issued using the same connection "
+"that was used to start it"
+msgstr ""
+"Невъзможна комбинация: едно-фазов commit трябва да бъде издаден чрез "
+"използване на същата връзка, при която е започнал"
-#: org/postgresql/jdbc/PgCallableStatement.java:107
-msgid "A CallableStatement was executed with an invalid number of parameters"
+#: org/postgresql/xa/PGXAConnection.java:483
+#, java-format
+msgid "One-phase commit with unknown xid. commit xid={0}, currentXid={1}"
msgstr ""
-"CallableStatement функция бе обработена, но с непозволен брой параметри."
-#: org/postgresql/jdbc/PgCallableStatement.java:139
+#: org/postgresql/xa/PGXAConnection.java:487
+#, java-format
+msgid "commit called before end. commit xid={0}, state={1}"
+msgstr "commit извикан преди end. commit xid={0}, state={1}"
+
+#: org/postgresql/xa/PGXAConnection.java:498
#, java-format
+msgid "Error during one-phase commit. commit xid={0}"
+msgstr "Грешка при едно-фазов commit. commit xid={0}"
+
+#: org/postgresql/xa/PGXAConnection.java:517
msgid ""
-"A CallableStatement function was executed and the out parameter {0} was of "
-"type {1} however type {2} was registered."
+"Not implemented: 2nd phase commit must be issued using an idle connection. "
+"commit xid={0}, currentXid={1}, state={2], transactionState={3}"
msgstr ""
-"CallableStatement функция бе обработена и изходния параметър {0} бе от тип "
-"{1}, обаче тип {2} бе използван."
+"Невъзможна комбинация: втората фаза на commit задължително трябва да бъде "
+"издадена при свободна връзка. commit xid={0}, currentXid={1}, state={2], "
+"transactionState={3}"
-#: org/postgresql/jdbc/PgCallableStatement.java:195
+#: org/postgresql/xa/PGXAConnection.java:550
+#, fuzzy, java-format
msgid ""
-"This statement does not declare an OUT parameter. Use '{' ?= call ... '}' "
-"to declare one."
+"Error committing prepared transaction. commit xid={0}, preparedXid={1}, "
+"currentXid={2}"
msgstr ""
-"Тази заявка не декларира изходен параметър. Ползвайте '{' ?= call ... '}' за "
-"да декларирате такъв."
+"Грешка при възстановяване на състоянието преди подготвена транзакция. commit "
+"xid={0}, preparedXid={1}, currentXid={2}"
-#: org/postgresql/jdbc/PgCallableStatement.java:239
-msgid "wasNull cannot be call before fetching a result."
-msgstr "wasNull не може да бьде изпълнен, преди наличието на резултата."
+#: org/postgresql/xa/PGXAConnection.java:567
+#, java-format
+msgid "Heuristic commit/rollback not supported. forget xid={0}"
+msgstr "Евристичен commit или rollback не се поддържа. forget xid={0}"
+
+#: org/postgresql/jdbc/PgSQLXML.java:147
+msgid "Unable to decode xml data."
+msgstr "Не може да декодира XML данните."
+
+#: org/postgresql/jdbc/PgSQLXML.java:150
+#, java-format
+msgid "Unknown XML Source class: {0}"
+msgstr "Неизвестен XML входящ клас: {0}"
+
+#: org/postgresql/jdbc/PgSQLXML.java:193
+msgid "Unable to create SAXResult for SQLXML."
+msgstr "Не може да се създаде SAXResult за SQLXML."
-#: org/postgresql/jdbc/PgCallableStatement.java:377
-#: org/postgresql/jdbc/PgCallableStatement.java:396
+#: org/postgresql/jdbc/PgSQLXML.java:208
+msgid "Unable to create StAXResult for SQLXML"
+msgstr "Не може да се създаде StAXResult за SQLXML."
+
+#: org/postgresql/jdbc/PgSQLXML.java:213
#, java-format
+msgid "Unknown XML Result class: {0}"
+msgstr "Неизвестен XML изходящ клас: {0}"
+
+#: org/postgresql/jdbc/PgSQLXML.java:225
+msgid "This SQLXML object has already been freed."
+msgstr "Този SQLXML обект вече е освободен."
+
+#: org/postgresql/jdbc/PgSQLXML.java:234
msgid ""
-"Parameter of type {0} was registered, but call to get{1} (sqltype={2}) was "
-"made."
+"This SQLXML object has not been initialized, so you cannot retrieve data "
+"from it."
msgstr ""
-"Отчетен параметър от тип {0}, но обработено като get{1} (sqltype={2}). "
+"Този SQLXML обект не е инициализиран, така че не могат да се извличат данни "
+"от него."
-#: org/postgresql/jdbc/PgCallableStatement.java:417
-msgid ""
-"A CallableStatement was declared, but no call to registerOutParameter(1, "
-"<some type>) was made."
+#: org/postgresql/jdbc/PgSQLXML.java:247
+#, java-format
+msgid "Failed to convert binary xml data to encoding: {0}."
msgstr ""
-"CallableStatement функция бе декларирана, но обработена като "
-"registerOutParameter(1, <some type>) "
+"Неуспешно преобразуване на двоични XML данни за кодиране съгласно: {0}."
-#: org/postgresql/jdbc/PgCallableStatement.java:423
-msgid "No function outputs were registered."
-msgstr "Резултати от функцията не бяха регистрирани."
+#: org/postgresql/jdbc/PgSQLXML.java:273
+msgid "Unable to convert DOMResult SQLXML data to a string."
+msgstr "Не може да преобразува DOMResult SQLXML данни в низ."
-#: org/postgresql/jdbc/PgCallableStatement.java:429
+#: org/postgresql/jdbc/PgSQLXML.java:287
msgid ""
-"Results cannot be retrieved from a CallableStatement before it is executed."
+"This SQLXML object has already been initialized, so you cannot manipulate it "
+"further."
+msgstr "Този SQLXML обект вече е инициализиран и не може да бъде променен."
+
+#: org/postgresql/jdbc/PSQLSavepoint.java:37
+#: org/postgresql/jdbc/PSQLSavepoint.java:51
+#: org/postgresql/jdbc/PSQLSavepoint.java:69
+msgid "Cannot reference a savepoint after it has been released."
+msgstr "Не може да референцира savepoint, след като е била освободена."
+
+#: org/postgresql/jdbc/PSQLSavepoint.java:42
+msgid "Cannot retrieve the id of a named savepoint."
+msgstr "Не може да определи ID на спомената savepoint."
+
+#: org/postgresql/jdbc/PSQLSavepoint.java:56
+msgid "Cannot retrieve the name of an unnamed savepoint."
+msgstr "Не може да определи името на неупомената savepoint."
+
+#: org/postgresql/jdbc/PgArray.java:157 org/postgresql/jdbc/PgArray.java:844
+#, java-format
+msgid "The array index is out of range: {0}"
+msgstr "Индексът на масив е извън обхвата: {0}"
+
+#: org/postgresql/jdbc/PgArray.java:178 org/postgresql/jdbc/PgArray.java:861
+#, java-format
+msgid "The array index is out of range: {0}, number of elements: {1}."
+msgstr "Индексът на масив е извън обхвата: {0}, брой елементи: {1}."
+
+#: org/postgresql/jdbc/PgParameterMetaData.java:83
+#, java-format
+msgid "The parameter index is out of range: {0}, number of parameters: {1}."
+msgstr "Параметърният индекс е извън обхват: {0}, брой параметри: {1}."
+
+#: org/postgresql/jdbc/BatchResultHandler.java:92
+msgid "Too many update results were returned."
+msgstr "Твърде много резултати бяха получени при актуализацията."
+
+#: org/postgresql/jdbc/BatchResultHandler.java:146
+#, fuzzy, java-format
+msgid ""
+"Batch entry {0} {1} was aborted: {2} Call getNextException to see other "
+"errors in the batch."
msgstr ""
-"Резултати от CallableStatement функция не могат да бъдат получени, преди тя "
-"да бъде обработена."
+"Партида {0} {1} беше прекратена. Изпълнете функция getNextException за да "
+"видите причината."
-#: org/postgresql/jdbc/PgConnection.java:312
+#: org/postgresql/jdbc/PgConnection.java:272
#, java-format
msgid "Unsupported value for stringtype parameter: {0}"
msgstr "Непозволена стойност за StringType параметър: {0}"
-#: org/postgresql/jdbc/PgConnection.java:457
-#: org/postgresql/jdbc/PgPreparedStatement.java:115
-#: org/postgresql/jdbc/PgStatement.java:282
-#: org/postgresql/jdbc/TypeInfoCache.java:230
-#: org/postgresql/jdbc/TypeInfoCache.java:370
-#: org/postgresql/jdbc/TypeInfoCache.java:412
+#: org/postgresql/jdbc/PgConnection.java:424
+#: org/postgresql/jdbc/PgStatement.java:225
+#: org/postgresql/jdbc/TypeInfoCache.java:226
+#: org/postgresql/jdbc/TypeInfoCache.java:371
+#: org/postgresql/jdbc/TypeInfoCache.java:411
+#: org/postgresql/jdbc/TypeInfoCache.java:484
#: org/postgresql/jdbc/TypeInfoCache.java:489
-#: org/postgresql/jdbc/TypeInfoCache.java:494
-#: org/postgresql/jdbc/TypeInfoCache.java:535
-#: org/postgresql/jdbc/TypeInfoCache.java:540
+#: org/postgresql/jdbc/TypeInfoCache.java:526
+#: org/postgresql/jdbc/TypeInfoCache.java:531
+#: org/postgresql/jdbc/PgPreparedStatement.java:119
msgid "No results were returned by the query."
msgstr "Няма намерени резултати за заявката."
-#: org/postgresql/jdbc/PgConnection.java:578
+#: org/postgresql/jdbc/PgConnection.java:441
+#: org/postgresql/jdbc/PgStatement.java:254
+msgid "A result was returned when none was expected."
+msgstr "Бе получен резултат, когато такъв не бе очакван."
+
+#: org/postgresql/jdbc/PgConnection.java:545
msgid "Custom type maps are not supported."
msgstr "Специфични типови съответствия не се поддържат."
-#: org/postgresql/jdbc/PgConnection.java:620
+#: org/postgresql/jdbc/PgConnection.java:587
#, java-format
msgid "Failed to create object for: {0}."
msgstr "Неуспешно създаване на обект за: {0}."
-#: org/postgresql/jdbc/PgConnection.java:672
+#: org/postgresql/jdbc/PgConnection.java:641
#, java-format
msgid "Unable to load the class {0} responsible for the datatype {1}"
msgstr "Невъзможно е зареждането на клас {0}, отговарящ за типа данни {1}"
-#: org/postgresql/jdbc/PgConnection.java:724
+#: org/postgresql/jdbc/PgConnection.java:693
msgid ""
"Cannot change transaction read-only property in the middle of a transaction."
msgstr ""
"Не може да променяте правата на транзакцията по време на нейното извършване."
-#: org/postgresql/jdbc/PgConnection.java:775
+#: org/postgresql/jdbc/PgConnection.java:756
msgid "Cannot commit when autoCommit is enabled."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:786
-#: org/postgresql/jdbc/PgConnection.java:1358
-#: org/postgresql/jdbc/PgConnection.java:1395
+#: org/postgresql/jdbc/PgConnection.java:767
+#: org/postgresql/jdbc/PgConnection.java:1384
+#: org/postgresql/jdbc/PgConnection.java:1428
#, fuzzy
msgid "This connection has been closed."
msgstr "Връзката бе прекъсната."
-#: org/postgresql/jdbc/PgConnection.java:796
+#: org/postgresql/jdbc/PgConnection.java:777
msgid "Cannot rollback when autoCommit is enabled."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:870
+#: org/postgresql/jdbc/PgConnection.java:827
msgid ""
"Cannot change transaction isolation level in the middle of a transaction."
msgstr ""
"Не може да променяте изолационното ниво на транзакцията по време на нейното "
"извършване."
-#: org/postgresql/jdbc/PgConnection.java:876
+#: org/postgresql/jdbc/PgConnection.java:833
#, java-format
msgid "Transaction isolation level {0} not supported."
msgstr "Изолационно ниво на транзакциите {0} не се поддържа."
-#: org/postgresql/jdbc/PgConnection.java:921
+#: org/postgresql/jdbc/PgConnection.java:878
msgid "Finalizing a Connection that was never closed:"
msgstr "Приключване на връзка, която не бе прекъсната:"
-#: org/postgresql/jdbc/PgConnection.java:1009
+#: org/postgresql/jdbc/PgConnection.java:945
msgid "Unable to translate data into the desired encoding."
msgstr "Невъзможно преобразуване на данни в желаното кодиране."
-#: org/postgresql/jdbc/PgConnection.java:1081
-#: org/postgresql/jdbc/PgResultSet.java:1782
-#: org/postgresql/jdbc/PgStatement.java:1053
+#: org/postgresql/jdbc/PgConnection.java:1008
+#: org/postgresql/jdbc/PgStatement.java:903
+#: org/postgresql/jdbc/PgResultSet.java:1817
msgid "Fetch size must be a value greater to or equal to 0."
msgstr "Размера за fetch size трябва да бъде по-голям или равен на 0."
-#: org/postgresql/jdbc/PgConnection.java:1311
+#: org/postgresql/jdbc/PgConnection.java:1289
+#: org/postgresql/jdbc/PgConnection.java:1330
#, java-format
msgid "Unable to find server array type for provided name {0}."
msgstr "Не може да се намери типа на сървърен масив за зададеното име {0}."
-#: org/postgresql/jdbc/PgConnection.java:1327
+#: org/postgresql/jdbc/PgConnection.java:1312
+#, fuzzy, java-format
+msgid "Invalid elements {0}"
+msgstr "Невалидни флагове {0}"
+
+#: org/postgresql/jdbc/PgConnection.java:1348
#, fuzzy, java-format
msgid "Invalid timeout ({0}<0)."
msgstr "Невалидна дължина {0} на потока данни."
-#: org/postgresql/jdbc/PgConnection.java:1340
+#: org/postgresql/jdbc/PgConnection.java:1372
msgid "Validating connection."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:1375
+#: org/postgresql/jdbc/PgConnection.java:1405
#, fuzzy, java-format
msgid "Failed to set ClientInfo property: {0}"
msgstr "Неуспешно създаване на обект за: {0}."
-#: org/postgresql/jdbc/PgConnection.java:1383
+#: org/postgresql/jdbc/PgConnection.java:1415
msgid "ClientInfo property not supported."
msgstr "Информацията за ClientInfo не се поддържа."
-#: org/postgresql/jdbc/PgConnection.java:1408
+#: org/postgresql/jdbc/PgConnection.java:1441
msgid "One ore more ClientInfo failed."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:1517
+#: org/postgresql/jdbc/PgConnection.java:1540
+#, fuzzy
+msgid "Network timeout must be a value greater than or equal to 0."
+msgstr ""
+"Времето за изпълнение на заявката трябва да бъде стойност по-голяма или "
+"равна на 0."
+
+#: org/postgresql/jdbc/PgConnection.java:1552
+msgid "Unable to set network timeout."
+msgstr ""
+
+#: org/postgresql/jdbc/PgConnection.java:1563
+msgid "Unable to get network timeout."
+msgstr ""
+
+#: org/postgresql/jdbc/PgConnection.java:1580
#, java-format
msgid "Unknown ResultSet holdability setting: {0}."
msgstr "Неизвестна ResultSet holdability настройка: {0}."
-#: org/postgresql/jdbc/PgConnection.java:1531
-#: org/postgresql/jdbc/PgConnection.java:1554
-#: org/postgresql/jdbc/PgConnection.java:1576
-#: org/postgresql/jdbc/PgConnection.java:1587
-msgid "Server versions prior to 8.0 do not support savepoints."
-msgstr "Сървър версии преди 8.0 не поддържат savepoints."
-
-#: org/postgresql/jdbc/PgConnection.java:1535
-#: org/postgresql/jdbc/PgConnection.java:1558
+#: org/postgresql/jdbc/PgConnection.java:1598
+#: org/postgresql/jdbc/PgConnection.java:1619
msgid "Cannot establish a savepoint in auto-commit mode."
msgstr "Не може да се установи savepoint в auto-commit модус."
-#: org/postgresql/jdbc/PgConnection.java:1635
+#: org/postgresql/jdbc/PgConnection.java:1685
msgid "Returning autogenerated keys is not supported."
msgstr "Автоматично генерирани ключове не се поддържат."
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:78
+#: org/postgresql/jdbc/PgStatement.java:235
+msgid "Multiple ResultSets were returned by the query."
+msgstr "Заявката върна няколко ResultSets."
+
+#: org/postgresql/jdbc/PgStatement.java:316
+msgid "Can''t use executeWithFlags(int) on a Statement."
+msgstr ""
+
+#: org/postgresql/jdbc/PgStatement.java:509
+msgid "Maximum number of rows must be a value grater than or equal to 0."
+msgstr ""
+"Максималният брой редове трябва да бъде стойност по-голяма или равна на 0."
+
+#: org/postgresql/jdbc/PgStatement.java:550
+msgid "Query timeout must be a value greater than or equals to 0."
+msgstr ""
+"Времето за изпълнение на заявката трябва да бъде стойност по-голяма или "
+"равна на 0."
+
+#: org/postgresql/jdbc/PgStatement.java:590
+msgid "The maximum field size must be a value greater than or equal to 0."
+msgstr ""
+"Максималният размер на полето трябва да бъде стойност по-голяма или равна на "
+"0."
+
+#: org/postgresql/jdbc/PgStatement.java:689
+msgid "This statement has been closed."
+msgstr "Командата е извършена."
+
+#: org/postgresql/jdbc/PgStatement.java:895
+#: org/postgresql/jdbc/PgResultSet.java:878
+#, java-format
+msgid "Invalid fetch direction constant: {0}."
+msgstr "Невалидна константа за fetch посоката: {0}."
+
+#: org/postgresql/jdbc/PgStatement.java:1145
+#: org/postgresql/jdbc/PgStatement.java:1173
+msgid "Returning autogenerated keys by column index is not supported."
+msgstr ""
+"Автоматично генерирани ключове спрямо индекс на колона не се поддържат."
+
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:66
msgid ""
"Unable to determine a value for MaxIndexKeys due to missing system catalog "
"data."
@@ -909,118 +1166,134 @@ msgstr ""
"Невъзможно е да се определи стойността за MaxIndexKeys поради липса на "
"системния каталог с данни."
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:100
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:89
msgid "Unable to find name datatype in the system catalogs."
msgstr "Не може да се намери името на типа данни в системните каталози."
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1117
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1028
msgid "proname"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1117
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1028
msgid "oid"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1119
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1714
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1030
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1481
msgid "typtype"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1122
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1033
msgid "proargtypes"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1732
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1499
msgid "adsrc"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1872
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1963
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1512
+msgid "attidentity"
+msgstr ""
+
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1608
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1684
msgid "rolname"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1873
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1964
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1609
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1685
msgid "relacl"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1878
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1615
msgid "attacl"
msgstr ""
-#: org/postgresql/jdbc/PgParameterMetaData.java:86
+#: org/postgresql/jdbc/AbstractBlobClob.java:78
+msgid ""
+"Truncation of large objects is only implemented in 8.3 and later servers."
+msgstr "Скъсяване на големи обекти LOB е осъществено само във версии след 8.3."
+
+#: org/postgresql/jdbc/AbstractBlobClob.java:83
+msgid "Cannot truncate LOB to a negative length."
+msgstr ""
+
+#: org/postgresql/jdbc/AbstractBlobClob.java:90
+#: org/postgresql/jdbc/AbstractBlobClob.java:234
#, java-format
-msgid "The parameter index is out of range: {0}, number of parameters: {1}."
-msgstr "Параметърният индекс е извън обхват: {0}, брой параметри: {1}."
+msgid "PostgreSQL LOBs can only index to: {0}"
+msgstr "PostgreSQL индексира големи обекти LOB само до: {0}"
+
+#: org/postgresql/jdbc/AbstractBlobClob.java:230
+msgid "LOB positioning offsets start at 1."
+msgstr "Позиционалният офсет при големи обекти LOB започва от 1."
+
+#: org/postgresql/jdbc/AbstractBlobClob.java:246
+msgid "free() was called on this LOB previously"
+msgstr "Функцията free() бе вече извикана за този голям обект LOB"
-#: org/postgresql/jdbc/PgPreparedStatement.java:102
-#: org/postgresql/jdbc/PgPreparedStatement.java:128
-#: org/postgresql/jdbc/PgPreparedStatement.java:150
-#: org/postgresql/jdbc/PgPreparedStatement.java:1108
+#: org/postgresql/jdbc/PgPreparedStatement.java:106
+#: org/postgresql/jdbc/PgPreparedStatement.java:127
+#: org/postgresql/jdbc/PgPreparedStatement.java:139
+#: org/postgresql/jdbc/PgPreparedStatement.java:1035
msgid ""
"Can''t use query methods that take a query string on a PreparedStatement."
msgstr ""
"Не може да се употребяват методи за заявка, които ползват низове на "
"PreparedStatement."
-#: org/postgresql/jdbc/PgPreparedStatement.java:119
-#: org/postgresql/jdbc/PgStatement.java:286
-msgid "Multiple ResultSets were returned by the query."
-msgstr "Заявката върна няколко ResultSets."
-
-#: org/postgresql/jdbc/PgPreparedStatement.java:270
+#: org/postgresql/jdbc/PgPreparedStatement.java:249
msgid "Unknown Types value."
msgstr "Стойност от неизвестен тип."
-#: org/postgresql/jdbc/PgPreparedStatement.java:417
-#: org/postgresql/jdbc/PgPreparedStatement.java:486
-#: org/postgresql/jdbc/PgPreparedStatement.java:1251
-#: org/postgresql/jdbc/PgPreparedStatement.java:1583
+#: org/postgresql/jdbc/PgPreparedStatement.java:382
+#: org/postgresql/jdbc/PgPreparedStatement.java:439
+#: org/postgresql/jdbc/PgPreparedStatement.java:1191
+#: org/postgresql/jdbc/PgPreparedStatement.java:1490
#, java-format
msgid "Invalid stream length {0}."
msgstr "Невалидна дължина {0} на потока данни."
-#: org/postgresql/jdbc/PgPreparedStatement.java:447
+#: org/postgresql/jdbc/PgPreparedStatement.java:411
#, java-format
msgid "The JVM claims not to support the {0} encoding."
msgstr "JVM не поддържа за момента {0} кодовата таблица."
-#: org/postgresql/jdbc/PgPreparedStatement.java:450
-#: org/postgresql/jdbc/PgPreparedStatement.java:519
-#: org/postgresql/jdbc/PgResultSet.java:1075
-#: org/postgresql/jdbc/PgResultSet.java:1109
+#: org/postgresql/jdbc/PgPreparedStatement.java:414
+#: org/postgresql/jdbc/PgResultSet.java:1122
+#: org/postgresql/jdbc/PgResultSet.java:1156
msgid "Provided InputStream failed."
msgstr "Зададения InputStream поток е неуспешен."
-#: org/postgresql/jdbc/PgPreparedStatement.java:536
-#: org/postgresql/jdbc/PgPreparedStatement.java:1170
+#: org/postgresql/jdbc/PgPreparedStatement.java:460
+#: org/postgresql/jdbc/PgPreparedStatement.java:1096
#, java-format
msgid "Unknown type {0}."
msgstr "Неизвестен тип {0}."
-#: org/postgresql/jdbc/PgPreparedStatement.java:553
+#: org/postgresql/jdbc/PgPreparedStatement.java:477
msgid "No hstore extension installed."
msgstr ""
-#: org/postgresql/jdbc/PgPreparedStatement.java:683
-#: org/postgresql/jdbc/PgPreparedStatement.java:705
-#: org/postgresql/jdbc/PgPreparedStatement.java:715
-#: org/postgresql/jdbc/PgPreparedStatement.java:725
+#: org/postgresql/jdbc/PgPreparedStatement.java:619
+#: org/postgresql/jdbc/PgPreparedStatement.java:642
+#: org/postgresql/jdbc/PgPreparedStatement.java:652
+#: org/postgresql/jdbc/PgPreparedStatement.java:664
#, java-format
msgid "Cannot cast an instance of {0} to type {1}"
msgstr "Не може да преобразува инстанция на {0} към тип {1}"
-#: org/postgresql/jdbc/PgPreparedStatement.java:741
+#: org/postgresql/jdbc/PgPreparedStatement.java:682
#, java-format
msgid "Unsupported Types value: {0}"
msgstr "Неподдържана стойност за тип: {0}"
-#: org/postgresql/jdbc/PgPreparedStatement.java:970
+#: org/postgresql/jdbc/PgPreparedStatement.java:894
#, java-format
msgid "Cannot convert an instance of {0} to type {1}"
msgstr "Не може да преобразува инстанцията на {0} във вида {1}"
-#: org/postgresql/jdbc/PgPreparedStatement.java:1040
+#: org/postgresql/jdbc/PgPreparedStatement.java:968
#, java-format
msgid ""
"Can''t infer the SQL type to use for an instance of {0}. Use setObject() "
@@ -1029,23 +1302,22 @@ msgstr ""
"Не може да се определи SQL тип, който да се използва за инстанцията на {0}. "
"Ползвайте метода setObject() с точни стойности, за да определите типа."
-#: org/postgresql/jdbc/PgPreparedStatement.java:1207
-#: org/postgresql/jdbc/PgPreparedStatement.java:1303
-#: org/postgresql/jdbc/PgPreparedStatement.java:1340
+#: org/postgresql/jdbc/PgPreparedStatement.java:1133
+#: org/postgresql/jdbc/PgPreparedStatement.java:1233
msgid "Unexpected error writing large object to database."
msgstr "Неочаквана грешка при записване на голям обект LOB в базата данни."
-#: org/postgresql/jdbc/PgPreparedStatement.java:1278
-#: org/postgresql/jdbc/PgResultSet.java:1163
+#: org/postgresql/jdbc/PgPreparedStatement.java:1178
+#: org/postgresql/jdbc/PgResultSet.java:1210
msgid "Provided Reader failed."
msgstr "Грешка с ползвания четец."
-#: org/postgresql/jdbc/PgPreparedStatement.java:1542
-#: org/postgresql/util/StreamWrapper.java:59
-msgid "Object is too large to send over the protocol."
+#: org/postgresql/jdbc/BooleanTypeUtil.java:99
+#, java-format
+msgid "Cannot cast to boolean: \"{0}\""
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:285
+#: org/postgresql/jdbc/PgResultSet.java:280
msgid ""
"Operation requires a scrollable ResultSet, but this ResultSet is "
"FORWARD_ONLY."
@@ -1053,46 +1325,38 @@ msgstr ""
"Операцията изисква резултатите да са scrollable, но този ResultSet е "
"FORWARD_ONLY."
-#: org/postgresql/jdbc/PgResultSet.java:456
-msgid "Unexpected error while decoding character data from a large object."
-msgstr "Неочаквана грешка при декодиране на символите от голям обект LOB."
-
-#: org/postgresql/jdbc/PgResultSet.java:507
-#: org/postgresql/jdbc/PgResultSet.java:537
-#: org/postgresql/jdbc/PgResultSet.java:570
-#: org/postgresql/jdbc/PgResultSet.java:2964
+#: org/postgresql/jdbc/PgResultSet.java:492
+#: org/postgresql/jdbc/PgResultSet.java:532
+#: org/postgresql/jdbc/PgResultSet.java:556
+#: org/postgresql/jdbc/PgResultSet.java:594
+#: org/postgresql/jdbc/PgResultSet.java:624
#: org/postgresql/jdbc/PgResultSet.java:3008
+#: org/postgresql/jdbc/PgResultSet.java:3052
#, fuzzy, java-format
msgid "Cannot convert the column of type {0} to requested type {1}."
msgstr "Не може да преобразува инстанцията на {0} във вида {1}"
-#: org/postgresql/jdbc/PgResultSet.java:789
-#: org/postgresql/jdbc/PgResultSet.java:810
-#: org/postgresql/jdbc/PgResultSet.java:1797
+#: org/postgresql/jdbc/PgResultSet.java:838
+#: org/postgresql/jdbc/PgResultSet.java:859
+#: org/postgresql/jdbc/PgResultSet.java:1832
msgid "Can''t use relative move methods while on the insert row."
msgstr ""
"Не може да се използват относителни методи за движение, когато се намираме "
"при редицата на въвеждане."
-#: org/postgresql/jdbc/PgResultSet.java:829
-#: org/postgresql/jdbc/PgStatement.java:1045
-#, java-format
-msgid "Invalid fetch direction constant: {0}."
-msgstr "Невалидна константа за fetch посоката: {0}."
-
-#: org/postgresql/jdbc/PgResultSet.java:840
+#: org/postgresql/jdbc/PgResultSet.java:889
msgid "Cannot call cancelRowUpdates() when on the insert row."
msgstr ""
"Не може да се изпълни cancelRowUpdates() метода, когато се намираме при "
"редицата на въвеждане."
-#: org/postgresql/jdbc/PgResultSet.java:856
+#: org/postgresql/jdbc/PgResultSet.java:905
msgid "Cannot call deleteRow() when on the insert row."
msgstr ""
"Не може да се изпълни deleteRow() метода, когато се намираме при редицата на "
"въвеждане."
-#: org/postgresql/jdbc/PgResultSet.java:863
+#: org/postgresql/jdbc/PgResultSet.java:912
msgid ""
"Currently positioned before the start of the ResultSet. You cannot call "
"deleteRow() here."
@@ -1100,7 +1364,7 @@ msgstr ""
"В момента се намираме в началото на ResultSet. Тук не може да се изпълни "
"deleteRow() метода."
-#: org/postgresql/jdbc/PgResultSet.java:869
+#: org/postgresql/jdbc/PgResultSet.java:918
msgid ""
"Currently positioned after the end of the ResultSet. You cannot call "
"deleteRow() here."
@@ -1108,38 +1372,38 @@ msgstr ""
"В момента се намираме преди края на ResultSet. Тук не може да се изпълни "
"deleteRow() метода."
-#: org/postgresql/jdbc/PgResultSet.java:873
+#: org/postgresql/jdbc/PgResultSet.java:922
msgid "There are no rows in this ResultSet."
msgstr "В този ResultSet няма редове."
-#: org/postgresql/jdbc/PgResultSet.java:914
+#: org/postgresql/jdbc/PgResultSet.java:963
msgid "Not on the insert row."
msgstr "Не сме в редицата на въвеждане."
-#: org/postgresql/jdbc/PgResultSet.java:916
+#: org/postgresql/jdbc/PgResultSet.java:965
msgid "You must specify at least one column value to insert a row."
msgstr "Трябва да посочите поне една стойност за колона, за да вмъкнете ред."
-#: org/postgresql/jdbc/PgResultSet.java:1072
-#: org/postgresql/jdbc/PgResultSet.java:1706
-#: org/postgresql/jdbc/PgResultSet.java:2377
-#: org/postgresql/jdbc/PgResultSet.java:2402
+#: org/postgresql/jdbc/PgResultSet.java:1119
+#: org/postgresql/jdbc/PgResultSet.java:1754
+#: org/postgresql/jdbc/PgResultSet.java:2416
+#: org/postgresql/jdbc/PgResultSet.java:2437
#, java-format
msgid "The JVM claims not to support the encoding: {0}"
msgstr "JVM не поддържа тази кодова таблица за момента: {0}"
-#: org/postgresql/jdbc/PgResultSet.java:1214
+#: org/postgresql/jdbc/PgResultSet.java:1261
msgid "Can''t refresh the insert row."
msgstr "Не може да обнови въведения ред."
-#: org/postgresql/jdbc/PgResultSet.java:1280
+#: org/postgresql/jdbc/PgResultSet.java:1328
msgid "Cannot call updateRow() when on the insert row."
msgstr ""
"Не може да се изпълни updateRow() метода, когато се намираме при редицата на "
"въвеждане."
-#: org/postgresql/jdbc/PgResultSet.java:1287
-#: org/postgresql/jdbc/PgResultSet.java:3025
+#: org/postgresql/jdbc/PgResultSet.java:1335
+#: org/postgresql/jdbc/PgResultSet.java:3069
msgid ""
"Cannot update the ResultSet because it is either before the start or after "
"the end of the results."
@@ -1147,39 +1411,39 @@ msgstr ""
"Не може да се обнови ResultSet, когато се намираме преди началото или след "
"края на резултатите."
-#: org/postgresql/jdbc/PgResultSet.java:1486
+#: org/postgresql/jdbc/PgResultSet.java:1535
msgid "ResultSets with concurrency CONCUR_READ_ONLY cannot be updated."
msgstr ""
"ResultSets с concurrency CONCUR_READ_ONLY не могат да бъдат актуализирани."
-#: org/postgresql/jdbc/PgResultSet.java:1555
+#: org/postgresql/jdbc/PgResultSet.java:1603
#, java-format
msgid "No primary key found for table {0}."
msgstr "Няма първичен ключ за таблица {0}."
-#: org/postgresql/jdbc/PgResultSet.java:1941
-#: org/postgresql/jdbc/PgResultSet.java:1946
-#: org/postgresql/jdbc/PgResultSet.java:1986
-#: org/postgresql/jdbc/PgResultSet.java:1992
-#: org/postgresql/jdbc/PgResultSet.java:2790
-#: org/postgresql/jdbc/PgResultSet.java:2796
-#: org/postgresql/jdbc/PgResultSet.java:2820
-#: org/postgresql/jdbc/PgResultSet.java:2825
-#: org/postgresql/jdbc/PgResultSet.java:2841
-#: org/postgresql/jdbc/PgResultSet.java:2862
-#: org/postgresql/jdbc/PgResultSet.java:2873
-#: org/postgresql/jdbc/PgResultSet.java:2886
-#: org/postgresql/jdbc/PgResultSet.java:3013
+#: org/postgresql/jdbc/PgResultSet.java:2011
+#: org/postgresql/jdbc/PgResultSet.java:2016
+#: org/postgresql/jdbc/PgResultSet.java:2803
+#: org/postgresql/jdbc/PgResultSet.java:2809
+#: org/postgresql/jdbc/PgResultSet.java:2834
+#: org/postgresql/jdbc/PgResultSet.java:2840
+#: org/postgresql/jdbc/PgResultSet.java:2864
+#: org/postgresql/jdbc/PgResultSet.java:2869
+#: org/postgresql/jdbc/PgResultSet.java:2885
+#: org/postgresql/jdbc/PgResultSet.java:2906
+#: org/postgresql/jdbc/PgResultSet.java:2917
+#: org/postgresql/jdbc/PgResultSet.java:2930
+#: org/postgresql/jdbc/PgResultSet.java:3057
#, java-format
msgid "Bad value for type {0} : {1}"
msgstr "Невалидна стойност за тип {0} : {1}"
-#: org/postgresql/jdbc/PgResultSet.java:2564
+#: org/postgresql/jdbc/PgResultSet.java:2589
#, java-format
msgid "The column name {0} was not found in this ResultSet."
msgstr "Името на колоната {0} не бе намерено в този ResultSet."
-#: org/postgresql/jdbc/PgResultSet.java:2689
+#: org/postgresql/jdbc/PgResultSet.java:2725
msgid ""
"ResultSet is not updateable. The query that generated this result set must "
"select only one table, and must select all primary keys from that table. See "
@@ -1189,436 +1453,312 @@ msgstr ""
"да селектира само една таблица, както и всички първични ключове в нея. За "
"повече информация, вижте раздел 5.6 на JDBC 2.1 API Specification."
-#: org/postgresql/jdbc/PgResultSet.java:2701
+#: org/postgresql/jdbc/PgResultSet.java:2737
msgid "This ResultSet is closed."
msgstr "Операциите по този ResultSet са били прекратени."
-#: org/postgresql/jdbc/PgResultSet.java:2732
+#: org/postgresql/jdbc/PgResultSet.java:2768
msgid "ResultSet not positioned properly, perhaps you need to call next."
msgstr ""
"ResultSet не е референциран правилно. Вероятно трябва да придвижите курсора "
"посредством next."
-#: org/postgresql/jdbc/PgResultSet.java:3045
+#: org/postgresql/jdbc/PgResultSet.java:3089
msgid "Invalid UUID data."
msgstr "Невалидни UUID данни."
-#: org/postgresql/jdbc/PgSQLXML.java:150
-msgid "Unable to decode xml data."
-msgstr "Не може да декодира XML данните."
-
-#: org/postgresql/jdbc/PgSQLXML.java:153
-#, java-format
-msgid "Unknown XML Source class: {0}"
-msgstr "Неизвестен XML входящ клас: {0}"
+#: org/postgresql/jdbc/PgResultSet.java:3178
+#: org/postgresql/jdbc/PgResultSet.java:3185
+#: org/postgresql/jdbc/PgResultSet.java:3196
+#: org/postgresql/jdbc/PgResultSet.java:3207
+#: org/postgresql/jdbc/PgResultSet.java:3218
+#: org/postgresql/jdbc/PgResultSet.java:3229
+#: org/postgresql/jdbc/PgResultSet.java:3240
+#: org/postgresql/jdbc/PgResultSet.java:3251
+#: org/postgresql/jdbc/PgResultSet.java:3262
+#: org/postgresql/jdbc/PgResultSet.java:3269
+#: org/postgresql/jdbc/PgResultSet.java:3276
+#: org/postgresql/jdbc/PgResultSet.java:3287
+#: org/postgresql/jdbc/PgResultSet.java:3304
+#: org/postgresql/jdbc/PgResultSet.java:3311
+#: org/postgresql/jdbc/PgResultSet.java:3318
+#: org/postgresql/jdbc/PgResultSet.java:3329
+#: org/postgresql/jdbc/PgResultSet.java:3336
+#: org/postgresql/jdbc/PgResultSet.java:3343
+#: org/postgresql/jdbc/PgResultSet.java:3381
+#: org/postgresql/jdbc/PgResultSet.java:3388
+#: org/postgresql/jdbc/PgResultSet.java:3395
+#: org/postgresql/jdbc/PgResultSet.java:3415
+#: org/postgresql/jdbc/PgResultSet.java:3428
+#, fuzzy, java-format
+msgid "conversion to {0} from {1} not supported"
+msgstr "Изолационно ниво на транзакциите {0} не се поддържа."
-#: org/postgresql/jdbc/PgSQLXML.java:196
-msgid "Unable to create SAXResult for SQLXML."
-msgstr "Не може да се създаде SAXResult за SQLXML."
+#: org/postgresql/jdbc/TimestampUtils.java:355
+#: org/postgresql/jdbc/TimestampUtils.java:423
+#, fuzzy, java-format
+msgid "Bad value for type timestamp/date/time: {1}"
+msgstr "Невалидна стойност за тип {0} : {1}"
-#: org/postgresql/jdbc/PgSQLXML.java:211
-msgid "Unable to create StAXResult for SQLXML"
-msgstr "Не може да се създаде StAXResult за SQLXML."
+#: org/postgresql/jdbc/TimestampUtils.java:858
+#: org/postgresql/jdbc/TimestampUtils.java:915
+#: org/postgresql/jdbc/TimestampUtils.java:961
+#: org/postgresql/jdbc/TimestampUtils.java:1010
+#, fuzzy, java-format
+msgid "Unsupported binary encoding of {0}."
+msgstr "Неподдържана стойност за тип: {0}"
-#: org/postgresql/jdbc/PgSQLXML.java:216
-#, java-format
-msgid "Unknown XML Result class: {0}"
-msgstr "Неизвестен XML изходящ клас: {0}"
-
-#: org/postgresql/jdbc/PgSQLXML.java:228
-msgid "This SQLXML object has already been freed."
-msgstr "Този SQLXML обект вече е освободен."
+#: org/postgresql/jdbc/PgCallableStatement.java:86
+#: org/postgresql/jdbc/PgCallableStatement.java:96
+msgid "A CallableStatement was executed with nothing returned."
+msgstr "CallableStatement функция бе обработена, но няма резултати."
-#: org/postgresql/jdbc/PgSQLXML.java:237
-msgid ""
-"This SQLXML object has not been initialized, so you cannot retrieve data "
-"from it."
+#: org/postgresql/jdbc/PgCallableStatement.java:107
+msgid "A CallableStatement was executed with an invalid number of parameters"
msgstr ""
-"Този SQLXML обект не е инициализиран, така че не могат да се извличат данни "
-"от него."
+"CallableStatement функция бе обработена, но с непозволен брой параметри."
-#: org/postgresql/jdbc/PgSQLXML.java:250
+#: org/postgresql/jdbc/PgCallableStatement.java:145
#, java-format
-msgid "Failed to convert binary xml data to encoding: {0}."
-msgstr ""
-"Неуспешно преобразуване на двоични XML данни за кодиране съгласно: {0}."
-
-#: org/postgresql/jdbc/PgSQLXML.java:276
-msgid "Unable to convert DOMResult SQLXML data to a string."
-msgstr "Не може да преобразува DOMResult SQLXML данни в низ."
-
-#: org/postgresql/jdbc/PgSQLXML.java:290
msgid ""
-"This SQLXML object has already been initialized, so you cannot manipulate it "
-"further."
-msgstr "Този SQLXML обект вече е инициализиран и не може да бъде променен."
-
-#: org/postgresql/jdbc/PgStatement.java:325
-msgid "Can''t use executeWithFlags(int) on a Statement."
-msgstr ""
-
-#: org/postgresql/jdbc/PgStatement.java:484
-msgid "Maximum number of rows must be a value grater than or equal to 0."
-msgstr ""
-"Максималният брой редове трябва да бъде стойност по-голяма или равна на 0."
-
-#: org/postgresql/jdbc/PgStatement.java:525
-msgid "Query timeout must be a value greater than or equals to 0."
+"A CallableStatement function was executed and the out parameter {0} was of "
+"type {1} however type {2} was registered."
msgstr ""
-"Времето за изпълнение на заявката трябва да бъде стойност по-голяма или "
-"равна на 0."
+"CallableStatement функция бе обработена и изходния параметър {0} бе от тип "
+"{1}, обаче тип {2} бе използван."
-#: org/postgresql/jdbc/PgStatement.java:561
-msgid "The maximum field size must be a value greater than or equal to 0."
+#: org/postgresql/jdbc/PgCallableStatement.java:202
+msgid ""
+"This statement does not declare an OUT parameter. Use '{' ?= call ... '}' "
+"to declare one."
msgstr ""
-"Максималният размер на полето трябва да бъде стойност по-голяма или равна на "
-"0."
+"Тази заявка не декларира изходен параметър. Ползвайте '{' ?= call ... '}' за "
+"да декларирате такъв."
-#: org/postgresql/jdbc/PgStatement.java:871
-msgid "This statement has been closed."
-msgstr "Командата е извършена."
+#: org/postgresql/jdbc/PgCallableStatement.java:246
+msgid "wasNull cannot be call before fetching a result."
+msgstr "wasNull не може да бьде изпълнен, преди наличието на резултата."
-#: org/postgresql/jdbc/PgStatement.java:1148
+#: org/postgresql/jdbc/PgCallableStatement.java:384
+#: org/postgresql/jdbc/PgCallableStatement.java:403
+#, java-format
msgid ""
-"Returning autogenerated keys is only supported for 8.2 and later servers."
+"Parameter of type {0} was registered, but call to get{1} (sqltype={2}) was "
+"made."
msgstr ""
-"Автоматично генерирани ключове се поддържат за версии на сървъра след 8.2."
+"Отчетен параметър от тип {0}, но обработено като get{1} (sqltype={2}). "
-#: org/postgresql/jdbc/PgStatement.java:1326
-#: org/postgresql/jdbc/PgStatement.java:1357
-msgid "Returning autogenerated keys by column index is not supported."
+#: org/postgresql/jdbc/PgCallableStatement.java:424
+msgid ""
+"A CallableStatement was declared, but no call to registerOutParameter(1, "
+"<some type>) was made."
msgstr ""
-"Автоматично генерирани ключове спрямо индекс на колона не се поддържат."
-
-#: org/postgresql/jdbc/PSQLSavepoint.java:40
-#: org/postgresql/jdbc/PSQLSavepoint.java:54
-#: org/postgresql/jdbc/PSQLSavepoint.java:72
-msgid "Cannot reference a savepoint after it has been released."
-msgstr "Не може да референцира savepoint, след като е била освободена."
-
-#: org/postgresql/jdbc/PSQLSavepoint.java:45
-msgid "Cannot retrieve the id of a named savepoint."
-msgstr "Не може да определи ID на спомената savepoint."
-
-#: org/postgresql/jdbc/PSQLSavepoint.java:59
-msgid "Cannot retrieve the name of an unnamed savepoint."
-msgstr "Не може да определи името на неупомената savepoint."
+"CallableStatement функция бе декларирана, но обработена като "
+"registerOutParameter(1, <some type>) "
-#: org/postgresql/jdbc/TimestampUtils.java:298
-#, fuzzy, java-format
-msgid "Bad value for type timestamp/date/time: {1}"
-msgstr "Невалидна стойност за тип {0} : {1}"
+#: org/postgresql/jdbc/PgCallableStatement.java:430
+msgid "No function outputs were registered."
+msgstr "Резултати от функцията не бяха регистрирани."
-#: org/postgresql/jdbc/TimestampUtils.java:359
+#: org/postgresql/jdbc/PgCallableStatement.java:436
msgid ""
-"Infinite value found for timestamp/date. This cannot be represented as time."
+"Results cannot be retrieved from a CallableStatement before it is executed."
msgstr ""
-"Безкрайна стойност за време или дата. Не може да бъде представена като "
-"времева стойност."
-
-#: org/postgresql/jdbc/TimestampUtils.java:674
-#: org/postgresql/jdbc/TimestampUtils.java:710
-#: org/postgresql/jdbc/TimestampUtils.java:757
-#, fuzzy, java-format
-msgid "Unsupported binary encoding of {0}."
-msgstr "Неподдържана стойност за тип: {0}"
-
-#: org/postgresql/largeobject/LargeObjectManager.java:147
-msgid "Failed to initialize LargeObject API"
-msgstr "Не може да инициализира LargeObject API"
-
-#: org/postgresql/largeobject/LargeObjectManager.java:265
-#: org/postgresql/largeobject/LargeObjectManager.java:308
-msgid "Large Objects may not be used in auto-commit mode."
-msgstr "Големи обекти LOB не могат да се използват в auto-commit модус."
+"Резултати от CallableStatement функция не могат да бъдат получени, преди тя "
+"да бъде обработена."
-#: org/postgresql/osgi/PGDataSourceFactory.java:85
+#: org/postgresql/jdbc/PgCallableStatement.java:703
#, fuzzy, java-format
-msgid "Unsupported properties: {0}"
+msgid "Unsupported type conversion to {1}."
msgstr "Неподдържана стойност за тип: {0}"
-#: org/postgresql/PGProperty.java:450 org/postgresql/PGProperty.java:470
-#, fuzzy, java-format
-msgid "{0} parameter value must be an integer but was: {1}"
-msgstr "Стойността на параметъра unknownLength трябва да бъде цяло число"
-
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:125
-msgid ""
-"Could not find a java cryptographic algorithm: X.509 CertificateFactory not "
-"available."
-msgstr ""
-
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:135
-#, java-format
-msgid "Could not open SSL certificate file {0}."
-msgstr ""
-
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:140
-#, java-format
-msgid "Loading the SSL certificate {0} into a KeyManager failed."
-msgstr ""
-
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:195
-msgid "Enter SSL password: "
-msgstr ""
-
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:202
-msgid "Could not read password for SSL key file, console is not available."
-msgstr ""
-
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:207
-#, java-format
-msgid "Could not read password for SSL key file by callbackhandler {0}."
-msgstr ""
-
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:226
+#: org/postgresql/jdbc/EscapedFunctions.java:240
#, java-format
-msgid "Could not decrypt SSL key file {0}."
-msgstr ""
-
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:240
-#, java-format
-msgid "Could not read SSL key file {0}."
-msgstr ""
+msgid "{0} function takes four and only four argument."
+msgstr "Функцията {0} може да приеме четири и само четири аргумента."
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:243
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:162
+#: org/postgresql/jdbc/EscapedFunctions.java:270
+#: org/postgresql/jdbc/EscapedFunctions.java:344
+#: org/postgresql/jdbc/EscapedFunctions.java:749
+#: org/postgresql/jdbc/EscapedFunctions.java:787
#, java-format
-msgid "Could not find a java cryptographic algorithm: {0}."
-msgstr ""
-
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:90
-#, fuzzy, java-format
-msgid "The password callback class provided {0} could not be instantiated."
-msgstr "Класът SSLSocketFactory връща {0} и не може да бъде инстанцииран."
+msgid "{0} function takes two and only two arguments."
+msgstr "Функцията {0} може да приеме два и само два аргумента."
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:123
+#: org/postgresql/jdbc/EscapedFunctions.java:288
+#: org/postgresql/jdbc/EscapedFunctions.java:326
+#: org/postgresql/jdbc/EscapedFunctions.java:446
+#: org/postgresql/jdbc/EscapedFunctions.java:461
+#: org/postgresql/jdbc/EscapedFunctions.java:476
+#: org/postgresql/jdbc/EscapedFunctions.java:491
+#: org/postgresql/jdbc/EscapedFunctions.java:506
+#: org/postgresql/jdbc/EscapedFunctions.java:521
+#: org/postgresql/jdbc/EscapedFunctions.java:536
+#: org/postgresql/jdbc/EscapedFunctions.java:551
+#: org/postgresql/jdbc/EscapedFunctions.java:566
+#: org/postgresql/jdbc/EscapedFunctions.java:581
+#: org/postgresql/jdbc/EscapedFunctions.java:596
+#: org/postgresql/jdbc/EscapedFunctions.java:611
+#: org/postgresql/jdbc/EscapedFunctions.java:775
#, java-format
-msgid "Could not open SSL root certificate file {0}."
-msgstr ""
+msgid "{0} function takes one and only one argument."
+msgstr "Функцията {0} може да приеме само един единствен аргумент."
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:139
+#: org/postgresql/jdbc/EscapedFunctions.java:310
+#: org/postgresql/jdbc/EscapedFunctions.java:391
#, java-format
-msgid "Could not read SSL root certificate file {0}."
-msgstr ""
+msgid "{0} function takes two or three arguments."
+msgstr "Функцията {0} може да приеме два или три аргумента."
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:143
+#: org/postgresql/jdbc/EscapedFunctions.java:416
+#: org/postgresql/jdbc/EscapedFunctions.java:431
+#: org/postgresql/jdbc/EscapedFunctions.java:734
+#: org/postgresql/jdbc/EscapedFunctions.java:764
#, java-format
-msgid "Loading the SSL root certificate {0} into a TrustManager failed."
-msgstr ""
-
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:156
-msgid "Could not initialize SSL context."
-msgstr ""
+msgid "{0} function doesn''t take any argument."
+msgstr "Функцията {0} не може да приема аргументи."
-#: org/postgresql/ssl/MakeSSL.java:52
+#: org/postgresql/jdbc/EscapedFunctions.java:627
+#: org/postgresql/jdbc/EscapedFunctions.java:680
#, java-format
-msgid "The SSLSocketFactory class provided {0} could not be instantiated."
-msgstr "Класът SSLSocketFactory връща {0} и не може да бъде инстанцииран."
+msgid "{0} function takes three and only three arguments."
+msgstr "Функцията {0} може да приеме три и само три аргумента."
-#: org/postgresql/ssl/MakeSSL.java:67
+#: org/postgresql/jdbc/EscapedFunctions.java:640
+#: org/postgresql/jdbc/EscapedFunctions.java:661
+#: org/postgresql/jdbc/EscapedFunctions.java:664
+#: org/postgresql/jdbc/EscapedFunctions.java:697
+#: org/postgresql/jdbc/EscapedFunctions.java:710
+#: org/postgresql/jdbc/EscapedFunctions.java:713
#, java-format
-msgid "SSL error: {0}"
-msgstr ""
+msgid "Interval {0} not yet implemented"
+msgstr "Интервалът {0} не е валиден все още."
-#: org/postgresql/ssl/MakeSSL.java:78
+#: org/postgresql/PGProperty.java:535 org/postgresql/PGProperty.java:555
#, fuzzy, java-format
-msgid "The HostnameVerifier class provided {0} could not be instantiated."
-msgstr "Класът SSLSocketFactory връща {0} и не може да бъде инстанцииран."
-
-#: org/postgresql/ssl/MakeSSL.java:84
-#, java-format
-msgid "The hostname {0} could not be verified by hostnameverifier {1}."
-msgstr ""
-
-#: org/postgresql/ssl/MakeSSL.java:93
-#, java-format
-msgid "The hostname {0} could not be verified."
-msgstr ""
-
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:167
-msgid "The sslfactoryarg property may not be empty."
-msgstr ""
-
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:183
-msgid ""
-"The environment variable containing the server's SSL certificate must not be "
-"empty."
-msgstr ""
-
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:191
-msgid ""
-"The system property containing the server's SSL certificate must not be "
-"empty."
-msgstr ""
-
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:198
-msgid ""
-"The sslfactoryarg property must start with the prefix file:, classpath:, "
-"env:, sys:, or -----BEGIN CERTIFICATE-----."
-msgstr ""
-
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:210
-#, fuzzy
-msgid "An error occurred reading the certificate"
-msgstr "Възникна грешка при осъществяване на SSL връзката."
-
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:243
-msgid "No X509TrustManager found"
-msgstr ""
+msgid "{0} parameter value must be an integer but was: {1}"
+msgstr "Стойността на параметъра unknownLength трябва да бъде цяло число"
-#: org/postgresql/util/PGInterval.java:155
-msgid "Conversion of interval failed"
-msgstr "Неуспешно преобразуване на интервал"
+#: org/postgresql/largeobject/LargeObjectManager.java:144
+msgid "Failed to initialize LargeObject API"
+msgstr "Не може да инициализира LargeObject API"
-#: org/postgresql/util/PGmoney.java:65
-msgid "Conversion of money failed."
-msgstr "Неуспешно валутно преобразуване."
+#: org/postgresql/largeobject/LargeObjectManager.java:262
+#: org/postgresql/largeobject/LargeObjectManager.java:305
+msgid "Large Objects may not be used in auto-commit mode."
+msgstr "Големи обекти LOB не могат да се използват в auto-commit модус."
-#: org/postgresql/util/ServerErrorMessage.java:165
+#: org/postgresql/copy/PGCopyInputStream.java:51
#, java-format
-msgid "Detail: {0}"
-msgstr "Подробност: {0}"
+msgid "Copying from database failed: {0}"
+msgstr "Копирането от базата данни бе неуспешно: {0}"
-#: org/postgresql/util/ServerErrorMessage.java:170
-#, java-format
-msgid "Hint: {0}"
-msgstr "Забележка: {0}"
+#: org/postgresql/copy/PGCopyInputStream.java:67
+#: org/postgresql/copy/PGCopyOutputStream.java:94
+msgid "This copy stream is closed."
+msgstr "Потока за копиране на данните е затворен."
-#: org/postgresql/util/ServerErrorMessage.java:174
-#, java-format
-msgid "Position: {0}"
-msgstr "Позиция: {0}"
+#: org/postgresql/copy/PGCopyInputStream.java:110
+msgid "Read from copy failed."
+msgstr "Четене от копието неуспешно."
-#: org/postgresql/util/ServerErrorMessage.java:178
+#: org/postgresql/copy/CopyManager.java:53
#, java-format
-msgid "Where: {0}"
-msgstr "Където: {0}"
+msgid "Requested CopyIn but got {0}"
+msgstr "Зададено CopyIn но получено {0}"
-#: org/postgresql/util/ServerErrorMessage.java:184
+#: org/postgresql/copy/CopyManager.java:64
#, java-format
-msgid "Internal Query: {0}"
-msgstr "Вътрешна заявка: {0}"
+msgid "Requested CopyOut but got {0}"
+msgstr "Зададено CopyOut но получено {0}"
-#: org/postgresql/util/ServerErrorMessage.java:188
-#, java-format
-msgid "Internal Position: {0}"
-msgstr "Вътрешна позиция: {0}"
+#: org/postgresql/copy/CopyManager.java:75
+#, fuzzy, java-format
+msgid "Requested CopyDual but got {0}"
+msgstr "Зададено CopyOut но получено {0}"
-#: org/postgresql/util/ServerErrorMessage.java:195
+#: org/postgresql/copy/PGCopyOutputStream.java:71
#, java-format
-msgid "Location: File: {0}, Routine: {1}, Line: {2}"
-msgstr "Местоположение: Файл: {0}, Функция: {1}, Ред: {2}"
+msgid "Cannot write to copy a byte of value {0}"
+msgstr "Няма пишещи права, за да копира байтова стойност {0}"
-#: org/postgresql/util/ServerErrorMessage.java:200
+#: org/postgresql/fastpath/Fastpath.java:80
+#, fuzzy, java-format
+msgid "Fastpath call {0} - No result was returned and we expected a numeric."
+msgstr "Извикване на {0} - няма резултати и а бе очаквано цяло число."
+
+#: org/postgresql/fastpath/Fastpath.java:157
#, java-format
-msgid "Server SQLState: {0}"
-msgstr "SQL статус на сървъра: {0}"
+msgid "Fastpath call {0} - No result was returned and we expected an integer."
+msgstr "Извикване на {0} - няма резултати и а бе очаквано цяло число."
-#: org/postgresql/xa/PGXAConnection.java:148
+#: org/postgresql/fastpath/Fastpath.java:165
+#, fuzzy, java-format
msgid ""
-"Transaction control methods setAutoCommit(true), commit, rollback and "
-"setSavePoint not allowed while an XA transaction is active."
-msgstr ""
-
-#: org/postgresql/xa/PGXAConnection.java:196
-#: org/postgresql/xa/PGXAConnection.java:265
-msgid "Invalid flags"
-msgstr "Невалидни флагове"
-
-#: org/postgresql/xa/PGXAConnection.java:200
-#: org/postgresql/xa/PGXAConnection.java:269
-#: org/postgresql/xa/PGXAConnection.java:437
-msgid "xid must not be null"
-msgstr "xid не може да бъде null"
-
-#: org/postgresql/xa/PGXAConnection.java:204
-msgid "Connection is busy with another transaction"
-msgstr "Връзката е заета с друга транзакция"
-
-#: org/postgresql/xa/PGXAConnection.java:213
-#: org/postgresql/xa/PGXAConnection.java:279
-msgid "suspend/resume not implemented"
-msgstr "спиране / започване не се поддържа за момента"
-
-#: org/postgresql/xa/PGXAConnection.java:219
-#: org/postgresql/xa/PGXAConnection.java:224
-#: org/postgresql/xa/PGXAConnection.java:228
-msgid "Transaction interleaving not implemented"
-msgstr "Транзакция в транзакция не се поддържа за момента"
-
-#: org/postgresql/xa/PGXAConnection.java:239
-msgid "Error disabling autocommit"
-msgstr "Грешка при изключване на autocommit"
+"Fastpath call {0} - No result was returned or wrong size while expecting an "
+"integer."
+msgstr "Извикване на {0} - няма резултати и а бе очаквано цяло число."
-#: org/postgresql/xa/PGXAConnection.java:273
-msgid "tried to call end without corresponding start call"
-msgstr "опита да извика end без съответстващо извикване на start"
+#: org/postgresql/fastpath/Fastpath.java:182
+#, fuzzy, java-format
+msgid "Fastpath call {0} - No result was returned and we expected a long."
+msgstr "Извикване на {0} - няма резултати и а бе очаквано цяло число."
-#: org/postgresql/xa/PGXAConnection.java:305
+#: org/postgresql/fastpath/Fastpath.java:190
+#, fuzzy, java-format
msgid ""
-"Not implemented: Prepare must be issued using the same connection that "
-"started the transaction"
-msgstr ""
-"Невъзможна комбинация: Prepare трябва да бъде издадено чрез използване на "
-"същата връзка, при която е започната транзакцията"
+"Fastpath call {0} - No result was returned or wrong size while expecting a "
+"long."
+msgstr "Извикване на {0} - няма резултати и а бе очаквано цяло число."
-#: org/postgresql/xa/PGXAConnection.java:309
-msgid "Prepare called before end"
-msgstr "Prepare извикано преди края"
+#: org/postgresql/fastpath/Fastpath.java:302
+#, java-format
+msgid "The fastpath function {0} is unknown."
+msgstr "Функцията {0} е неизвестна."
-#: org/postgresql/xa/PGXAConnection.java:317
-msgid "Server versions prior to 8.1 do not support two-phase commit."
-msgstr "Сървър версии преди 8.1 не поддържат дву-фазов commit."
+#~ msgid ""
+#~ "Connection refused. Check that the hostname and port are correct and that "
+#~ "the postmaster is accepting TCP/IP connections."
+#~ msgstr ""
+#~ "Връзката отказана. Проверете дали името на хоста и порта са верни и дали "
+#~ "postmaster приема ТСР / IP връзки."
-#: org/postgresql/xa/PGXAConnection.java:334
-msgid "Error preparing transaction"
-msgstr "Грешка при подготвяне на транзакция"
+#, fuzzy
+#~ msgid "The connection url is invalid."
+#~ msgstr "Опита за връзка бе неуспешен."
-#: org/postgresql/xa/PGXAConnection.java:349
-msgid "Invalid flag"
-msgstr "Невалиден флаг"
+#~ msgid "Connection rejected: {0}."
+#~ msgstr "Връзката отказана: {0}."
-#: org/postgresql/xa/PGXAConnection.java:384
-msgid "Error during recover"
-msgstr "Грешка при възстановяване"
+#~ msgid "Backend start-up failed: {0}."
+#~ msgstr "Неуспешен опит за стартиране на backend: {0}."
-#: org/postgresql/xa/PGXAConnection.java:423
-#: org/postgresql/xa/PGXAConnection.java:426
-msgid "Error rolling back prepared transaction"
-msgstr "Грешка при възстановяване на състоянието преди подготвена транзакция"
+#~ msgid "Copy not implemented for protocol version 2"
+#~ msgstr "Копирането не е възможно при версия 2 на протокола"
-#: org/postgresql/xa/PGXAConnection.java:464
-msgid ""
-"Not implemented: one-phase commit must be issued using the same connection "
-"that was used to start it"
-msgstr ""
-"Невъзможна комбинация: едно-фазов commit трябва да бъде издаден чрез "
-"използване на същата връзка, при която е започнал"
+#~ msgid "Server versions prior to 8.0 do not support savepoints."
+#~ msgstr "Сървър версии преди 8.0 не поддържат savepoints."
-#: org/postgresql/xa/PGXAConnection.java:468
-msgid "commit called before end"
-msgstr "commit извикан преди end"
+#~ msgid "Unexpected error while decoding character data from a large object."
+#~ msgstr "Неочаквана грешка при декодиране на символите от голям обект LOB."
-#: org/postgresql/xa/PGXAConnection.java:478
-msgid "Error during one-phase commit"
-msgstr "Грешка при едно-фазов commit"
+#~ msgid ""
+#~ "Returning autogenerated keys is only supported for 8.2 and later servers."
+#~ msgstr ""
+#~ "Автоматично генерирани ключове се поддържат за версии на сървъра след 8.2."
-#: org/postgresql/xa/PGXAConnection.java:497
-msgid ""
-"Not implemented: 2nd phase commit must be issued using an idle connection"
-msgstr ""
-"Невъзможна комбинация: втората фаза на commit задължително трябва да бъде "
-"издадена при свободна връзка"
+#~ msgid ""
+#~ "Infinite value found for timestamp/date. This cannot be represented as "
+#~ "time."
+#~ msgstr ""
+#~ "Безкрайна стойност за време или дата. Не може да бъде представена като "
+#~ "времева стойност."
-#: org/postgresql/xa/PGXAConnection.java:513
-#, fuzzy
-msgid "Error committing prepared transaction"
-msgstr "Грешка при възстановяване на състоянието преди подготвена транзакция"
+#~ msgid "Server versions prior to 8.1 do not support two-phase commit."
+#~ msgstr "Сървър версии преди 8.1 не поддържат дву-фазов commit."
-#: org/postgresql/xa/PGXAConnection.java:529
-msgid "Heuristic commit/rollback not supported"
-msgstr "Евристичен commit или rollback не се поддържа"
+#~ msgid "Invalid flag"
+#~ msgstr "Невалиден флаг"
#~ msgid "The class {0} does not implement org.postgresql.util.PGobject."
#~ msgstr "Клас {0} не изпълнява org.postgresql.util.PGobject."
diff --git a/pgjdbc/src/main/java/org/postgresql/translation/cs.po b/pgjdbc/src/main/java/org/postgresql/translation/cs.po
index 2d20e7a..003e84a 100644
--- a/pgjdbc/src/main/java/org/postgresql/translation/cs.po
+++ b/pgjdbc/src/main/java/org/postgresql/translation/cs.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PostgreSQL JDBC Driver 8.0\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-01-07 13:37+0300\n"
+"POT-Creation-Date: 2018-03-10 23:24+0300\n"
"PO-Revision-Date: 2005-08-21 20:00+0200\n"
"Last-Translator: Petr Dittrich <bodyn at medoro.org>\n"
"Language-Team: \n"
@@ -16,462 +16,583 @@ msgstr ""
"Content-Type: text/plain; charset=ISO-8859-2\n"
"Content-Transfer-Encoding: 8bit\n"
-#: org/postgresql/copy/CopyManager.java:57
-#, java-format
-msgid "Requested CopyIn but got {0}"
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:164
+msgid "The sslfactoryarg property may not be empty."
msgstr ""
-#: org/postgresql/copy/CopyManager.java:69
-#, java-format
-msgid "Requested CopyOut but got {0}"
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:180
+msgid ""
+"The environment variable containing the server's SSL certificate must not be "
+"empty."
msgstr ""
-#: org/postgresql/copy/PGCopyInputStream.java:54
-#, java-format
-msgid "Copying from database failed: {0}"
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:188
+msgid ""
+"The system property containing the server's SSL certificate must not be "
+"empty."
+msgstr ""
+
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:195
+msgid ""
+"The sslfactoryarg property must start with the prefix file:, classpath:, "
+"env:, sys:, or -----BEGIN CERTIFICATE-----."
msgstr ""
-#: org/postgresql/copy/PGCopyInputStream.java:70
-#: org/postgresql/copy/PGCopyOutputStream.java:97
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:207
#, fuzzy
-msgid "This copy stream is closed."
-msgstr "Tento ResultSet je uzav�en�."
+msgid "An error occurred reading the certificate"
+msgstr "Nastala chyba p�i nastaven� SSL spojen�."
-#: org/postgresql/copy/PGCopyInputStream.java:113
-msgid "Read from copy failed."
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:240
+msgid "No X509TrustManager found"
msgstr ""
-#: org/postgresql/copy/PGCopyOutputStream.java:74
-#, java-format
-msgid "Cannot write to copy a byte of value {0}"
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:133
+msgid ""
+"Could not find a java cryptographic algorithm: X.509 CertificateFactory not "
+"available."
msgstr ""
-#: org/postgresql/core/ConnectionFactory.java:74
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:143
#, java-format
-msgid "A connection could not be made using the requested protocol {0}."
-msgstr "Spojen� nelze vytvo�it s pou�it�m ��dan�ho protokolu {0}."
+msgid "Could not open SSL certificate file {0}."
+msgstr ""
-#: org/postgresql/core/Oid.java:114
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:148
#, java-format
-msgid "oid type {0} not known and not a number"
+msgid "Loading the SSL certificate {0} into a KeyManager failed."
msgstr ""
-#: org/postgresql/core/Parser.java:616
-#, java-format
-msgid "Malformed function or procedure escape syntax at offset {0}."
-msgstr "Po�kozen� funkce nebo opu�t�n� procedury na pozici {0}."
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:205
+msgid "Enter SSL password: "
+msgstr ""
-#: org/postgresql/core/PGStream.java:497
-#, java-format
-msgid "Premature end of input stream, expected {0} bytes, but only read {1}."
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:212
+msgid "Could not read password for SSL key file, console is not available."
msgstr ""
-#: org/postgresql/core/PGStream.java:538
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:217
#, java-format
-msgid "Expected an EOF from server, got: {0}"
+msgid "Could not read password for SSL key file by callbackhandler {0}."
msgstr ""
-#: org/postgresql/core/SetupQueryRunner.java:90
-msgid "An unexpected result was returned by a query."
-msgstr "Obdr�en neo�ek�van� v�sledek dotazu."
-
-#: org/postgresql/core/UTF8Encoding.java:31
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:236
#, java-format
-msgid ""
-"Illegal UTF-8 sequence: byte {0} of {1} byte sequence is not 10xxxxxx: {2}"
+msgid "Could not decrypt SSL key file {0}."
msgstr ""
-#: org/postgresql/core/UTF8Encoding.java:69
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:250
#, java-format
-msgid "Illegal UTF-8 sequence: {0} bytes used to encode a {1} byte value: {2}"
+msgid "Could not read SSL key file {0}."
msgstr ""
-#: org/postgresql/core/UTF8Encoding.java:104
-#: org/postgresql/core/UTF8Encoding.java:131
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:253
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:176
#, java-format
-msgid "Illegal UTF-8 sequence: initial byte is {0}: {1}"
+msgid "Could not find a java cryptographic algorithm: {0}."
msgstr ""
-#: org/postgresql/core/UTF8Encoding.java:137
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:99
+#, fuzzy, java-format
+msgid "The password callback class provided {0} could not be instantiated."
+msgstr "T��da SSLSocketFactory poskytla {0} co� nem��e b�t instancionizov�no."
+
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:132
#, java-format
-msgid "Illegal UTF-8 sequence: final value is out of range: {0}"
+msgid "Could not open SSL root certificate file {0}."
msgstr ""
-#: org/postgresql/core/UTF8Encoding.java:153
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:147
#, java-format
-msgid "Illegal UTF-8 sequence: final value is a surrogate value: {0}"
+msgid "Could not read SSL root certificate file {0}."
msgstr ""
-#: org/postgresql/core/Utils.java:119 org/postgresql/core/Utils.java:136
-msgid "Zero bytes may not occur in string parameters."
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:151
+#, java-format
+msgid "Loading the SSL root certificate {0} into a TrustManager failed."
msgstr ""
-#: org/postgresql/core/Utils.java:146 org/postgresql/core/Utils.java:217
-msgid "No IOException expected from StringBuffer or StringBuilder"
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:170
+msgid "Could not initialize SSL context."
msgstr ""
-#: org/postgresql/core/Utils.java:206
-msgid "Zero bytes may not occur in identifiers."
-msgstr ""
+#: org/postgresql/ssl/MakeSSL.java:52
+#, java-format
+msgid "The SSLSocketFactory class provided {0} could not be instantiated."
+msgstr "T��da SSLSocketFactory poskytla {0} co� nem��e b�t instancionizov�no."
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:72
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:87
-#, fuzzy, java-format
-msgid "Invalid sslmode value: {0}"
-msgstr "Vadn� d�lka proudu {0}."
+#: org/postgresql/ssl/MakeSSL.java:67
+#, java-format
+msgid "SSL error: {0}"
+msgstr ""
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:87
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:111
+#: org/postgresql/ssl/MakeSSL.java:78
#, fuzzy, java-format
-msgid "Invalid targetServerType value: {0}"
-msgstr "Vadn� d�lka proudu {0}."
+msgid "The HostnameVerifier class provided {0} could not be instantiated."
+msgstr "T��da SSLSocketFactory poskytla {0} co� nem��e b�t instancionizov�no."
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:152
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:228
+#: org/postgresql/ssl/MakeSSL.java:84
#, java-format
-msgid "Could not find a server with specified targetServerType: {0}"
+msgid "The hostname {0} could not be verified by hostnameverifier {1}."
msgstr ""
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:172
-msgid ""
-"Connection refused. Check that the hostname and port are correct and that "
-"the postmaster is accepting TCP/IP connections."
+#: org/postgresql/ssl/MakeSSL.java:93
+#, java-format
+msgid "The hostname {0} could not be verified."
msgstr ""
-"Spojen� odm�tnuto. Zkontrolujte zda je jm�no hosta a port spr�vn� a zda "
-"postmaster p�ij�m� TCP/IP spojen�."
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:181
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:262
-msgid "The connection attempt failed."
-msgstr "Pokus o p�ipojen� selhal."
+#: org/postgresql/gss/GssAction.java:126
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2550
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2581
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2585
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2640
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2650
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2659
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:655
+msgid "Protocol error. Session setup failed."
+msgstr "Chyba protokolu. Nastaven� relace selhalo."
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:192
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:273
-#, fuzzy
-msgid "The connection url is invalid."
-msgstr "Pokus o p�ipojen� selhal."
+#: org/postgresql/gss/GssAction.java:137 org/postgresql/gss/MakeGSS.java:66
+#: org/postgresql/gss/MakeGSS.java:74
+msgid "GSS Authentication failed"
+msgstr ""
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:218
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:233
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:324
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:339
-msgid "The server does not support SSL."
-msgstr "Server nepodporuje SSL."
+#: org/postgresql/core/Parser.java:933
+#, java-format
+msgid "Malformed function or procedure escape syntax at offset {0}."
+msgstr "Po�kozen� funkce nebo opu�t�n� procedury na pozici {0}."
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:249
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:355
-msgid "An error occurred while setting up the SSL connection."
-msgstr "Nastala chyba p�i nastaven� SSL spojen�."
+#: org/postgresql/core/SocketFactoryFactory.java:41
+#, fuzzy, java-format
+msgid "The SocketFactory class provided {0} could not be instantiated."
+msgstr "T��da SSLSocketFactory poskytla {0} co� nem��e b�t instancionizov�no."
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:300
-#, java-format
-msgid "Connection rejected: {0}."
-msgstr "Spojen� odm�tnuto: {0}."
+#: org/postgresql/core/Utils.java:93 org/postgresql/core/Utils.java:110
+msgid "Zero bytes may not occur in string parameters."
+msgstr ""
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:321
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:349
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:375
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:456
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:486
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:515
-msgid ""
-"The server requested password-based authentication, but no password was "
-"provided."
-msgstr "Server vy�aduje ov��en� heslem, ale ��dn� nebylo posl�no."
+#: org/postgresql/core/Utils.java:120 org/postgresql/core/Utils.java:170
+msgid "No IOException expected from StringBuffer or StringBuilder"
+msgstr ""
+
+#: org/postgresql/core/Utils.java:159
+msgid "Zero bytes may not occur in identifiers."
+msgstr ""
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:405
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:625
+#: org/postgresql/core/UTF8Encoding.java:28
#, java-format
msgid ""
-"The authentication type {0} is not supported. Check that you have configured "
-"the pg_hba.conf file to include the client''s IP address or subnet, and that "
-"it is using an authentication scheme supported by the driver."
+"Illegal UTF-8 sequence: byte {0} of {1} byte sequence is not 10xxxxxx: {2}"
msgstr ""
-"Ov��en� typu {0} nen� podporov�no. Zkontrolujte zda konfigura�n� soubor "
-"pg_hba.conf obsahuje klientskou IP adresu �i pods� a zda je pou�it� "
-"ov��enovac� sch�ma podporov�no ovlada�em."
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:412
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:455
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:632
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:688
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:744
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:754
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:763
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:774
-#: org/postgresql/gss/GssAction.java:130
-msgid "Protocol error. Session setup failed."
-msgstr "Chyba protokolu. Nastaven� relace selhalo."
-
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:443
-#, java-format
-msgid "Backend start-up failed: {0}."
-msgstr "Selhal start backendu: {0}."
-
-#: org/postgresql/core/v2/FastpathParameterList.java:63
-#: org/postgresql/core/v2/FastpathParameterList.java:89
-#: org/postgresql/core/v2/FastpathParameterList.java:100
-#: org/postgresql/core/v2/FastpathParameterList.java:111
-#: org/postgresql/core/v2/SimpleParameterList.java:70
-#: org/postgresql/core/v2/SimpleParameterList.java:94
-#: org/postgresql/core/v2/SimpleParameterList.java:105
-#: org/postgresql/core/v2/SimpleParameterList.java:116
-#: org/postgresql/core/v2/SimpleParameterList.java:127
-#: org/postgresql/core/v3/CompositeParameterList.java:36
-#: org/postgresql/core/v3/SimpleParameterList.java:53
-#: org/postgresql/core/v3/SimpleParameterList.java:64
-#: org/postgresql/jdbc/PgResultSet.java:2715
-#: org/postgresql/jdbc/PgResultSetMetaData.java:472
+#: org/postgresql/core/UTF8Encoding.java:66
#, java-format
-msgid "The column index is out of range: {0}, number of columns: {1}."
-msgstr "Index sloupece je mimo rozsah: {0}, po�et sloupc�: {1}."
+msgid "Illegal UTF-8 sequence: {0} bytes used to encode a {1} byte value: {2}"
+msgstr ""
-#: org/postgresql/core/v2/FastpathParameterList.java:164
-#: org/postgresql/core/v2/SimpleParameterList.java:191
-#: org/postgresql/core/v3/SimpleParameterList.java:225
+#: org/postgresql/core/UTF8Encoding.java:102
+#: org/postgresql/core/UTF8Encoding.java:129
#, java-format
-msgid "No value specified for parameter {0}."
-msgstr "Nespecifikov�na hodnota parametru {0}."
+msgid "Illegal UTF-8 sequence: initial byte is {0}: {1}"
+msgstr ""
-#: org/postgresql/core/v2/QueryExecutorImpl.java:87
-#: org/postgresql/core/v2/QueryExecutorImpl.java:347
-#: org/postgresql/core/v3/QueryExecutorImpl.java:404
-#: org/postgresql/core/v3/QueryExecutorImpl.java:465
+#: org/postgresql/core/UTF8Encoding.java:135
#, java-format
-msgid "Expected command status BEGIN, got {0}."
-msgstr "O�ek�v�n p��kaz BEGIN, obdr�en {0}."
+msgid "Illegal UTF-8 sequence: final value is out of range: {0}"
+msgstr ""
-#: org/postgresql/core/v2/QueryExecutorImpl.java:92
-#: org/postgresql/core/v3/QueryExecutorImpl.java:470
-#: org/postgresql/jdbc/PgResultSet.java:1731
+#: org/postgresql/core/UTF8Encoding.java:151
#, java-format
-msgid "Unexpected command status: {0}."
-msgstr "Neo�ek�van� stav p��kazu: {0}."
+msgid "Illegal UTF-8 sequence: final value is a surrogate value: {0}"
+msgstr ""
-#: org/postgresql/core/v2/QueryExecutorImpl.java:127
-#: org/postgresql/core/v2/QueryExecutorImpl.java:136
-#: org/postgresql/core/v2/QueryExecutorImpl.java:185
-#: org/postgresql/core/v2/QueryExecutorImpl.java:376
-#: org/postgresql/core/v3/QueryExecutorImpl.java:226
-#: org/postgresql/core/v3/QueryExecutorImpl.java:364
-#: org/postgresql/core/v3/QueryExecutorImpl.java:441
-#: org/postgresql/core/v3/QueryExecutorImpl.java:505
-#: org/postgresql/core/v3/QueryExecutorImpl.java:587
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2211
-#: org/postgresql/util/StreamWrapper.java:133
-msgid "An I/O error occurred while sending to the backend."
-msgstr "Vystupn�/v�stupn� chyba p�i odes�l�n� k backend."
+#: org/postgresql/core/SetupQueryRunner.java:64
+msgid "An unexpected result was returned by a query."
+msgstr "Obdr�en neo�ek�van� v�sledek dotazu."
-#: org/postgresql/core/v2/QueryExecutorImpl.java:180
-#: org/postgresql/core/v2/QueryExecutorImpl.java:235
-#: org/postgresql/core/v2/QueryExecutorImpl.java:249
-#: org/postgresql/core/v3/QueryExecutorImpl.java:582
-#: org/postgresql/core/v3/QueryExecutorImpl.java:642
+#: org/postgresql/core/PGStream.java:486
#, java-format
-msgid "Unknown Response Type {0}."
-msgstr "Nezn�m� typ odpov�di {0}."
-
-#: org/postgresql/core/v2/QueryExecutorImpl.java:453
-#: org/postgresql/core/v2/QueryExecutorImpl.java:503
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1962
-msgid "Ran out of memory retrieving query results."
+msgid "Premature end of input stream, expected {0} bytes, but only read {1}."
msgstr ""
-#: org/postgresql/core/v2/QueryExecutorImpl.java:640
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2328
+#: org/postgresql/core/PGStream.java:528
#, java-format
-msgid "Unable to interpret the update count in command completion tag: {0}."
-msgstr ""
-
-#: org/postgresql/core/v2/QueryExecutorImpl.java:654
-msgid "Copy not implemented for protocol version 2"
+msgid "Expected an EOF from server, got: {0}"
msgstr ""
-#: org/postgresql/core/v2/SocketFactoryFactory.java:36
-#, fuzzy, java-format
-msgid "The SocketFactory class provided {0} could not be instantiated."
-msgstr "T��da SSLSocketFactory poskytla {0} co� nem��e b�t instancionizov�no."
-
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:253
-#, fuzzy, java-format
-msgid ""
-"Connection to {0} refused. Check that the hostname and port are correct and "
-"that the postmaster is accepting TCP/IP connections."
+#: org/postgresql/core/v3/CopyOperationImpl.java:54
+msgid "CommandComplete expected COPY but got: "
msgstr ""
-"Spojen� odm�tnuto. Zkontrolujte zda je jm�no hosta a port spr�vn� a zda "
-"postmaster p�ij�m� TCP/IP spojen�."
-#: org/postgresql/core/v3/CopyOperationImpl.java:57
-msgid "CommandComplete expected COPY but got: "
+#: org/postgresql/core/v3/CopyInImpl.java:47
+msgid "CopyIn copy direction can't receive data"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:83
+#: org/postgresql/core/v3/QueryExecutorImpl.java:161
msgid "Tried to obtain lock while already holding it"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:98
+#: org/postgresql/core/v3/QueryExecutorImpl.java:177
msgid "Tried to break lock on database connection"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:115
+#: org/postgresql/core/v3/QueryExecutorImpl.java:195
#, fuzzy
msgid "Interrupted while waiting to obtain lock on database connection"
msgstr "Nastala chyba p�i nastaven� SSL spojen�."
-#: org/postgresql/core/v3/QueryExecutorImpl.java:220
+#: org/postgresql/core/v3/QueryExecutorImpl.java:327
msgid "Unable to bind parameter values for statement."
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:689
+#: org/postgresql/core/v3/QueryExecutorImpl.java:333
+#: org/postgresql/core/v3/QueryExecutorImpl.java:485
+#: org/postgresql/core/v3/QueryExecutorImpl.java:559
+#: org/postgresql/core/v3/QueryExecutorImpl.java:602
+#: org/postgresql/core/v3/QueryExecutorImpl.java:729
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2372
+#: org/postgresql/util/StreamWrapper.java:130
+msgid "An I/O error occurred while sending to the backend."
+msgstr "Vystupn�/v�stupn� chyba p�i odes�l�n� k backend."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:534
+#: org/postgresql/core/v3/QueryExecutorImpl.java:576
+#, java-format
+msgid "Expected command status BEGIN, got {0}."
+msgstr "O�ek�v�n p��kaz BEGIN, obdr�en {0}."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:581
+#: org/postgresql/jdbc/PgResultSet.java:1778
+#, java-format
+msgid "Unexpected command status: {0}."
+msgstr "Neo�ek�van� stav p��kazu: {0}."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:687
+#, fuzzy
+msgid "An error occurred while trying to get the socket timeout."
+msgstr "Vystupn�/v�stupn� chyba p�i odes�l�n� k backend."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:722
+#: org/postgresql/core/v3/QueryExecutorImpl.java:798
+#, java-format
+msgid "Unknown Response Type {0}."
+msgstr "Nezn�m� typ odpov�di {0}."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:745
+#, fuzzy
+msgid "An error occurred while trying to reset the socket timeout."
+msgstr "Vystupn�/v�stupn� chyba p�i odes�l�n� k backend."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:843
msgid "Database connection failed when starting copy"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:724
+#: org/postgresql/core/v3/QueryExecutorImpl.java:878
msgid "Tried to cancel an inactive copy operation"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:765
+#: org/postgresql/core/v3/QueryExecutorImpl.java:917
msgid "Database connection failed when canceling copy operation"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:781
+#: org/postgresql/core/v3/QueryExecutorImpl.java:933
msgid "Missing expected error response to copy cancel request"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:785
+#: org/postgresql/core/v3/QueryExecutorImpl.java:937
#, java-format
msgid "Got {0} error responses to single copy cancel request"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:800
+#: org/postgresql/core/v3/QueryExecutorImpl.java:952
msgid "Tried to end inactive copy"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:815
+#: org/postgresql/core/v3/QueryExecutorImpl.java:967
msgid "Database connection failed when ending copy"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:833
-#: org/postgresql/core/v3/QueryExecutorImpl.java:855
+#: org/postgresql/core/v3/QueryExecutorImpl.java:985
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1005
msgid "Tried to write to an inactive copy operation"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:848
-#: org/postgresql/core/v3/QueryExecutorImpl.java:863
+#: org/postgresql/core/v3/QueryExecutorImpl.java:998
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1013
msgid "Database connection failed when writing to copy"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:877
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1028
msgid "Tried to read from inactive copy"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:884
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1035
msgid "Database connection failed when reading from copy"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:956
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1101
#, java-format
msgid "Received CommandComplete ''{0}'' without an active copy operation"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:983
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1126
#, java-format
msgid "Got CopyInResponse from server during an active {0}"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:999
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1140
#, java-format
msgid "Got CopyOutResponse from server during an active {0}"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1017
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1154
+#, java-format
+msgid "Got CopyBothResponse from server during an active {0}"
+msgstr ""
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1170
msgid "Got CopyData without an active copy operation"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1021
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1174
#, fuzzy, java-format
msgid "Unexpected copydata from server for {0}"
msgstr "Neo�ek�van� stav p��kazu: {0}."
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1061
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2037
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1234
+#, java-format
+msgid "Unexpected packet type during copy: {0}"
+msgstr ""
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1524
+#, java-format
+msgid ""
+"Bind message length {0} too long. This can be caused by very large or "
+"incorrect length specifications on InputStream parameters."
+msgstr ""
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2145
+msgid "Ran out of memory retrieving query results."
+msgstr ""
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2313
+msgid "The driver currently does not support COPY operations."
+msgstr "Ovlada� nyn� nepodporuje p��kaz COPY."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2487
+#, java-format
+msgid "Unable to parse the count in command completion tag: {0}."
+msgstr ""
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2603
#, java-format
msgid ""
"The server''s client_encoding parameter was changed to {0}. The JDBC driver "
"requires client_encoding to be UTF8 for correct operation."
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1069
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2045
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2611
#, java-format
msgid ""
"The server''s DateStyle parameter was changed to {0}. The JDBC driver "
"requires DateStyle to begin with ISO for correct operation."
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1083
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2059
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2624
#, java-format
msgid ""
"The server''s standard_conforming_strings parameter was reported as {0}. The "
"JDBC driver expected on or off."
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1122
+#: org/postgresql/core/v3/SimpleParameterList.java:54
+#: org/postgresql/core/v3/SimpleParameterList.java:65
+#: org/postgresql/core/v3/CompositeParameterList.java:33
+#: org/postgresql/jdbc/PgResultSetMetaData.java:493
+#: org/postgresql/jdbc/PgResultSet.java:2751
#, java-format
-msgid "Unexpected packet type during copy: {0}"
-msgstr ""
+msgid "The column index is out of range: {0}, number of columns: {1}."
+msgstr "Index sloupece je mimo rozsah: {0}, po�et sloupc�: {1}."
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1393
+#: org/postgresql/core/v3/SimpleParameterList.java:257
#, java-format
-msgid ""
-"Bind message length {0} too long. This can be caused by very large or "
-"incorrect length specifications on InputStream parameters."
-msgstr ""
-
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2131
-msgid "The driver currently does not support COPY operations."
-msgstr "Ovlada� nyn� nepodporuje p��kaz COPY."
-
-#: org/postgresql/Driver.java:234
-msgid "Error loading default settings from driverconfig.properties"
-msgstr "Chyba na��t�n� standardn�ho nastaven� z driverconfig.properties"
+msgid "No value specified for parameter {0}."
+msgstr "Nespecifikov�na hodnota parametru {0}."
-#: org/postgresql/Driver.java:247
-msgid "Properties for the driver contains a non-string value for the key "
-msgstr ""
+#: org/postgresql/core/v3/SimpleParameterList.java:431
+#, fuzzy, java-format
+msgid "Added parameters index out of range: {0}, number of columns: {1}."
+msgstr "Index parametru mimo rozsah: {0}, po�et parametr� {1}."
-#: org/postgresql/Driver.java:290
-msgid ""
-"Your security policy has prevented the connection from being attempted. You "
-"probably need to grant the connect java.net.SocketPermission to the database "
-"server host and port that you wish to connect to."
-msgstr ""
+#: org/postgresql/core/v3/replication/V3ReplicationProtocol.java:133
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:257
+msgid "The connection attempt failed."
+msgstr "Pokus o p�ipojen� selhal."
-#: org/postgresql/Driver.java:296 org/postgresql/Driver.java:362
-msgid ""
-"Something unusual has occurred to cause the driver to fail. Please report "
-"this exception."
+#: org/postgresql/core/v3/replication/V3PGReplicationStream.java:144
+#, java-format
+msgid "Unexpected packet type during replication: {0}"
msgstr ""
-"N�co neobvykl�ho p�inutilo ovlada� selhat. Pros�m nahlaste tuto vyj�mku."
-#: org/postgresql/Driver.java:370
+#: org/postgresql/core/v3/replication/V3PGReplicationStream.java:269
#, fuzzy
-msgid "Connection attempt timed out."
-msgstr "Pokus o p�ipojen� selhal."
+msgid "This replication stream has been closed."
+msgstr "Spojeni bylo uzav�eno."
-#: org/postgresql/Driver.java:383
-#, fuzzy
-msgid "Interrupted while attempting to connect."
-msgstr "Nastala chyba p�i nastaven� SSL spojen�."
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:109
+#, fuzzy, java-format
+msgid "Invalid sslmode value: {0}"
+msgstr "Vadn� d�lka proudu {0}."
+
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:124
+#, fuzzy, java-format
+msgid "Invalid targetServerType value: {0}"
+msgstr "Vadn� d�lka proudu {0}."
+
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:246
+#, fuzzy, java-format
+msgid ""
+"Connection to {0} refused. Check that the hostname and port are correct and "
+"that the postmaster is accepting TCP/IP connections."
+msgstr ""
+"Spojen� odm�tnuto. Zkontrolujte zda je jm�no hosta a port spr�vn� a zda "
+"postmaster p�ij�m� TCP/IP spojen�."
-#: org/postgresql/Driver.java:645
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:272
#, java-format
-msgid "Method {0} is not yet implemented."
-msgstr "Metoda {0} nen� implementov�na."
+msgid "Could not find a server with specified targetServerType: {0}"
+msgstr ""
+
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:366
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:379
+msgid "The server does not support SSL."
+msgstr "Server nepodporuje SSL."
+
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:393
+msgid "An error occurred while setting up the SSL connection."
+msgstr "Nastala chyba p�i nastaven� SSL spojen�."
+
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:494
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:521
+msgid ""
+"The server requested password-based authentication, but no password was "
+"provided."
+msgstr "Server vy�aduje ov��en� heslem, ale ��dn� nebylo posl�no."
+
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:624
+msgid ""
+"SCRAM authentication is not supported by this driver. You need JDK >= 8 and "
+"pgjdbc >= 42.2.0 (not \".jre\" vesions)"
+msgstr ""
+
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:648
+#, java-format
+msgid ""
+"The authentication type {0} is not supported. Check that you have configured "
+"the pg_hba.conf file to include the client''s IP address or subnet, and that "
+"it is using an authentication scheme supported by the driver."
+msgstr ""
+"Ov��en� typu {0} nen� podporov�no. Zkontrolujte zda konfigura�n� soubor "
+"pg_hba.conf obsahuje klientskou IP adresu �i pods� a zda je pou�it� "
+"ov��enovac� sch�ma podporov�no ovlada�em."
+
+#: org/postgresql/core/ConnectionFactory.java:57
+#, java-format
+msgid "A connection could not be made using the requested protocol {0}."
+msgstr "Spojen� nelze vytvo�it s pou�it�m ��dan�ho protokolu {0}."
+
+#: org/postgresql/core/Oid.java:116
+#, java-format
+msgid "oid type {0} not known and not a number"
+msgstr ""
+
+#: org/postgresql/util/HStoreConverter.java:43
+#: org/postgresql/util/HStoreConverter.java:74
+#: org/postgresql/jdbc/PgArray.java:210
+#: org/postgresql/jdbc/PgResultSet.java:1924
+msgid ""
+"Invalid character data was found. This is most likely caused by stored data "
+"containing characters that are invalid for the character set the database "
+"was created in. The most common example of this is storing 8bit data in a "
+"SQL_ASCII database."
+msgstr ""
+"Nalezena vada ve znakov�ch datech. Toto m��e b�t zp�sobeno ulo�en�mi daty "
+"obsahuj�c�mi znaky, kter� jsou z�vadn� pro znakovou sadu nastavenou p�i "
+"zakl�d�n� datab�ze. Nejzn�mej�� p��klad je ukl�d�n� 8bitov�ch dat vSQL_ASCII "
+"datab�zi."
+
+#: org/postgresql/util/PGmoney.java:62
+msgid "Conversion of money failed."
+msgstr "P�evod pen�z selhal."
+
+#: org/postgresql/util/StreamWrapper.java:56
+#: org/postgresql/jdbc/PgPreparedStatement.java:1449
+msgid "Object is too large to send over the protocol."
+msgstr ""
+
+#: org/postgresql/util/PGInterval.java:152
+#, fuzzy
+msgid "Conversion of interval failed"
+msgstr "P�evod pen�z selhal."
+
+#: org/postgresql/util/ServerErrorMessage.java:45
+#, java-format
+msgid ""
+" (pgjdbc: autodetected server-encoding to be {0}, if the message is not "
+"readable, please check database logs and/or host, port, dbname, user, "
+"password, pg_hba.conf)"
+msgstr ""
+
+#: org/postgresql/util/ServerErrorMessage.java:176
+#, java-format
+msgid "Detail: {0}"
+msgstr "Detail: {0}"
-#: org/postgresql/ds/common/BaseDataSource.java:1037
-#: org/postgresql/ds/common/BaseDataSource.java:1047
+#: org/postgresql/util/ServerErrorMessage.java:181
+#, java-format
+msgid "Hint: {0}"
+msgstr "Rada: {0}"
+
+#: org/postgresql/util/ServerErrorMessage.java:185
+#, java-format
+msgid "Position: {0}"
+msgstr "Pozice: {0}"
+
+#: org/postgresql/util/ServerErrorMessage.java:189
+#, java-format
+msgid "Where: {0}"
+msgstr "Kde: {0}"
+
+#: org/postgresql/util/ServerErrorMessage.java:195
+#, java-format
+msgid "Internal Query: {0}"
+msgstr ""
+
+#: org/postgresql/util/ServerErrorMessage.java:199
+#, fuzzy, java-format
+msgid "Internal Position: {0}"
+msgstr "Pozice: {0}"
+
+#: org/postgresql/util/ServerErrorMessage.java:206
+#, java-format
+msgid "Location: File: {0}, Routine: {1}, Line: {2}"
+msgstr "Poloha: Soubor: {0}, Rutina: {1}, ��dek: {2}"
+
+#: org/postgresql/util/ServerErrorMessage.java:211
+#, java-format
+msgid "Server SQLState: {0}"
+msgstr "Server SQLState: {0}"
+
+#: org/postgresql/ds/PGPoolingDataSource.java:269
+msgid "Failed to setup DataSource."
+msgstr ""
+
+#: org/postgresql/ds/PGPoolingDataSource.java:371
+msgid "DataSource has been closed."
+msgstr "DataSource byl uzav�en."
+
+#: org/postgresql/ds/common/BaseDataSource.java:1132
+#: org/postgresql/ds/common/BaseDataSource.java:1142
#, fuzzy, java-format
msgid "Unsupported property name: {0}"
msgstr "Nepodporovan� hodnota typu: {0}"
@@ -480,1068 +601,1069 @@ msgstr "Nepodporovan
msgid "This PooledConnection has already been closed."
msgstr "Tento PooledConnection byl uzav�en."
-#: org/postgresql/ds/PGPooledConnection.java:313
+#: org/postgresql/ds/PGPooledConnection.java:314
msgid ""
"Connection has been closed automatically because a new connection was opened "
"for the same PooledConnection or the PooledConnection has been closed."
msgstr ""
-#: org/postgresql/ds/PGPooledConnection.java:314
+#: org/postgresql/ds/PGPooledConnection.java:315
msgid "Connection has been closed."
msgstr "Spojeni bylo uzav�eno."
-#: org/postgresql/ds/PGPooledConnection.java:418
+#: org/postgresql/ds/PGPooledConnection.java:420
msgid "Statement has been closed."
msgstr "Statement byl uzav�en."
-#: org/postgresql/ds/PGPoolingDataSource.java:269
-msgid "Failed to setup DataSource."
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:68
+msgid "No SCRAM mechanism(s) advertised by the server"
msgstr ""
-#: org/postgresql/ds/PGPoolingDataSource.java:371
-msgid "DataSource has been closed."
-msgstr "DataSource byl uzav�en."
-
-#: org/postgresql/fastpath/Fastpath.java:82
-#, java-format
-msgid "Fastpath call {0} - No result was returned and we expected a numeric."
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:81
+msgid "Invalid or unsupported by client SCRAM mechanisms"
msgstr ""
-#: org/postgresql/fastpath/Fastpath.java:165
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:117
+#, fuzzy, java-format
+msgid "Invalid server-first-message: {0}"
+msgstr "Vadn� d�lka proudu {0}."
+
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:147
+#, fuzzy, java-format
+msgid "Invalid server-final-message: {0}"
+msgstr "Vadn� d�lka proudu {0}."
+
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:153
#, java-format
-msgid "Fastpath call {0} - No result was returned and we expected an integer."
+msgid "SCRAM authentication failed, server returned error: {0}"
msgstr ""
-#: org/postgresql/fastpath/Fastpath.java:174
-#, java-format
-msgid ""
-"Fastpath call {0} - No result was returned or wrong size while expecting an "
-"integer."
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:160
+msgid "Invalid server SCRAM signature"
msgstr ""
-#: org/postgresql/fastpath/Fastpath.java:191
+#: org/postgresql/osgi/PGDataSourceFactory.java:82
#, fuzzy, java-format
-msgid "Fastpath call {0} - No result was returned and we expected a long."
-msgstr "Obdr�en v�sledek, ikdy� ��dn� nebyl o�ek�v�n."
+msgid "Unsupported properties: {0}"
+msgstr "Nepodporovan� hodnota typu: {0}"
-#: org/postgresql/fastpath/Fastpath.java:200
-#, java-format
+#: org/postgresql/Driver.java:214
+msgid "Error loading default settings from driverconfig.properties"
+msgstr "Chyba na��t�n� standardn�ho nastaven� z driverconfig.properties"
+
+#: org/postgresql/Driver.java:226
+msgid "Properties for the driver contains a non-string value for the key "
+msgstr ""
+
+#: org/postgresql/Driver.java:270
msgid ""
-"Fastpath call {0} - No result was returned or wrong size while expecting a "
-"long."
+"Your security policy has prevented the connection from being attempted. You "
+"probably need to grant the connect java.net.SocketPermission to the database "
+"server host and port that you wish to connect to."
msgstr ""
-#: org/postgresql/fastpath/Fastpath.java:312
-#, java-format
-msgid "The fastpath function {0} is unknown."
+#: org/postgresql/Driver.java:276 org/postgresql/Driver.java:408
+msgid ""
+"Something unusual has occurred to cause the driver to fail. Please report "
+"this exception."
msgstr ""
+"N�co neobvykl�ho p�inutilo ovlada� selhat. Pros�m nahlaste tuto vyj�mku."
+
+#: org/postgresql/Driver.java:416
+#, fuzzy
+msgid "Connection attempt timed out."
+msgstr "Pokus o p�ipojen� selhal."
+
+#: org/postgresql/Driver.java:429
+#, fuzzy
+msgid "Interrupted while attempting to connect."
+msgstr "Nastala chyba p�i nastaven� SSL spojen�."
-#: org/postgresql/geometric/PGbox.java:79
-#: org/postgresql/geometric/PGcircle.java:76
-#: org/postgresql/geometric/PGcircle.java:84
-#: org/postgresql/geometric/PGline.java:109
-#: org/postgresql/geometric/PGline.java:118
-#: org/postgresql/geometric/PGlseg.java:72
-#: org/postgresql/geometric/PGpoint.java:78
+#: org/postgresql/Driver.java:682
+#, java-format
+msgid "Method {0} is not yet implemented."
+msgstr "Metoda {0} nen� implementov�na."
+
+#: org/postgresql/geometric/PGlseg.java:70
+#: org/postgresql/geometric/PGline.java:107
+#: org/postgresql/geometric/PGline.java:116
+#: org/postgresql/geometric/PGcircle.java:74
+#: org/postgresql/geometric/PGcircle.java:82
+#: org/postgresql/geometric/PGpoint.java:76
+#: org/postgresql/geometric/PGbox.java:77
#, java-format
msgid "Conversion to type {0} failed: {1}."
msgstr ""
-#: org/postgresql/geometric/PGpath.java:73
+#: org/postgresql/geometric/PGpath.java:70
#, java-format
msgid "Cannot tell if path is open or closed: {0}."
msgstr ""
-#: org/postgresql/gss/GssAction.java:141 org/postgresql/gss/MakeGSS.java:69
-#: org/postgresql/gss/MakeGSS.java:77
-msgid "GSS Authentication failed"
+#: org/postgresql/xa/PGXAConnection.java:128
+msgid ""
+"Transaction control methods setAutoCommit(true), commit, rollback and "
+"setSavePoint not allowed while an XA transaction is active."
msgstr ""
-#: org/postgresql/jdbc/AbstractBlobClob.java:89
-msgid ""
-"Truncation of large objects is only implemented in 8.3 and later servers."
+#: org/postgresql/xa/PGXAConnection.java:177
+#: org/postgresql/xa/PGXAConnection.java:253
+#: org/postgresql/xa/PGXAConnection.java:347
+#, fuzzy, java-format
+msgid "Invalid flags {0}"
+msgstr "Vadn� d�lka proudu {0}."
+
+#: org/postgresql/xa/PGXAConnection.java:181
+#: org/postgresql/xa/PGXAConnection.java:257
+#: org/postgresql/xa/PGXAConnection.java:449
+msgid "xid must not be null"
msgstr ""
-#: org/postgresql/jdbc/AbstractBlobClob.java:94
-msgid "Cannot truncate LOB to a negative length."
+#: org/postgresql/xa/PGXAConnection.java:185
+msgid "Connection is busy with another transaction"
msgstr ""
-#: org/postgresql/jdbc/AbstractBlobClob.java:101
-#: org/postgresql/jdbc/AbstractBlobClob.java:245
+#: org/postgresql/xa/PGXAConnection.java:194
+#: org/postgresql/xa/PGXAConnection.java:267
+msgid "suspend/resume not implemented"
+msgstr ""
+
+#: org/postgresql/xa/PGXAConnection.java:202
+#: org/postgresql/xa/PGXAConnection.java:209
+#: org/postgresql/xa/PGXAConnection.java:213
#, java-format
-msgid "PostgreSQL LOBs can only index to: {0}"
+msgid ""
+"Invalid protocol state requested. Attempted transaction interleaving is not "
+"supported. xid={0}, currentXid={1}, state={2}, flags={3}"
msgstr ""
-#: org/postgresql/jdbc/AbstractBlobClob.java:241
-msgid "LOB positioning offsets start at 1."
-msgstr "Za��tek pozicov�n� LOB za��na na 1."
+#: org/postgresql/xa/PGXAConnection.java:224
+msgid "Error disabling autocommit"
+msgstr ""
-#: org/postgresql/jdbc/AbstractBlobClob.java:257
-msgid "free() was called on this LOB previously"
+#: org/postgresql/xa/PGXAConnection.java:261
+#, java-format
+msgid ""
+"tried to call end without corresponding start call. state={0}, start "
+"xid={1}, currentXid={2}, preparedXid={3}"
msgstr ""
-#: org/postgresql/jdbc/BatchResultHandler.java:41
-#: org/postgresql/jdbc/PgConnection.java:474
-#: org/postgresql/jdbc/PgPreparedStatement.java:138
-#: org/postgresql/jdbc/PgStatement.java:299
-msgid "A result was returned when none was expected."
-msgstr "Obdr�en v�sledek, ikdy� ��dn� nebyl o�ek�v�n."
+#: org/postgresql/xa/PGXAConnection.java:297
+#, java-format
+msgid ""
+"Preparing already prepared transaction, the prepared xid {0}, prepare xid={1}"
+msgstr ""
-#: org/postgresql/jdbc/BatchResultHandler.java:59
-msgid "Too many update results were returned."
-msgstr "Bylo vr�ceno p��li� mnoho v�sledk� aktualizac�."
+#: org/postgresql/xa/PGXAConnection.java:300
+#, java-format
+msgid "Current connection does not have an associated xid. prepare xid={0}"
+msgstr ""
-#: org/postgresql/jdbc/BatchResultHandler.java:88
+#: org/postgresql/xa/PGXAConnection.java:307
#, java-format
msgid ""
-"Batch entry {0} {1} was aborted. Call getNextException to see the cause."
+"Not implemented: Prepare must be issued using the same connection that "
+"started the transaction. currentXid={0}, prepare xid={1}"
msgstr ""
-#: org/postgresql/jdbc/EscapedFunctions.java:243
+#: org/postgresql/xa/PGXAConnection.java:311
#, java-format
-msgid "{0} function takes four and only four argument."
-msgstr "Funkce {0} bere p�esn� �ty�i argumenty."
+msgid "Prepare called before end. prepare xid={0}, state={1}"
+msgstr ""
-#: org/postgresql/jdbc/EscapedFunctions.java:273
-#: org/postgresql/jdbc/EscapedFunctions.java:347
-#: org/postgresql/jdbc/EscapedFunctions.java:752
-#: org/postgresql/jdbc/EscapedFunctions.java:790
+#: org/postgresql/xa/PGXAConnection.java:331
#, java-format
-msgid "{0} function takes two and only two arguments."
-msgstr "Funkce {0} bere pr�v� dva argumenty."
+msgid "Error preparing transaction. prepare xid={0}"
+msgstr ""
-#: org/postgresql/jdbc/EscapedFunctions.java:291
-#: org/postgresql/jdbc/EscapedFunctions.java:329
-#: org/postgresql/jdbc/EscapedFunctions.java:449
-#: org/postgresql/jdbc/EscapedFunctions.java:464
-#: org/postgresql/jdbc/EscapedFunctions.java:479
-#: org/postgresql/jdbc/EscapedFunctions.java:494
-#: org/postgresql/jdbc/EscapedFunctions.java:509
-#: org/postgresql/jdbc/EscapedFunctions.java:524
-#: org/postgresql/jdbc/EscapedFunctions.java:539
-#: org/postgresql/jdbc/EscapedFunctions.java:554
-#: org/postgresql/jdbc/EscapedFunctions.java:569
-#: org/postgresql/jdbc/EscapedFunctions.java:584
-#: org/postgresql/jdbc/EscapedFunctions.java:599
-#: org/postgresql/jdbc/EscapedFunctions.java:614
-#: org/postgresql/jdbc/EscapedFunctions.java:778
-#, java-format
-msgid "{0} function takes one and only one argument."
-msgstr "Funkce {0} bere jeden argument."
+#: org/postgresql/xa/PGXAConnection.java:382
+msgid "Error during recover"
+msgstr ""
-#: org/postgresql/jdbc/EscapedFunctions.java:313
-#: org/postgresql/jdbc/EscapedFunctions.java:394
+#: org/postgresql/xa/PGXAConnection.java:438
#, java-format
-msgid "{0} function takes two or three arguments."
-msgstr "Funkce {0} bere dva nebo t�i argumenty."
+msgid ""
+"Error rolling back prepared transaction. rollback xid={0}, preparedXid={1}, "
+"currentXid={2}"
+msgstr ""
-#: org/postgresql/jdbc/EscapedFunctions.java:419
-#: org/postgresql/jdbc/EscapedFunctions.java:434
-#: org/postgresql/jdbc/EscapedFunctions.java:737
-#: org/postgresql/jdbc/EscapedFunctions.java:767
+#: org/postgresql/xa/PGXAConnection.java:471
#, java-format
-msgid "{0} function doesn''t take any argument."
-msgstr "Funkce {0} nebere ��dn� argument."
+msgid ""
+"One-phase commit called for xid {0} but connection was prepared with xid {1}"
+msgstr ""
-#: org/postgresql/jdbc/EscapedFunctions.java:630
-#: org/postgresql/jdbc/EscapedFunctions.java:683
-#, fuzzy, java-format
-msgid "{0} function takes three and only three arguments."
-msgstr "Funkce {0} bere pr�v� dva argumenty."
+#: org/postgresql/xa/PGXAConnection.java:479
+msgid ""
+"Not implemented: one-phase commit must be issued using the same connection "
+"that was used to start it"
+msgstr ""
-#: org/postgresql/jdbc/EscapedFunctions.java:643
-#: org/postgresql/jdbc/EscapedFunctions.java:664
-#: org/postgresql/jdbc/EscapedFunctions.java:667
-#: org/postgresql/jdbc/EscapedFunctions.java:700
-#: org/postgresql/jdbc/EscapedFunctions.java:713
-#: org/postgresql/jdbc/EscapedFunctions.java:716
-#, fuzzy, java-format
-msgid "Interval {0} not yet implemented"
-msgstr "Metoda {0} nen� implementov�na."
+#: org/postgresql/xa/PGXAConnection.java:483
+#, java-format
+msgid "One-phase commit with unknown xid. commit xid={0}, currentXid={1}"
+msgstr ""
-#: org/postgresql/jdbc/PgArray.java:166 org/postgresql/jdbc/PgArray.java:822
+#: org/postgresql/xa/PGXAConnection.java:487
#, java-format
-msgid "The array index is out of range: {0}"
-msgstr "Index pole mimo rozsah: {0}"
+msgid "commit called before end. commit xid={0}, state={1}"
+msgstr ""
-#: org/postgresql/jdbc/PgArray.java:183 org/postgresql/jdbc/PgArray.java:839
+#: org/postgresql/xa/PGXAConnection.java:498
#, java-format
-msgid "The array index is out of range: {0}, number of elements: {1}."
-msgstr "Index pole mimo rozsah: {0}, po�et prvk�: {1}."
+msgid "Error during one-phase commit. commit xid={0}"
+msgstr ""
-#: org/postgresql/jdbc/PgArray.java:215
-#: org/postgresql/jdbc/PgResultSet.java:1885
-#: org/postgresql/util/HStoreConverter.java:38
-#: org/postgresql/util/HStoreConverter.java:69
+#: org/postgresql/xa/PGXAConnection.java:517
msgid ""
-"Invalid character data was found. This is most likely caused by stored data "
-"containing characters that are invalid for the character set the database "
-"was created in. The most common example of this is storing 8bit data in a "
-"SQL_ASCII database."
+"Not implemented: 2nd phase commit must be issued using an idle connection. "
+"commit xid={0}, currentXid={1}, state={2], transactionState={3}"
msgstr ""
-"Nalezena vada ve znakov�ch datech. Toto m��e b�t zp�sobeno ulo�en�mi daty "
-"obsahuj�c�mi znaky, kter� jsou z�vadn� pro znakovou sadu nastavenou p�i "
-"zakl�d�n� datab�ze. Nejzn�mej�� p��klad je ukl�d�n� 8bitov�ch dat vSQL_ASCII "
-"datab�zi."
-#: org/postgresql/jdbc/PgCallableStatement.java:90
-#: org/postgresql/jdbc/PgCallableStatement.java:96
-msgid "A CallableStatement was executed with nothing returned."
-msgstr "CallableStatement byl spu�t�n, le� nic nebylo vr�ceno."
+#: org/postgresql/xa/PGXAConnection.java:550
+#, java-format
+msgid ""
+"Error committing prepared transaction. commit xid={0}, preparedXid={1}, "
+"currentXid={2}"
+msgstr ""
-#: org/postgresql/jdbc/PgCallableStatement.java:107
+#: org/postgresql/xa/PGXAConnection.java:567
+#, java-format
+msgid "Heuristic commit/rollback not supported. forget xid={0}"
+msgstr ""
+
+#: org/postgresql/jdbc/PgSQLXML.java:147
+msgid "Unable to decode xml data."
+msgstr ""
+
+#: org/postgresql/jdbc/PgSQLXML.java:150
+#, java-format
+msgid "Unknown XML Source class: {0}"
+msgstr ""
+
+#: org/postgresql/jdbc/PgSQLXML.java:193
#, fuzzy
-msgid "A CallableStatement was executed with an invalid number of parameters"
-msgstr "CallableStatement byl spu�t�n, le� nic nebylo vr�ceno."
+msgid "Unable to create SAXResult for SQLXML."
+msgstr "Selhalo vytvo�en� objektu: {0}."
-#: org/postgresql/jdbc/PgCallableStatement.java:139
+#: org/postgresql/jdbc/PgSQLXML.java:208
+msgid "Unable to create StAXResult for SQLXML"
+msgstr ""
+
+#: org/postgresql/jdbc/PgSQLXML.java:213
#, java-format
-msgid ""
-"A CallableStatement function was executed and the out parameter {0} was of "
-"type {1} however type {2} was registered."
+msgid "Unknown XML Result class: {0}"
msgstr ""
-#: org/postgresql/jdbc/PgCallableStatement.java:195
+#: org/postgresql/jdbc/PgSQLXML.java:225
+#, fuzzy
+msgid "This SQLXML object has already been freed."
+msgstr "Tento PooledConnection byl uzav�en."
+
+#: org/postgresql/jdbc/PgSQLXML.java:234
msgid ""
-"This statement does not declare an OUT parameter. Use '{' ?= call ... '}' "
-"to declare one."
+"This SQLXML object has not been initialized, so you cannot retrieve data "
+"from it."
msgstr ""
-#: org/postgresql/jdbc/PgCallableStatement.java:239
-msgid "wasNull cannot be call before fetching a result."
+#: org/postgresql/jdbc/PgSQLXML.java:247
+#, java-format
+msgid "Failed to convert binary xml data to encoding: {0}."
msgstr ""
-#: org/postgresql/jdbc/PgCallableStatement.java:377
-#: org/postgresql/jdbc/PgCallableStatement.java:396
+#: org/postgresql/jdbc/PgSQLXML.java:273
+msgid "Unable to convert DOMResult SQLXML data to a string."
+msgstr ""
+
+#: org/postgresql/jdbc/PgSQLXML.java:287
+msgid ""
+"This SQLXML object has already been initialized, so you cannot manipulate it "
+"further."
+msgstr ""
+
+#: org/postgresql/jdbc/PSQLSavepoint.java:37
+#: org/postgresql/jdbc/PSQLSavepoint.java:51
+#: org/postgresql/jdbc/PSQLSavepoint.java:69
+msgid "Cannot reference a savepoint after it has been released."
+msgstr "Nemohu z�skat odkaz na savepoint, kdy� byl uvoln�n."
+
+#: org/postgresql/jdbc/PSQLSavepoint.java:42
+msgid "Cannot retrieve the id of a named savepoint."
+msgstr "Nemohu z�skat id nepojmenovan�ho savepointu."
+
+#: org/postgresql/jdbc/PSQLSavepoint.java:56
+msgid "Cannot retrieve the name of an unnamed savepoint."
+msgstr "Nemohu z�skat n�zev nepojmenovan�ho savepointu."
+
+#: org/postgresql/jdbc/PgArray.java:157 org/postgresql/jdbc/PgArray.java:844
+#, java-format
+msgid "The array index is out of range: {0}"
+msgstr "Index pole mimo rozsah: {0}"
+
+#: org/postgresql/jdbc/PgArray.java:178 org/postgresql/jdbc/PgArray.java:861
#, java-format
-msgid ""
-"Parameter of type {0} was registered, but call to get{1} (sqltype={2}) was "
-"made."
-msgstr ""
+msgid "The array index is out of range: {0}, number of elements: {1}."
+msgstr "Index pole mimo rozsah: {0}, po�et prvk�: {1}."
-#: org/postgresql/jdbc/PgCallableStatement.java:417
-msgid ""
-"A CallableStatement was declared, but no call to registerOutParameter(1, "
-"<some type>) was made."
-msgstr ""
+#: org/postgresql/jdbc/PgParameterMetaData.java:83
+#, java-format
+msgid "The parameter index is out of range: {0}, number of parameters: {1}."
+msgstr "Index parametru mimo rozsah: {0}, po�et parametr� {1}."
-#: org/postgresql/jdbc/PgCallableStatement.java:423
-msgid "No function outputs were registered."
-msgstr ""
+#: org/postgresql/jdbc/BatchResultHandler.java:92
+msgid "Too many update results were returned."
+msgstr "Bylo vr�ceno p��li� mnoho v�sledk� aktualizac�."
-#: org/postgresql/jdbc/PgCallableStatement.java:429
+#: org/postgresql/jdbc/BatchResultHandler.java:146
+#, java-format
msgid ""
-"Results cannot be retrieved from a CallableStatement before it is executed."
+"Batch entry {0} {1} was aborted: {2} Call getNextException to see other "
+"errors in the batch."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:312
+#: org/postgresql/jdbc/PgConnection.java:272
#, fuzzy, java-format
msgid "Unsupported value for stringtype parameter: {0}"
msgstr "Nepodporovan� hodnota typu: {0}"
-#: org/postgresql/jdbc/PgConnection.java:457
-#: org/postgresql/jdbc/PgPreparedStatement.java:115
-#: org/postgresql/jdbc/PgStatement.java:282
-#: org/postgresql/jdbc/TypeInfoCache.java:230
-#: org/postgresql/jdbc/TypeInfoCache.java:370
-#: org/postgresql/jdbc/TypeInfoCache.java:412
+#: org/postgresql/jdbc/PgConnection.java:424
+#: org/postgresql/jdbc/PgStatement.java:225
+#: org/postgresql/jdbc/TypeInfoCache.java:226
+#: org/postgresql/jdbc/TypeInfoCache.java:371
+#: org/postgresql/jdbc/TypeInfoCache.java:411
+#: org/postgresql/jdbc/TypeInfoCache.java:484
#: org/postgresql/jdbc/TypeInfoCache.java:489
-#: org/postgresql/jdbc/TypeInfoCache.java:494
-#: org/postgresql/jdbc/TypeInfoCache.java:535
-#: org/postgresql/jdbc/TypeInfoCache.java:540
+#: org/postgresql/jdbc/TypeInfoCache.java:526
+#: org/postgresql/jdbc/TypeInfoCache.java:531
+#: org/postgresql/jdbc/PgPreparedStatement.java:119
msgid "No results were returned by the query."
msgstr "Neobdr�en ��dn� v�sledek dotazu."
-#: org/postgresql/jdbc/PgConnection.java:578
+#: org/postgresql/jdbc/PgConnection.java:441
+#: org/postgresql/jdbc/PgStatement.java:254
+msgid "A result was returned when none was expected."
+msgstr "Obdr�en v�sledek, ikdy� ��dn� nebyl o�ek�v�n."
+
+#: org/postgresql/jdbc/PgConnection.java:545
msgid "Custom type maps are not supported."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:620
+#: org/postgresql/jdbc/PgConnection.java:587
#, java-format
msgid "Failed to create object for: {0}."
msgstr "Selhalo vytvo�en� objektu: {0}."
-#: org/postgresql/jdbc/PgConnection.java:672
+#: org/postgresql/jdbc/PgConnection.java:641
#, java-format
msgid "Unable to load the class {0} responsible for the datatype {1}"
msgstr "Nemohu na��st t��du {0} odpov�dnou za typ {1}"
-#: org/postgresql/jdbc/PgConnection.java:724
+#: org/postgresql/jdbc/PgConnection.java:693
msgid ""
"Cannot change transaction read-only property in the middle of a transaction."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:775
+#: org/postgresql/jdbc/PgConnection.java:756
msgid "Cannot commit when autoCommit is enabled."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:786
-#: org/postgresql/jdbc/PgConnection.java:1358
-#: org/postgresql/jdbc/PgConnection.java:1395
+#: org/postgresql/jdbc/PgConnection.java:767
+#: org/postgresql/jdbc/PgConnection.java:1384
+#: org/postgresql/jdbc/PgConnection.java:1428
#, fuzzy
msgid "This connection has been closed."
msgstr "Spojeni bylo uzav�eno."
-#: org/postgresql/jdbc/PgConnection.java:796
+#: org/postgresql/jdbc/PgConnection.java:777
msgid "Cannot rollback when autoCommit is enabled."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:870
+#: org/postgresql/jdbc/PgConnection.java:827
msgid ""
"Cannot change transaction isolation level in the middle of a transaction."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:876
+#: org/postgresql/jdbc/PgConnection.java:833
#, java-format
msgid "Transaction isolation level {0} not supported."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:921
+#: org/postgresql/jdbc/PgConnection.java:878
#, fuzzy
msgid "Finalizing a Connection that was never closed:"
msgstr "Spojeni bylo uzav�eno."
-#: org/postgresql/jdbc/PgConnection.java:1009
+#: org/postgresql/jdbc/PgConnection.java:945
msgid "Unable to translate data into the desired encoding."
msgstr "Nemohu p�elo�it data do po�adovan�ho k�dov�n�."
-#: org/postgresql/jdbc/PgConnection.java:1081
-#: org/postgresql/jdbc/PgResultSet.java:1782
-#: org/postgresql/jdbc/PgStatement.java:1053
+#: org/postgresql/jdbc/PgConnection.java:1008
+#: org/postgresql/jdbc/PgStatement.java:903
+#: org/postgresql/jdbc/PgResultSet.java:1817
msgid "Fetch size must be a value greater to or equal to 0."
msgstr "Nabran� velikost mus� b�t nez�porn�."
-#: org/postgresql/jdbc/PgConnection.java:1311
+#: org/postgresql/jdbc/PgConnection.java:1289
+#: org/postgresql/jdbc/PgConnection.java:1330
#, java-format
msgid "Unable to find server array type for provided name {0}."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:1327
+#: org/postgresql/jdbc/PgConnection.java:1312
+#, fuzzy, java-format
+msgid "Invalid elements {0}"
+msgstr "Vadn� d�lka proudu {0}."
+
+#: org/postgresql/jdbc/PgConnection.java:1348
#, fuzzy, java-format
msgid "Invalid timeout ({0}<0)."
msgstr "Vadn� d�lka proudu {0}."
-#: org/postgresql/jdbc/PgConnection.java:1340
+#: org/postgresql/jdbc/PgConnection.java:1372
msgid "Validating connection."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:1375
+#: org/postgresql/jdbc/PgConnection.java:1405
#, fuzzy, java-format
msgid "Failed to set ClientInfo property: {0}"
msgstr "Selhalo vytvo�en� objektu: {0}."
-#: org/postgresql/jdbc/PgConnection.java:1383
+#: org/postgresql/jdbc/PgConnection.java:1415
#, fuzzy
msgid "ClientInfo property not supported."
msgstr "Vr�cen� automaticky generovan�ch kl��� nen� podporov�no."
-#: org/postgresql/jdbc/PgConnection.java:1408
+#: org/postgresql/jdbc/PgConnection.java:1441
msgid "One ore more ClientInfo failed."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:1517
+#: org/postgresql/jdbc/PgConnection.java:1540
+#, fuzzy
+msgid "Network timeout must be a value greater than or equal to 0."
+msgstr "�asov� limit dotazu mus� b�t nez�porn� ��slo."
+
+#: org/postgresql/jdbc/PgConnection.java:1552
+msgid "Unable to set network timeout."
+msgstr ""
+
+#: org/postgresql/jdbc/PgConnection.java:1563
+msgid "Unable to get network timeout."
+msgstr ""
+
+#: org/postgresql/jdbc/PgConnection.java:1580
#, java-format
msgid "Unknown ResultSet holdability setting: {0}."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:1531
-#: org/postgresql/jdbc/PgConnection.java:1554
-#: org/postgresql/jdbc/PgConnection.java:1576
-#: org/postgresql/jdbc/PgConnection.java:1587
-msgid "Server versions prior to 8.0 do not support savepoints."
-msgstr "Verze serveru ni��� ne� 8.0 nepodporuj� savepoints."
-
-#: org/postgresql/jdbc/PgConnection.java:1535
-#: org/postgresql/jdbc/PgConnection.java:1558
+#: org/postgresql/jdbc/PgConnection.java:1598
+#: org/postgresql/jdbc/PgConnection.java:1619
msgid "Cannot establish a savepoint in auto-commit mode."
msgstr "Nemohu vytvo�it savepoint v auto-commit modu."
-#: org/postgresql/jdbc/PgConnection.java:1635
+#: org/postgresql/jdbc/PgConnection.java:1685
msgid "Returning autogenerated keys is not supported."
msgstr "Vr�cen� automaticky generovan�ch kl��� nen� podporov�no."
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:78
+#: org/postgresql/jdbc/PgStatement.java:235
+msgid "Multiple ResultSets were returned by the query."
+msgstr "V�cen�sobn� ResultSet byl vr�cen dotazem."
+
+#: org/postgresql/jdbc/PgStatement.java:316
+msgid "Can''t use executeWithFlags(int) on a Statement."
+msgstr ""
+
+#: org/postgresql/jdbc/PgStatement.java:509
+msgid "Maximum number of rows must be a value grater than or equal to 0."
+msgstr "Maxim�ln� po�et ��dek mus� b�t nez�porn� ��slo."
+
+#: org/postgresql/jdbc/PgStatement.java:550
+msgid "Query timeout must be a value greater than or equals to 0."
+msgstr "�asov� limit dotazu mus� b�t nez�porn� ��slo."
+
+#: org/postgresql/jdbc/PgStatement.java:590
+msgid "The maximum field size must be a value greater than or equal to 0."
+msgstr "Maxim�ln� velikost pole mus� b�t nez�porn� ��slo."
+
+#: org/postgresql/jdbc/PgStatement.java:689
+msgid "This statement has been closed."
+msgstr "P��kaz byl uzav�en."
+
+#: org/postgresql/jdbc/PgStatement.java:895
+#: org/postgresql/jdbc/PgResultSet.java:878
+#, java-format
+msgid "Invalid fetch direction constant: {0}."
+msgstr "�patn� sm�r �ten�: {0}."
+
+#: org/postgresql/jdbc/PgStatement.java:1145
+#: org/postgresql/jdbc/PgStatement.java:1173
+#, fuzzy
+msgid "Returning autogenerated keys by column index is not supported."
+msgstr "Vr�cen� automaticky generovan�ch kl��� nen� podporov�no."
+
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:66
#, fuzzy
msgid ""
"Unable to determine a value for MaxIndexKeys due to missing system catalog "
"data."
msgstr "Nemohu naj�t oid a oidvector typu v syst�mov�m katalogu."
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:100
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:89
msgid "Unable to find name datatype in the system catalogs."
msgstr "Nemohu naj�t n�zev typu v syst�mov�m katalogu."
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1117
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1028
msgid "proname"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1117
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1028
msgid "oid"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1119
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1714
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1030
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1481
msgid "typtype"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1122
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1033
msgid "proargtypes"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1732
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1499
msgid "adsrc"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1872
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1963
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1512
+msgid "attidentity"
+msgstr ""
+
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1608
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1684
msgid "rolname"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1873
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1964
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1609
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1685
msgid "relacl"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1878
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1615
msgid "attacl"
msgstr ""
-#: org/postgresql/jdbc/PgParameterMetaData.java:86
+#: org/postgresql/jdbc/AbstractBlobClob.java:78
+msgid ""
+"Truncation of large objects is only implemented in 8.3 and later servers."
+msgstr ""
+
+#: org/postgresql/jdbc/AbstractBlobClob.java:83
+msgid "Cannot truncate LOB to a negative length."
+msgstr ""
+
+#: org/postgresql/jdbc/AbstractBlobClob.java:90
+#: org/postgresql/jdbc/AbstractBlobClob.java:234
#, java-format
-msgid "The parameter index is out of range: {0}, number of parameters: {1}."
-msgstr "Index parametru mimo rozsah: {0}, po�et parametr� {1}."
+msgid "PostgreSQL LOBs can only index to: {0}"
+msgstr ""
+
+#: org/postgresql/jdbc/AbstractBlobClob.java:230
+msgid "LOB positioning offsets start at 1."
+msgstr "Za��tek pozicov�n� LOB za��na na 1."
-#: org/postgresql/jdbc/PgPreparedStatement.java:102
-#: org/postgresql/jdbc/PgPreparedStatement.java:128
-#: org/postgresql/jdbc/PgPreparedStatement.java:150
-#: org/postgresql/jdbc/PgPreparedStatement.java:1108
+#: org/postgresql/jdbc/AbstractBlobClob.java:246
+msgid "free() was called on this LOB previously"
+msgstr ""
+
+#: org/postgresql/jdbc/PgPreparedStatement.java:106
+#: org/postgresql/jdbc/PgPreparedStatement.java:127
+#: org/postgresql/jdbc/PgPreparedStatement.java:139
+#: org/postgresql/jdbc/PgPreparedStatement.java:1035
msgid ""
"Can''t use query methods that take a query string on a PreparedStatement."
msgstr ""
-#: org/postgresql/jdbc/PgPreparedStatement.java:119
-#: org/postgresql/jdbc/PgStatement.java:286
-msgid "Multiple ResultSets were returned by the query."
-msgstr "V�cen�sobn� ResultSet byl vr�cen dotazem."
-
-#: org/postgresql/jdbc/PgPreparedStatement.java:270
+#: org/postgresql/jdbc/PgPreparedStatement.java:249
msgid "Unknown Types value."
msgstr "Nezn�m� hodnota typu."
-#: org/postgresql/jdbc/PgPreparedStatement.java:417
-#: org/postgresql/jdbc/PgPreparedStatement.java:486
-#: org/postgresql/jdbc/PgPreparedStatement.java:1251
-#: org/postgresql/jdbc/PgPreparedStatement.java:1583
+#: org/postgresql/jdbc/PgPreparedStatement.java:382
+#: org/postgresql/jdbc/PgPreparedStatement.java:439
+#: org/postgresql/jdbc/PgPreparedStatement.java:1191
+#: org/postgresql/jdbc/PgPreparedStatement.java:1490
#, java-format
msgid "Invalid stream length {0}."
msgstr "Vadn� d�lka proudu {0}."
-#: org/postgresql/jdbc/PgPreparedStatement.java:447
+#: org/postgresql/jdbc/PgPreparedStatement.java:411
#, java-format
msgid "The JVM claims not to support the {0} encoding."
msgstr "JVM tvrd�, �e nepodporuje kodov�n� {0}."
-#: org/postgresql/jdbc/PgPreparedStatement.java:450
-#: org/postgresql/jdbc/PgPreparedStatement.java:519
-#: org/postgresql/jdbc/PgResultSet.java:1075
-#: org/postgresql/jdbc/PgResultSet.java:1109
+#: org/postgresql/jdbc/PgPreparedStatement.java:414
+#: org/postgresql/jdbc/PgResultSet.java:1122
+#: org/postgresql/jdbc/PgResultSet.java:1156
msgid "Provided InputStream failed."
msgstr "Selhal poskytnut� InputStream."
-#: org/postgresql/jdbc/PgPreparedStatement.java:536
-#: org/postgresql/jdbc/PgPreparedStatement.java:1170
+#: org/postgresql/jdbc/PgPreparedStatement.java:460
+#: org/postgresql/jdbc/PgPreparedStatement.java:1096
#, java-format
msgid "Unknown type {0}."
msgstr "Nezn�m� typ {0}."
-#: org/postgresql/jdbc/PgPreparedStatement.java:553
+#: org/postgresql/jdbc/PgPreparedStatement.java:477
msgid "No hstore extension installed."
msgstr ""
-#: org/postgresql/jdbc/PgPreparedStatement.java:683
-#: org/postgresql/jdbc/PgPreparedStatement.java:705
-#: org/postgresql/jdbc/PgPreparedStatement.java:715
-#: org/postgresql/jdbc/PgPreparedStatement.java:725
+#: org/postgresql/jdbc/PgPreparedStatement.java:619
+#: org/postgresql/jdbc/PgPreparedStatement.java:642
+#: org/postgresql/jdbc/PgPreparedStatement.java:652
+#: org/postgresql/jdbc/PgPreparedStatement.java:664
#, java-format
msgid "Cannot cast an instance of {0} to type {1}"
msgstr "Nemohu p�etypovat instanci {0} na typ {1}"
-#: org/postgresql/jdbc/PgPreparedStatement.java:741
+#: org/postgresql/jdbc/PgPreparedStatement.java:682
#, java-format
msgid "Unsupported Types value: {0}"
msgstr "Nepodporovan� hodnota typu: {0}"
-#: org/postgresql/jdbc/PgPreparedStatement.java:970
+#: org/postgresql/jdbc/PgPreparedStatement.java:894
#, fuzzy, java-format
msgid "Cannot convert an instance of {0} to type {1}"
msgstr "Nemohu p�etypovat instanci {0} na typ {1}"
-#: org/postgresql/jdbc/PgPreparedStatement.java:1040
+#: org/postgresql/jdbc/PgPreparedStatement.java:968
#, java-format
msgid ""
"Can''t infer the SQL type to use for an instance of {0}. Use setObject() "
"with an explicit Types value to specify the type to use."
msgstr ""
-#: org/postgresql/jdbc/PgPreparedStatement.java:1207
-#: org/postgresql/jdbc/PgPreparedStatement.java:1303
-#: org/postgresql/jdbc/PgPreparedStatement.java:1340
+#: org/postgresql/jdbc/PgPreparedStatement.java:1133
+#: org/postgresql/jdbc/PgPreparedStatement.java:1233
msgid "Unexpected error writing large object to database."
msgstr "Neo�ek�van� chyba p�i zapisov�n� velk�ho objektu do datab�ze."
-#: org/postgresql/jdbc/PgPreparedStatement.java:1278
-#: org/postgresql/jdbc/PgResultSet.java:1163
+#: org/postgresql/jdbc/PgPreparedStatement.java:1178
+#: org/postgresql/jdbc/PgResultSet.java:1210
msgid "Provided Reader failed."
msgstr "Selhal poskytnut� Reader."
-#: org/postgresql/jdbc/PgPreparedStatement.java:1542
-#: org/postgresql/util/StreamWrapper.java:59
-msgid "Object is too large to send over the protocol."
+#: org/postgresql/jdbc/BooleanTypeUtil.java:99
+#, java-format
+msgid "Cannot cast to boolean: \"{0}\""
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:285
+#: org/postgresql/jdbc/PgResultSet.java:280
msgid ""
"Operation requires a scrollable ResultSet, but this ResultSet is "
"FORWARD_ONLY."
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:456
-msgid "Unexpected error while decoding character data from a large object."
-msgstr "Neo�ek�van� chyba b�ham dek�dov�n� znaku z velk�ho objektu."
-
-#: org/postgresql/jdbc/PgResultSet.java:507
-#: org/postgresql/jdbc/PgResultSet.java:537
-#: org/postgresql/jdbc/PgResultSet.java:570
-#: org/postgresql/jdbc/PgResultSet.java:2964
+#: org/postgresql/jdbc/PgResultSet.java:492
+#: org/postgresql/jdbc/PgResultSet.java:532
+#: org/postgresql/jdbc/PgResultSet.java:556
+#: org/postgresql/jdbc/PgResultSet.java:594
+#: org/postgresql/jdbc/PgResultSet.java:624
#: org/postgresql/jdbc/PgResultSet.java:3008
+#: org/postgresql/jdbc/PgResultSet.java:3052
#, fuzzy, java-format
msgid "Cannot convert the column of type {0} to requested type {1}."
msgstr "Nemohu p�etypovat instanci {0} na typ {1}"
-#: org/postgresql/jdbc/PgResultSet.java:789
-#: org/postgresql/jdbc/PgResultSet.java:810
-#: org/postgresql/jdbc/PgResultSet.java:1797
+#: org/postgresql/jdbc/PgResultSet.java:838
+#: org/postgresql/jdbc/PgResultSet.java:859
+#: org/postgresql/jdbc/PgResultSet.java:1832
msgid "Can''t use relative move methods while on the insert row."
msgstr "Nem��ete pou��vat relativn� p�esuny p�i vkl�d�n� ��dku."
-#: org/postgresql/jdbc/PgResultSet.java:829
-#: org/postgresql/jdbc/PgStatement.java:1045
-#, java-format
-msgid "Invalid fetch direction constant: {0}."
-msgstr "�patn� sm�r �ten�: {0}."
-
-#: org/postgresql/jdbc/PgResultSet.java:840
-msgid "Cannot call cancelRowUpdates() when on the insert row."
-msgstr "Nem��ete volat cancelRowUpdates() p�i vkl�d�n� ��dku."
-
-#: org/postgresql/jdbc/PgResultSet.java:856
-msgid "Cannot call deleteRow() when on the insert row."
-msgstr "Nem��ete volat deleteRow() p�i vkl�d�n� ��dku."
-
-#: org/postgresql/jdbc/PgResultSet.java:863
-msgid ""
-"Currently positioned before the start of the ResultSet. You cannot call "
-"deleteRow() here."
-msgstr ""
-
-#: org/postgresql/jdbc/PgResultSet.java:869
-msgid ""
-"Currently positioned after the end of the ResultSet. You cannot call "
-"deleteRow() here."
-msgstr ""
-"Pr�v� jste za pozic� konce ResultSetu. Zde nem��ete volat deleteRow().s"
-
-#: org/postgresql/jdbc/PgResultSet.java:873
-msgid "There are no rows in this ResultSet."
-msgstr "��dn� ��dek v ResultSet."
-
-#: org/postgresql/jdbc/PgResultSet.java:914
-msgid "Not on the insert row."
-msgstr "Ne na vkl�dan�m ��dku."
-
-#: org/postgresql/jdbc/PgResultSet.java:916
-msgid "You must specify at least one column value to insert a row."
-msgstr "Mus�te vyplnit alespo� jeden sloupec pro vlo�en� ��dku."
-
-#: org/postgresql/jdbc/PgResultSet.java:1072
-#: org/postgresql/jdbc/PgResultSet.java:1706
-#: org/postgresql/jdbc/PgResultSet.java:2377
-#: org/postgresql/jdbc/PgResultSet.java:2402
-#, java-format
-msgid "The JVM claims not to support the encoding: {0}"
-msgstr "JVM tvrd�, �e nepodporuje kodov�n�: {0}"
-
-#: org/postgresql/jdbc/PgResultSet.java:1214
-msgid "Can''t refresh the insert row."
-msgstr "Nemohu obnovit vkl�dan� ��dek."
-
-#: org/postgresql/jdbc/PgResultSet.java:1280
-msgid "Cannot call updateRow() when on the insert row."
-msgstr "Nemohu volat updateRow() na vlk�dan�m ��dku."
-
-#: org/postgresql/jdbc/PgResultSet.java:1287
-#: org/postgresql/jdbc/PgResultSet.java:3025
-msgid ""
-"Cannot update the ResultSet because it is either before the start or after "
-"the end of the results."
-msgstr ""
-
-#: org/postgresql/jdbc/PgResultSet.java:1486
-msgid "ResultSets with concurrency CONCUR_READ_ONLY cannot be updated."
-msgstr "ResultSets se soub�nost� CONCUR_READ_ONLY nem��e b�t aktualizov�no"
-
-#: org/postgresql/jdbc/PgResultSet.java:1555
-#, java-format
-msgid "No primary key found for table {0}."
-msgstr "Nenalezen prim�rn� kl�� pro tabulku {0}."
-
-#: org/postgresql/jdbc/PgResultSet.java:1941
-#: org/postgresql/jdbc/PgResultSet.java:1946
-#: org/postgresql/jdbc/PgResultSet.java:1986
-#: org/postgresql/jdbc/PgResultSet.java:1992
-#: org/postgresql/jdbc/PgResultSet.java:2790
-#: org/postgresql/jdbc/PgResultSet.java:2796
-#: org/postgresql/jdbc/PgResultSet.java:2820
-#: org/postgresql/jdbc/PgResultSet.java:2825
-#: org/postgresql/jdbc/PgResultSet.java:2841
-#: org/postgresql/jdbc/PgResultSet.java:2862
-#: org/postgresql/jdbc/PgResultSet.java:2873
-#: org/postgresql/jdbc/PgResultSet.java:2886
-#: org/postgresql/jdbc/PgResultSet.java:3013
-#, java-format
-msgid "Bad value for type {0} : {1}"
-msgstr "�patn� hodnota pro typ {0} : {1}"
-
-#: org/postgresql/jdbc/PgResultSet.java:2564
-#, java-format
-msgid "The column name {0} was not found in this ResultSet."
-msgstr "Sloupec pojmenovan� {0} nebyl nalezen v ResultSet."
-
-#: org/postgresql/jdbc/PgResultSet.java:2689
-msgid ""
-"ResultSet is not updateable. The query that generated this result set must "
-"select only one table, and must select all primary keys from that table. See "
-"the JDBC 2.1 API Specification, section 5.6 for more details."
-msgstr ""
-"ResultSet nen� aktualizavateln�. Dotaz mus� vyb�rat pouze z jedn� tabulky a "
-"mus� obsahovat v�echny prim�rn� kl��e tabulky. Koukni do JDBC 2.1 API "
-"Specifikace, sekce 5.6 pro v�ce podrobnost�."
-
-#: org/postgresql/jdbc/PgResultSet.java:2701
-msgid "This ResultSet is closed."
-msgstr "Tento ResultSet je uzav�en�."
-
-#: org/postgresql/jdbc/PgResultSet.java:2732
-msgid "ResultSet not positioned properly, perhaps you need to call next."
-msgstr ""
-
-#: org/postgresql/jdbc/PgResultSet.java:3045
-msgid "Invalid UUID data."
-msgstr ""
-
-#: org/postgresql/jdbc/PgSQLXML.java:150
-msgid "Unable to decode xml data."
-msgstr ""
-
-#: org/postgresql/jdbc/PgSQLXML.java:153
-#, java-format
-msgid "Unknown XML Source class: {0}"
-msgstr ""
-
-#: org/postgresql/jdbc/PgSQLXML.java:196
-#, fuzzy
-msgid "Unable to create SAXResult for SQLXML."
-msgstr "Selhalo vytvo�en� objektu: {0}."
-
-#: org/postgresql/jdbc/PgSQLXML.java:211
-msgid "Unable to create StAXResult for SQLXML"
-msgstr ""
-
-#: org/postgresql/jdbc/PgSQLXML.java:216
-#, java-format
-msgid "Unknown XML Result class: {0}"
-msgstr ""
-
-#: org/postgresql/jdbc/PgSQLXML.java:228
-#, fuzzy
-msgid "This SQLXML object has already been freed."
-msgstr "Tento PooledConnection byl uzav�en."
-
-#: org/postgresql/jdbc/PgSQLXML.java:237
-msgid ""
-"This SQLXML object has not been initialized, so you cannot retrieve data "
-"from it."
-msgstr ""
-
-#: org/postgresql/jdbc/PgSQLXML.java:250
-#, java-format
-msgid "Failed to convert binary xml data to encoding: {0}."
-msgstr ""
-
-#: org/postgresql/jdbc/PgSQLXML.java:276
-msgid "Unable to convert DOMResult SQLXML data to a string."
-msgstr ""
-
-#: org/postgresql/jdbc/PgSQLXML.java:290
-msgid ""
-"This SQLXML object has already been initialized, so you cannot manipulate it "
-"further."
-msgstr ""
-
-#: org/postgresql/jdbc/PgStatement.java:325
-msgid "Can''t use executeWithFlags(int) on a Statement."
-msgstr ""
-
-#: org/postgresql/jdbc/PgStatement.java:484
-msgid "Maximum number of rows must be a value grater than or equal to 0."
-msgstr "Maxim�ln� po�et ��dek mus� b�t nez�porn� ��slo."
-
-#: org/postgresql/jdbc/PgStatement.java:525
-msgid "Query timeout must be a value greater than or equals to 0."
-msgstr "�asov� limit dotazu mus� b�t nez�porn� ��slo."
-
-#: org/postgresql/jdbc/PgStatement.java:561
-msgid "The maximum field size must be a value greater than or equal to 0."
-msgstr "Maxim�ln� velikost pole mus� b�t nez�porn� ��slo."
-
-#: org/postgresql/jdbc/PgStatement.java:871
-msgid "This statement has been closed."
-msgstr "P��kaz byl uzav�en."
-
-#: org/postgresql/jdbc/PgStatement.java:1148
-#, fuzzy
-msgid ""
-"Returning autogenerated keys is only supported for 8.2 and later servers."
-msgstr "Vr�cen� automaticky generovan�ch kl��� nen� podporov�no."
-
-#: org/postgresql/jdbc/PgStatement.java:1326
-#: org/postgresql/jdbc/PgStatement.java:1357
-#, fuzzy
-msgid "Returning autogenerated keys by column index is not supported."
-msgstr "Vr�cen� automaticky generovan�ch kl��� nen� podporov�no."
-
-#: org/postgresql/jdbc/PSQLSavepoint.java:40
-#: org/postgresql/jdbc/PSQLSavepoint.java:54
-#: org/postgresql/jdbc/PSQLSavepoint.java:72
-msgid "Cannot reference a savepoint after it has been released."
-msgstr "Nemohu z�skat odkaz na savepoint, kdy� byl uvoln�n."
-
-#: org/postgresql/jdbc/PSQLSavepoint.java:45
-msgid "Cannot retrieve the id of a named savepoint."
-msgstr "Nemohu z�skat id nepojmenovan�ho savepointu."
-
-#: org/postgresql/jdbc/PSQLSavepoint.java:59
-msgid "Cannot retrieve the name of an unnamed savepoint."
-msgstr "Nemohu z�skat n�zev nepojmenovan�ho savepointu."
-
-#: org/postgresql/jdbc/TimestampUtils.java:298
-#, fuzzy, java-format
-msgid "Bad value for type timestamp/date/time: {1}"
-msgstr "�patn� hodnota pro typ {0} : {1}"
-
-#: org/postgresql/jdbc/TimestampUtils.java:359
-msgid ""
-"Infinite value found for timestamp/date. This cannot be represented as time."
-msgstr "Nekone�n� hodnota pro timestamp/date. Toto nem��e reprezentovat �as."
-
-#: org/postgresql/jdbc/TimestampUtils.java:674
-#: org/postgresql/jdbc/TimestampUtils.java:710
-#: org/postgresql/jdbc/TimestampUtils.java:757
-#, fuzzy, java-format
-msgid "Unsupported binary encoding of {0}."
-msgstr "Nepodporovan� hodnota typu: {0}"
-
-#: org/postgresql/largeobject/LargeObjectManager.java:147
-msgid "Failed to initialize LargeObject API"
-msgstr "Selhala inicializace LargeObject API"
-
-#: org/postgresql/largeobject/LargeObjectManager.java:265
-#: org/postgresql/largeobject/LargeObjectManager.java:308
-msgid "Large Objects may not be used in auto-commit mode."
-msgstr "Velk� objecky nemohou b�t pou�ity v auto-commit modu."
-
-#: org/postgresql/osgi/PGDataSourceFactory.java:85
-#, fuzzy, java-format
-msgid "Unsupported properties: {0}"
-msgstr "Nepodporovan� hodnota typu: {0}"
-
-#: org/postgresql/PGProperty.java:450 org/postgresql/PGProperty.java:470
-#, java-format
-msgid "{0} parameter value must be an integer but was: {1}"
-msgstr ""
+#: org/postgresql/jdbc/PgResultSet.java:889
+msgid "Cannot call cancelRowUpdates() when on the insert row."
+msgstr "Nem��ete volat cancelRowUpdates() p�i vkl�d�n� ��dku."
+
+#: org/postgresql/jdbc/PgResultSet.java:905
+msgid "Cannot call deleteRow() when on the insert row."
+msgstr "Nem��ete volat deleteRow() p�i vkl�d�n� ��dku."
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:125
+#: org/postgresql/jdbc/PgResultSet.java:912
msgid ""
-"Could not find a java cryptographic algorithm: X.509 CertificateFactory not "
-"available."
+"Currently positioned before the start of the ResultSet. You cannot call "
+"deleteRow() here."
msgstr ""
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:135
-#, java-format
-msgid "Could not open SSL certificate file {0}."
+#: org/postgresql/jdbc/PgResultSet.java:918
+msgid ""
+"Currently positioned after the end of the ResultSet. You cannot call "
+"deleteRow() here."
msgstr ""
+"Pr�v� jste za pozic� konce ResultSetu. Zde nem��ete volat deleteRow().s"
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:140
-#, java-format
-msgid "Loading the SSL certificate {0} into a KeyManager failed."
-msgstr ""
+#: org/postgresql/jdbc/PgResultSet.java:922
+msgid "There are no rows in this ResultSet."
+msgstr "��dn� ��dek v ResultSet."
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:195
-msgid "Enter SSL password: "
-msgstr ""
+#: org/postgresql/jdbc/PgResultSet.java:963
+msgid "Not on the insert row."
+msgstr "Ne na vkl�dan�m ��dku."
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:202
-msgid "Could not read password for SSL key file, console is not available."
-msgstr ""
+#: org/postgresql/jdbc/PgResultSet.java:965
+msgid "You must specify at least one column value to insert a row."
+msgstr "Mus�te vyplnit alespo� jeden sloupec pro vlo�en� ��dku."
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:207
+#: org/postgresql/jdbc/PgResultSet.java:1119
+#: org/postgresql/jdbc/PgResultSet.java:1754
+#: org/postgresql/jdbc/PgResultSet.java:2416
+#: org/postgresql/jdbc/PgResultSet.java:2437
#, java-format
-msgid "Could not read password for SSL key file by callbackhandler {0}."
-msgstr ""
+msgid "The JVM claims not to support the encoding: {0}"
+msgstr "JVM tvrd�, �e nepodporuje kodov�n�: {0}"
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:226
-#, java-format
-msgid "Could not decrypt SSL key file {0}."
-msgstr ""
+#: org/postgresql/jdbc/PgResultSet.java:1261
+msgid "Can''t refresh the insert row."
+msgstr "Nemohu obnovit vkl�dan� ��dek."
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:240
-#, java-format
-msgid "Could not read SSL key file {0}."
-msgstr ""
+#: org/postgresql/jdbc/PgResultSet.java:1328
+msgid "Cannot call updateRow() when on the insert row."
+msgstr "Nemohu volat updateRow() na vlk�dan�m ��dku."
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:243
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:162
-#, java-format
-msgid "Could not find a java cryptographic algorithm: {0}."
+#: org/postgresql/jdbc/PgResultSet.java:1335
+#: org/postgresql/jdbc/PgResultSet.java:3069
+msgid ""
+"Cannot update the ResultSet because it is either before the start or after "
+"the end of the results."
msgstr ""
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:90
-#, fuzzy, java-format
-msgid "The password callback class provided {0} could not be instantiated."
-msgstr "T��da SSLSocketFactory poskytla {0} co� nem��e b�t instancionizov�no."
+#: org/postgresql/jdbc/PgResultSet.java:1535
+msgid "ResultSets with concurrency CONCUR_READ_ONLY cannot be updated."
+msgstr "ResultSets se soub�nost� CONCUR_READ_ONLY nem��e b�t aktualizov�no"
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:123
+#: org/postgresql/jdbc/PgResultSet.java:1603
#, java-format
-msgid "Could not open SSL root certificate file {0}."
-msgstr ""
+msgid "No primary key found for table {0}."
+msgstr "Nenalezen prim�rn� kl�� pro tabulku {0}."
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:139
+#: org/postgresql/jdbc/PgResultSet.java:2011
+#: org/postgresql/jdbc/PgResultSet.java:2016
+#: org/postgresql/jdbc/PgResultSet.java:2803
+#: org/postgresql/jdbc/PgResultSet.java:2809
+#: org/postgresql/jdbc/PgResultSet.java:2834
+#: org/postgresql/jdbc/PgResultSet.java:2840
+#: org/postgresql/jdbc/PgResultSet.java:2864
+#: org/postgresql/jdbc/PgResultSet.java:2869
+#: org/postgresql/jdbc/PgResultSet.java:2885
+#: org/postgresql/jdbc/PgResultSet.java:2906
+#: org/postgresql/jdbc/PgResultSet.java:2917
+#: org/postgresql/jdbc/PgResultSet.java:2930
+#: org/postgresql/jdbc/PgResultSet.java:3057
#, java-format
-msgid "Could not read SSL root certificate file {0}."
-msgstr ""
+msgid "Bad value for type {0} : {1}"
+msgstr "�patn� hodnota pro typ {0} : {1}"
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:143
+#: org/postgresql/jdbc/PgResultSet.java:2589
#, java-format
-msgid "Loading the SSL root certificate {0} into a TrustManager failed."
-msgstr ""
+msgid "The column name {0} was not found in this ResultSet."
+msgstr "Sloupec pojmenovan� {0} nebyl nalezen v ResultSet."
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:156
-msgid "Could not initialize SSL context."
+#: org/postgresql/jdbc/PgResultSet.java:2725
+msgid ""
+"ResultSet is not updateable. The query that generated this result set must "
+"select only one table, and must select all primary keys from that table. See "
+"the JDBC 2.1 API Specification, section 5.6 for more details."
msgstr ""
+"ResultSet nen� aktualizavateln�. Dotaz mus� vyb�rat pouze z jedn� tabulky a "
+"mus� obsahovat v�echny prim�rn� kl��e tabulky. Koukni do JDBC 2.1 API "
+"Specifikace, sekce 5.6 pro v�ce podrobnost�."
-#: org/postgresql/ssl/MakeSSL.java:52
-#, java-format
-msgid "The SSLSocketFactory class provided {0} could not be instantiated."
-msgstr "T��da SSLSocketFactory poskytla {0} co� nem��e b�t instancionizov�no."
+#: org/postgresql/jdbc/PgResultSet.java:2737
+msgid "This ResultSet is closed."
+msgstr "Tento ResultSet je uzav�en�."
-#: org/postgresql/ssl/MakeSSL.java:67
-#, java-format
-msgid "SSL error: {0}"
+#: org/postgresql/jdbc/PgResultSet.java:2768
+msgid "ResultSet not positioned properly, perhaps you need to call next."
msgstr ""
-#: org/postgresql/ssl/MakeSSL.java:78
+#: org/postgresql/jdbc/PgResultSet.java:3089
+msgid "Invalid UUID data."
+msgstr ""
+
+#: org/postgresql/jdbc/PgResultSet.java:3178
+#: org/postgresql/jdbc/PgResultSet.java:3185
+#: org/postgresql/jdbc/PgResultSet.java:3196
+#: org/postgresql/jdbc/PgResultSet.java:3207
+#: org/postgresql/jdbc/PgResultSet.java:3218
+#: org/postgresql/jdbc/PgResultSet.java:3229
+#: org/postgresql/jdbc/PgResultSet.java:3240
+#: org/postgresql/jdbc/PgResultSet.java:3251
+#: org/postgresql/jdbc/PgResultSet.java:3262
+#: org/postgresql/jdbc/PgResultSet.java:3269
+#: org/postgresql/jdbc/PgResultSet.java:3276
+#: org/postgresql/jdbc/PgResultSet.java:3287
+#: org/postgresql/jdbc/PgResultSet.java:3304
+#: org/postgresql/jdbc/PgResultSet.java:3311
+#: org/postgresql/jdbc/PgResultSet.java:3318
+#: org/postgresql/jdbc/PgResultSet.java:3329
+#: org/postgresql/jdbc/PgResultSet.java:3336
+#: org/postgresql/jdbc/PgResultSet.java:3343
+#: org/postgresql/jdbc/PgResultSet.java:3381
+#: org/postgresql/jdbc/PgResultSet.java:3388
+#: org/postgresql/jdbc/PgResultSet.java:3395
+#: org/postgresql/jdbc/PgResultSet.java:3415
+#: org/postgresql/jdbc/PgResultSet.java:3428
+#, java-format
+msgid "conversion to {0} from {1} not supported"
+msgstr ""
+
+#: org/postgresql/jdbc/TimestampUtils.java:355
+#: org/postgresql/jdbc/TimestampUtils.java:423
#, fuzzy, java-format
-msgid "The HostnameVerifier class provided {0} could not be instantiated."
-msgstr "T��da SSLSocketFactory poskytla {0} co� nem��e b�t instancionizov�no."
+msgid "Bad value for type timestamp/date/time: {1}"
+msgstr "�patn� hodnota pro typ {0} : {1}"
-#: org/postgresql/ssl/MakeSSL.java:84
-#, java-format
-msgid "The hostname {0} could not be verified by hostnameverifier {1}."
-msgstr ""
+#: org/postgresql/jdbc/TimestampUtils.java:858
+#: org/postgresql/jdbc/TimestampUtils.java:915
+#: org/postgresql/jdbc/TimestampUtils.java:961
+#: org/postgresql/jdbc/TimestampUtils.java:1010
+#, fuzzy, java-format
+msgid "Unsupported binary encoding of {0}."
+msgstr "Nepodporovan� hodnota typu: {0}"
-#: org/postgresql/ssl/MakeSSL.java:93
+#: org/postgresql/jdbc/PgCallableStatement.java:86
+#: org/postgresql/jdbc/PgCallableStatement.java:96
+msgid "A CallableStatement was executed with nothing returned."
+msgstr "CallableStatement byl spu�t�n, le� nic nebylo vr�ceno."
+
+#: org/postgresql/jdbc/PgCallableStatement.java:107
+#, fuzzy
+msgid "A CallableStatement was executed with an invalid number of parameters"
+msgstr "CallableStatement byl spu�t�n, le� nic nebylo vr�ceno."
+
+#: org/postgresql/jdbc/PgCallableStatement.java:145
#, java-format
-msgid "The hostname {0} could not be verified."
+msgid ""
+"A CallableStatement function was executed and the out parameter {0} was of "
+"type {1} however type {2} was registered."
msgstr ""
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:167
-msgid "The sslfactoryarg property may not be empty."
+#: org/postgresql/jdbc/PgCallableStatement.java:202
+msgid ""
+"This statement does not declare an OUT parameter. Use '{' ?= call ... '}' "
+"to declare one."
msgstr ""
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:183
-msgid ""
-"The environment variable containing the server's SSL certificate must not be "
-"empty."
+#: org/postgresql/jdbc/PgCallableStatement.java:246
+msgid "wasNull cannot be call before fetching a result."
msgstr ""
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:191
+#: org/postgresql/jdbc/PgCallableStatement.java:384
+#: org/postgresql/jdbc/PgCallableStatement.java:403
+#, java-format
msgid ""
-"The system property containing the server's SSL certificate must not be "
-"empty."
+"Parameter of type {0} was registered, but call to get{1} (sqltype={2}) was "
+"made."
msgstr ""
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:198
+#: org/postgresql/jdbc/PgCallableStatement.java:424
msgid ""
-"The sslfactoryarg property must start with the prefix file:, classpath:, "
-"env:, sys:, or -----BEGIN CERTIFICATE-----."
+"A CallableStatement was declared, but no call to registerOutParameter(1, "
+"<some type>) was made."
msgstr ""
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:210
-#, fuzzy
-msgid "An error occurred reading the certificate"
-msgstr "Nastala chyba p�i nastaven� SSL spojen�."
-
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:243
-msgid "No X509TrustManager found"
+#: org/postgresql/jdbc/PgCallableStatement.java:430
+msgid "No function outputs were registered."
msgstr ""
-#: org/postgresql/util/PGInterval.java:155
-#, fuzzy
-msgid "Conversion of interval failed"
-msgstr "P�evod pen�z selhal."
+#: org/postgresql/jdbc/PgCallableStatement.java:436
+msgid ""
+"Results cannot be retrieved from a CallableStatement before it is executed."
+msgstr ""
-#: org/postgresql/util/PGmoney.java:65
-msgid "Conversion of money failed."
-msgstr "P�evod pen�z selhal."
+#: org/postgresql/jdbc/PgCallableStatement.java:703
+#, fuzzy, java-format
+msgid "Unsupported type conversion to {1}."
+msgstr "Nepodporovan� hodnota typu: {0}"
-#: org/postgresql/util/ServerErrorMessage.java:165
+#: org/postgresql/jdbc/EscapedFunctions.java:240
#, java-format
-msgid "Detail: {0}"
-msgstr "Detail: {0}"
+msgid "{0} function takes four and only four argument."
+msgstr "Funkce {0} bere p�esn� �ty�i argumenty."
-#: org/postgresql/util/ServerErrorMessage.java:170
+#: org/postgresql/jdbc/EscapedFunctions.java:270
+#: org/postgresql/jdbc/EscapedFunctions.java:344
+#: org/postgresql/jdbc/EscapedFunctions.java:749
+#: org/postgresql/jdbc/EscapedFunctions.java:787
#, java-format
-msgid "Hint: {0}"
-msgstr "Rada: {0}"
+msgid "{0} function takes two and only two arguments."
+msgstr "Funkce {0} bere pr�v� dva argumenty."
-#: org/postgresql/util/ServerErrorMessage.java:174
+#: org/postgresql/jdbc/EscapedFunctions.java:288
+#: org/postgresql/jdbc/EscapedFunctions.java:326
+#: org/postgresql/jdbc/EscapedFunctions.java:446
+#: org/postgresql/jdbc/EscapedFunctions.java:461
+#: org/postgresql/jdbc/EscapedFunctions.java:476
+#: org/postgresql/jdbc/EscapedFunctions.java:491
+#: org/postgresql/jdbc/EscapedFunctions.java:506
+#: org/postgresql/jdbc/EscapedFunctions.java:521
+#: org/postgresql/jdbc/EscapedFunctions.java:536
+#: org/postgresql/jdbc/EscapedFunctions.java:551
+#: org/postgresql/jdbc/EscapedFunctions.java:566
+#: org/postgresql/jdbc/EscapedFunctions.java:581
+#: org/postgresql/jdbc/EscapedFunctions.java:596
+#: org/postgresql/jdbc/EscapedFunctions.java:611
+#: org/postgresql/jdbc/EscapedFunctions.java:775
#, java-format
-msgid "Position: {0}"
-msgstr "Pozice: {0}"
+msgid "{0} function takes one and only one argument."
+msgstr "Funkce {0} bere jeden argument."
-#: org/postgresql/util/ServerErrorMessage.java:178
+#: org/postgresql/jdbc/EscapedFunctions.java:310
+#: org/postgresql/jdbc/EscapedFunctions.java:391
#, java-format
-msgid "Where: {0}"
-msgstr "Kde: {0}"
+msgid "{0} function takes two or three arguments."
+msgstr "Funkce {0} bere dva nebo t�i argumenty."
-#: org/postgresql/util/ServerErrorMessage.java:184
+#: org/postgresql/jdbc/EscapedFunctions.java:416
+#: org/postgresql/jdbc/EscapedFunctions.java:431
+#: org/postgresql/jdbc/EscapedFunctions.java:734
+#: org/postgresql/jdbc/EscapedFunctions.java:764
#, java-format
-msgid "Internal Query: {0}"
-msgstr ""
+msgid "{0} function doesn''t take any argument."
+msgstr "Funkce {0} nebere ��dn� argument."
-#: org/postgresql/util/ServerErrorMessage.java:188
+#: org/postgresql/jdbc/EscapedFunctions.java:627
+#: org/postgresql/jdbc/EscapedFunctions.java:680
#, fuzzy, java-format
-msgid "Internal Position: {0}"
-msgstr "Pozice: {0}"
+msgid "{0} function takes three and only three arguments."
+msgstr "Funkce {0} bere pr�v� dva argumenty."
-#: org/postgresql/util/ServerErrorMessage.java:195
-#, java-format
-msgid "Location: File: {0}, Routine: {1}, Line: {2}"
-msgstr "Poloha: Soubor: {0}, Rutina: {1}, ��dek: {2}"
+#: org/postgresql/jdbc/EscapedFunctions.java:640
+#: org/postgresql/jdbc/EscapedFunctions.java:661
+#: org/postgresql/jdbc/EscapedFunctions.java:664
+#: org/postgresql/jdbc/EscapedFunctions.java:697
+#: org/postgresql/jdbc/EscapedFunctions.java:710
+#: org/postgresql/jdbc/EscapedFunctions.java:713
+#, fuzzy, java-format
+msgid "Interval {0} not yet implemented"
+msgstr "Metoda {0} nen� implementov�na."
-#: org/postgresql/util/ServerErrorMessage.java:200
+#: org/postgresql/PGProperty.java:535 org/postgresql/PGProperty.java:555
#, java-format
-msgid "Server SQLState: {0}"
-msgstr "Server SQLState: {0}"
-
-#: org/postgresql/xa/PGXAConnection.java:148
-msgid ""
-"Transaction control methods setAutoCommit(true), commit, rollback and "
-"setSavePoint not allowed while an XA transaction is active."
+msgid "{0} parameter value must be an integer but was: {1}"
msgstr ""
-#: org/postgresql/xa/PGXAConnection.java:196
-#: org/postgresql/xa/PGXAConnection.java:265
-msgid "Invalid flags"
-msgstr ""
+#: org/postgresql/largeobject/LargeObjectManager.java:144
+msgid "Failed to initialize LargeObject API"
+msgstr "Selhala inicializace LargeObject API"
-#: org/postgresql/xa/PGXAConnection.java:200
-#: org/postgresql/xa/PGXAConnection.java:269
-#: org/postgresql/xa/PGXAConnection.java:437
-msgid "xid must not be null"
-msgstr ""
+#: org/postgresql/largeobject/LargeObjectManager.java:262
+#: org/postgresql/largeobject/LargeObjectManager.java:305
+msgid "Large Objects may not be used in auto-commit mode."
+msgstr "Velk� objecky nemohou b�t pou�ity v auto-commit modu."
-#: org/postgresql/xa/PGXAConnection.java:204
-msgid "Connection is busy with another transaction"
+#: org/postgresql/copy/PGCopyInputStream.java:51
+#, java-format
+msgid "Copying from database failed: {0}"
msgstr ""
-#: org/postgresql/xa/PGXAConnection.java:213
-#: org/postgresql/xa/PGXAConnection.java:279
-msgid "suspend/resume not implemented"
-msgstr ""
+#: org/postgresql/copy/PGCopyInputStream.java:67
+#: org/postgresql/copy/PGCopyOutputStream.java:94
+#, fuzzy
+msgid "This copy stream is closed."
+msgstr "Tento ResultSet je uzav�en�."
-#: org/postgresql/xa/PGXAConnection.java:219
-#: org/postgresql/xa/PGXAConnection.java:224
-#: org/postgresql/xa/PGXAConnection.java:228
-msgid "Transaction interleaving not implemented"
+#: org/postgresql/copy/PGCopyInputStream.java:110
+msgid "Read from copy failed."
msgstr ""
-#: org/postgresql/xa/PGXAConnection.java:239
-msgid "Error disabling autocommit"
+#: org/postgresql/copy/CopyManager.java:53
+#, java-format
+msgid "Requested CopyIn but got {0}"
msgstr ""
-#: org/postgresql/xa/PGXAConnection.java:273
-msgid "tried to call end without corresponding start call"
+#: org/postgresql/copy/CopyManager.java:64
+#, java-format
+msgid "Requested CopyOut but got {0}"
msgstr ""
-#: org/postgresql/xa/PGXAConnection.java:305
-msgid ""
-"Not implemented: Prepare must be issued using the same connection that "
-"started the transaction"
+#: org/postgresql/copy/CopyManager.java:75
+#, java-format
+msgid "Requested CopyDual but got {0}"
msgstr ""
-#: org/postgresql/xa/PGXAConnection.java:309
-msgid "Prepare called before end"
+#: org/postgresql/copy/PGCopyOutputStream.java:71
+#, java-format
+msgid "Cannot write to copy a byte of value {0}"
msgstr ""
-#: org/postgresql/xa/PGXAConnection.java:317
-#, fuzzy
-msgid "Server versions prior to 8.1 do not support two-phase commit."
-msgstr "Verze serveru ni��� ne� 8.0 nepodporuj� savepoints."
-
-#: org/postgresql/xa/PGXAConnection.java:334
-msgid "Error preparing transaction"
+#: org/postgresql/fastpath/Fastpath.java:80
+#, java-format
+msgid "Fastpath call {0} - No result was returned and we expected a numeric."
msgstr ""
-#: org/postgresql/xa/PGXAConnection.java:349
-msgid "Invalid flag"
+#: org/postgresql/fastpath/Fastpath.java:157
+#, java-format
+msgid "Fastpath call {0} - No result was returned and we expected an integer."
msgstr ""
-#: org/postgresql/xa/PGXAConnection.java:384
-msgid "Error during recover"
+#: org/postgresql/fastpath/Fastpath.java:165
+#, java-format
+msgid ""
+"Fastpath call {0} - No result was returned or wrong size while expecting an "
+"integer."
msgstr ""
-#: org/postgresql/xa/PGXAConnection.java:423
-#: org/postgresql/xa/PGXAConnection.java:426
-msgid "Error rolling back prepared transaction"
-msgstr ""
+#: org/postgresql/fastpath/Fastpath.java:182
+#, fuzzy, java-format
+msgid "Fastpath call {0} - No result was returned and we expected a long."
+msgstr "Obdr�en v�sledek, ikdy� ��dn� nebyl o�ek�v�n."
-#: org/postgresql/xa/PGXAConnection.java:464
+#: org/postgresql/fastpath/Fastpath.java:190
+#, java-format
msgid ""
-"Not implemented: one-phase commit must be issued using the same connection "
-"that was used to start it"
+"Fastpath call {0} - No result was returned or wrong size while expecting a "
+"long."
msgstr ""
-#: org/postgresql/xa/PGXAConnection.java:468
-msgid "commit called before end"
+#: org/postgresql/fastpath/Fastpath.java:302
+#, java-format
+msgid "The fastpath function {0} is unknown."
msgstr ""
-#: org/postgresql/xa/PGXAConnection.java:478
-msgid "Error during one-phase commit"
-msgstr ""
+#~ msgid ""
+#~ "Connection refused. Check that the hostname and port are correct and that "
+#~ "the postmaster is accepting TCP/IP connections."
+#~ msgstr ""
+#~ "Spojen� odm�tnuto. Zkontrolujte zda je jm�no hosta a port spr�vn� a zda "
+#~ "postmaster p�ij�m� TCP/IP spojen�."
-#: org/postgresql/xa/PGXAConnection.java:497
-msgid ""
-"Not implemented: 2nd phase commit must be issued using an idle connection"
-msgstr ""
+#, fuzzy
+#~ msgid "The connection url is invalid."
+#~ msgstr "Pokus o p�ipojen� selhal."
-#: org/postgresql/xa/PGXAConnection.java:513
-msgid "Error committing prepared transaction"
-msgstr ""
+#~ msgid "Connection rejected: {0}."
+#~ msgstr "Spojen� odm�tnuto: {0}."
-#: org/postgresql/xa/PGXAConnection.java:529
-msgid "Heuristic commit/rollback not supported"
-msgstr ""
+#~ msgid "Backend start-up failed: {0}."
+#~ msgstr "Selhal start backendu: {0}."
+
+#~ msgid "Server versions prior to 8.0 do not support savepoints."
+#~ msgstr "Verze serveru ni��� ne� 8.0 nepodporuj� savepoints."
+
+#~ msgid "Unexpected error while decoding character data from a large object."
+#~ msgstr "Neo�ek�van� chyba b�ham dek�dov�n� znaku z velk�ho objektu."
+
+#, fuzzy
+#~ msgid ""
+#~ "Returning autogenerated keys is only supported for 8.2 and later servers."
+#~ msgstr "Vr�cen� automaticky generovan�ch kl��� nen� podporov�no."
+
+#~ msgid ""
+#~ "Infinite value found for timestamp/date. This cannot be represented as "
+#~ "time."
+#~ msgstr ""
+#~ "Nekone�n� hodnota pro timestamp/date. Toto nem��e reprezentovat �as."
+
+#, fuzzy
+#~ msgid "Server versions prior to 8.1 do not support two-phase commit."
+#~ msgstr "Verze serveru ni��� ne� 8.0 nepodporuj� savepoints."
#~ msgid "The class {0} does not implement org.postgresql.util.PGobject."
#~ msgstr "T��da {0} nepodporuje org.postgresql.util.PGobject."
diff --git a/pgjdbc/src/main/java/org/postgresql/translation/de.po b/pgjdbc/src/main/java/org/postgresql/translation/de.po
index cf12c28..a684dbc 100644
--- a/pgjdbc/src/main/java/org/postgresql/translation/de.po
+++ b/pgjdbc/src/main/java/org/postgresql/translation/de.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: head-de\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-01-07 13:37+0300\n"
+"POT-Creation-Date: 2018-03-10 23:24+0300\n"
"PO-Revision-Date: 2008-09-12 14:22+0200\n"
"Last-Translator: Andre Bialojahn <ab.spamnews at freenet.de>\n"
"Language-Team: Deutsch\n"
@@ -20,427 +20,416 @@ msgstr ""
"X-Poedit-Language: German\n"
"X-Poedit-Country: GERMANY\n"
-#: org/postgresql/copy/CopyManager.java:57
-#, java-format
-msgid "Requested CopyIn but got {0}"
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:164
+msgid "The sslfactoryarg property may not be empty."
msgstr ""
-#: org/postgresql/copy/CopyManager.java:69
-#, java-format
-msgid "Requested CopyOut but got {0}"
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:180
+msgid ""
+"The environment variable containing the server's SSL certificate must not be "
+"empty."
msgstr ""
-#: org/postgresql/copy/PGCopyInputStream.java:54
-#, fuzzy, java-format
-msgid "Copying from database failed: {0}"
-msgstr "Konnte �{0}� nicht in Typ �box� umwandeln"
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:188
+msgid ""
+"The system property containing the server's SSL certificate must not be "
+"empty."
+msgstr ""
+
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:195
+msgid ""
+"The sslfactoryarg property must start with the prefix file:, classpath:, "
+"env:, sys:, or -----BEGIN CERTIFICATE-----."
+msgstr ""
-#: org/postgresql/copy/PGCopyInputStream.java:70
-#: org/postgresql/copy/PGCopyOutputStream.java:97
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:207
#, fuzzy
-msgid "This copy stream is closed."
-msgstr "Dieses ResultSet ist geschlossen."
+msgid "An error occurred reading the certificate"
+msgstr "Beim Aufbau der SSL-Verbindung trat ein Fehler auf."
-#: org/postgresql/copy/PGCopyInputStream.java:113
-msgid "Read from copy failed."
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:240
+msgid "No X509TrustManager found"
msgstr ""
-#: org/postgresql/copy/PGCopyOutputStream.java:74
-#, java-format
-msgid "Cannot write to copy a byte of value {0}"
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:133
+msgid ""
+"Could not find a java cryptographic algorithm: X.509 CertificateFactory not "
+"available."
msgstr ""
-#: org/postgresql/core/ConnectionFactory.java:74
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:143
#, java-format
-msgid "A connection could not be made using the requested protocol {0}."
+msgid "Could not open SSL certificate file {0}."
msgstr ""
-"Es konnte keine Verbindung unter Verwendung des Protokolls {0} hergestellt "
-"werden."
-#: org/postgresql/core/Oid.java:114
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:148
#, java-format
-msgid "oid type {0} not known and not a number"
+msgid "Loading the SSL certificate {0} into a KeyManager failed."
msgstr ""
-#: org/postgresql/core/Parser.java:616
-#, java-format
-msgid "Malformed function or procedure escape syntax at offset {0}."
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:205
+msgid "Enter SSL password: "
msgstr ""
-"Unzul�ssige Syntax f�r ein Funktions- oder Prozedur-Escape an Offset {0}."
-#: org/postgresql/core/PGStream.java:497
-#, java-format
-msgid "Premature end of input stream, expected {0} bytes, but only read {1}."
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:212
+msgid "Could not read password for SSL key file, console is not available."
msgstr ""
-"Vorzeitiges Ende des Eingabedatenstroms. Es wurden {0} Bytes erwartet, "
-"jedoch nur {1} gelesen."
-#: org/postgresql/core/PGStream.java:538
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:217
#, java-format
-msgid "Expected an EOF from server, got: {0}"
-msgstr "Vom Server wurde ein EOF erwartet, jedoch {0} gelesen."
-
-#: org/postgresql/core/SetupQueryRunner.java:90
-msgid "An unexpected result was returned by a query."
-msgstr "Eine Abfrage lieferte ein unerwartetes Resultat."
+msgid "Could not read password for SSL key file by callbackhandler {0}."
+msgstr ""
-#: org/postgresql/core/UTF8Encoding.java:31
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:236
#, java-format
-msgid ""
-"Illegal UTF-8 sequence: byte {0} of {1} byte sequence is not 10xxxxxx: {2}"
+msgid "Could not decrypt SSL key file {0}."
msgstr ""
-"Ung�ltige UTF-8-Sequenz: Byte {0} der {1} Bytesequenz ist nicht 10xxxxxx: {2}"
-#: org/postgresql/core/UTF8Encoding.java:69
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:250
#, java-format
-msgid "Illegal UTF-8 sequence: {0} bytes used to encode a {1} byte value: {2}"
+msgid "Could not read SSL key file {0}."
msgstr ""
-"Ung�ltige UTF-8-Sequenz: {0} Bytes wurden verwendet um einen {1} Bytewert zu "
-"kodieren: {2}"
-#: org/postgresql/core/UTF8Encoding.java:104
-#: org/postgresql/core/UTF8Encoding.java:131
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:253
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:176
#, java-format
-msgid "Illegal UTF-8 sequence: initial byte is {0}: {1}"
-msgstr "Ung�ltige UTF-8-Sequenz: das erste Byte ist {0}: {1}"
+msgid "Could not find a java cryptographic algorithm: {0}."
+msgstr ""
+
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:99
+#, fuzzy, java-format
+msgid "The password callback class provided {0} could not be instantiated."
+msgstr ""
+"Die von {0} bereitgestellte SSLSocketFactory-Klasse konnte nicht "
+"instanziiert werden."
-#: org/postgresql/core/UTF8Encoding.java:137
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:132
#, java-format
-msgid "Illegal UTF-8 sequence: final value is out of range: {0}"
+msgid "Could not open SSL root certificate file {0}."
msgstr ""
-"Ung�ltige UTF-8-Sequenz: Der letzte Wert ist au�erhalb des zul�ssigen "
-"Bereichs: {0}"
-#: org/postgresql/core/UTF8Encoding.java:153
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:147
#, java-format
-msgid "Illegal UTF-8 sequence: final value is a surrogate value: {0}"
-msgstr "Ung�ltige UTF-8-Sequenz: der letzte Wert ist ein Ersatzwert: {0}"
+msgid "Could not read SSL root certificate file {0}."
+msgstr ""
-#: org/postgresql/core/Utils.java:119 org/postgresql/core/Utils.java:136
-msgid "Zero bytes may not occur in string parameters."
-msgstr "Stringparameter d�rfen keine Nullbytes enthalten."
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:151
+#, java-format
+msgid "Loading the SSL root certificate {0} into a TrustManager failed."
+msgstr ""
-#: org/postgresql/core/Utils.java:146 org/postgresql/core/Utils.java:217
-msgid "No IOException expected from StringBuffer or StringBuilder"
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:170
+msgid "Could not initialize SSL context."
msgstr ""
-#: org/postgresql/core/Utils.java:206
-msgid "Zero bytes may not occur in identifiers."
-msgstr "Nullbytes d�rfen in Bezeichnern nicht vorkommen."
+#: org/postgresql/ssl/MakeSSL.java:52
+#, java-format
+msgid "The SSLSocketFactory class provided {0} could not be instantiated."
+msgstr ""
+"Die von {0} bereitgestellte SSLSocketFactory-Klasse konnte nicht "
+"instanziiert werden."
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:72
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:87
-#, fuzzy, java-format
-msgid "Invalid sslmode value: {0}"
-msgstr "Ung�ltige L�nge des Datenstroms: {0}."
+#: org/postgresql/ssl/MakeSSL.java:67
+#, java-format
+msgid "SSL error: {0}"
+msgstr ""
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:87
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:111
+#: org/postgresql/ssl/MakeSSL.java:78
#, fuzzy, java-format
-msgid "Invalid targetServerType value: {0}"
-msgstr "Ung�ltige L�nge des Datenstroms: {0}."
+msgid "The HostnameVerifier class provided {0} could not be instantiated."
+msgstr ""
+"Die von {0} bereitgestellte SSLSocketFactory-Klasse konnte nicht "
+"instanziiert werden."
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:152
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:228
+#: org/postgresql/ssl/MakeSSL.java:84
#, java-format
-msgid "Could not find a server with specified targetServerType: {0}"
+msgid "The hostname {0} could not be verified by hostnameverifier {1}."
msgstr ""
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:172
-msgid ""
-"Connection refused. Check that the hostname and port are correct and that "
-"the postmaster is accepting TCP/IP connections."
+#: org/postgresql/ssl/MakeSSL.java:93
+#, java-format
+msgid "The hostname {0} could not be verified."
msgstr ""
-"Verbindung verweigert. �berpr�fen Sie die Korrektheit von Hostnamen und der "
-"Portnummer und dass der Datenbankserver TCP/IP-Verbindungen annimmt."
-
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:181
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:262
-msgid "The connection attempt failed."
-msgstr "Der Verbindungsversuch schlug fehl."
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:192
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:273
-#, fuzzy
-msgid "The connection url is invalid."
-msgstr "Der Verbindungsversuch schlug fehl."
-
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:218
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:233
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:324
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:339
-msgid "The server does not support SSL."
-msgstr "Der Server unterst�tzt SSL nicht."
+#: org/postgresql/gss/GssAction.java:126
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2550
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2581
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2585
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2640
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2650
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2659
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:655
+msgid "Protocol error. Session setup failed."
+msgstr "Protokollfehler. Die Sitzung konnte nicht gestartet werden."
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:249
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:355
-msgid "An error occurred while setting up the SSL connection."
-msgstr "Beim Aufbau der SSL-Verbindung trat ein Fehler auf."
+#: org/postgresql/gss/GssAction.java:137 org/postgresql/gss/MakeGSS.java:66
+#: org/postgresql/gss/MakeGSS.java:74
+msgid "GSS Authentication failed"
+msgstr ""
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:300
+#: org/postgresql/core/Parser.java:933
#, java-format
-msgid "Connection rejected: {0}."
-msgstr "Verbindung abgewiesen: {0}."
+msgid "Malformed function or procedure escape syntax at offset {0}."
+msgstr ""
+"Unzul�ssige Syntax f�r ein Funktions- oder Prozedur-Escape an Offset {0}."
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:321
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:349
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:375
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:456
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:486
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:515
-msgid ""
-"The server requested password-based authentication, but no password was "
-"provided."
+#: org/postgresql/core/SocketFactoryFactory.java:41
+#, fuzzy, java-format
+msgid "The SocketFactory class provided {0} could not be instantiated."
msgstr ""
-"Der Server verlangt passwortbasierte Authentifizierung, jedoch wurde kein "
-"Passwort angegeben."
+"Die von {0} bereitgestellte SSLSocketFactory-Klasse konnte nicht "
+"instanziiert werden."
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:405
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:625
-#, java-format
-msgid ""
-"The authentication type {0} is not supported. Check that you have configured "
-"the pg_hba.conf file to include the client''s IP address or subnet, and that "
-"it is using an authentication scheme supported by the driver."
+#: org/postgresql/core/Utils.java:93 org/postgresql/core/Utils.java:110
+msgid "Zero bytes may not occur in string parameters."
+msgstr "Stringparameter d�rfen keine Nullbytes enthalten."
+
+#: org/postgresql/core/Utils.java:120 org/postgresql/core/Utils.java:170
+msgid "No IOException expected from StringBuffer or StringBuilder"
msgstr ""
-"Der Authentifizierungstyp {0} wird nicht unterst�tzt. Stellen Sie sicher, "
-"dass die Datei ''pg_hba.conf'' die IP-Adresse oder das Subnetz des Clients "
-"enth�lt und dass der Client ein Authentifizierungsschema nutzt, das vom "
-"Treiber unterst�tzt wird."
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:412
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:455
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:632
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:688
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:744
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:754
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:763
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:774
-#: org/postgresql/gss/GssAction.java:130
-msgid "Protocol error. Session setup failed."
-msgstr "Protokollfehler. Die Sitzung konnte nicht gestartet werden."
+#: org/postgresql/core/Utils.java:159
+msgid "Zero bytes may not occur in identifiers."
+msgstr "Nullbytes d�rfen in Bezeichnern nicht vorkommen."
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:443
-#, java-format
-msgid "Backend start-up failed: {0}."
-msgstr "Das Backend konnte nicht gestartet werden: {0}."
-
-#: org/postgresql/core/v2/FastpathParameterList.java:63
-#: org/postgresql/core/v2/FastpathParameterList.java:89
-#: org/postgresql/core/v2/FastpathParameterList.java:100
-#: org/postgresql/core/v2/FastpathParameterList.java:111
-#: org/postgresql/core/v2/SimpleParameterList.java:70
-#: org/postgresql/core/v2/SimpleParameterList.java:94
-#: org/postgresql/core/v2/SimpleParameterList.java:105
-#: org/postgresql/core/v2/SimpleParameterList.java:116
-#: org/postgresql/core/v2/SimpleParameterList.java:127
-#: org/postgresql/core/v3/CompositeParameterList.java:36
-#: org/postgresql/core/v3/SimpleParameterList.java:53
-#: org/postgresql/core/v3/SimpleParameterList.java:64
-#: org/postgresql/jdbc/PgResultSet.java:2715
-#: org/postgresql/jdbc/PgResultSetMetaData.java:472
+#: org/postgresql/core/UTF8Encoding.java:28
#, java-format
-msgid "The column index is out of range: {0}, number of columns: {1}."
+msgid ""
+"Illegal UTF-8 sequence: byte {0} of {1} byte sequence is not 10xxxxxx: {2}"
msgstr ""
-"Der Spaltenindex {0} ist au�erhalb des g�ltigen Bereichs. Anzahl Spalten: "
-"{1}."
+"Ung�ltige UTF-8-Sequenz: Byte {0} der {1} Bytesequenz ist nicht 10xxxxxx: {2}"
-#: org/postgresql/core/v2/FastpathParameterList.java:164
-#: org/postgresql/core/v2/SimpleParameterList.java:191
-#: org/postgresql/core/v3/SimpleParameterList.java:225
+#: org/postgresql/core/UTF8Encoding.java:66
#, java-format
-msgid "No value specified for parameter {0}."
-msgstr "F�r den Parameter {0} wurde kein Wert angegeben."
+msgid "Illegal UTF-8 sequence: {0} bytes used to encode a {1} byte value: {2}"
+msgstr ""
+"Ung�ltige UTF-8-Sequenz: {0} Bytes wurden verwendet um einen {1} Bytewert zu "
+"kodieren: {2}"
-#: org/postgresql/core/v2/QueryExecutorImpl.java:87
-#: org/postgresql/core/v2/QueryExecutorImpl.java:347
-#: org/postgresql/core/v3/QueryExecutorImpl.java:404
-#: org/postgresql/core/v3/QueryExecutorImpl.java:465
+#: org/postgresql/core/UTF8Encoding.java:102
+#: org/postgresql/core/UTF8Encoding.java:129
#, java-format
-msgid "Expected command status BEGIN, got {0}."
-msgstr "Statt des erwarteten Befehlsstatus BEGIN, wurde {0} empfangen."
+msgid "Illegal UTF-8 sequence: initial byte is {0}: {1}"
+msgstr "Ung�ltige UTF-8-Sequenz: das erste Byte ist {0}: {1}"
-#: org/postgresql/core/v2/QueryExecutorImpl.java:92
-#: org/postgresql/core/v3/QueryExecutorImpl.java:470
-#: org/postgresql/jdbc/PgResultSet.java:1731
+#: org/postgresql/core/UTF8Encoding.java:135
#, java-format
-msgid "Unexpected command status: {0}."
-msgstr "Unerwarteter Befehlsstatus: {0}."
-
-#: org/postgresql/core/v2/QueryExecutorImpl.java:127
-#: org/postgresql/core/v2/QueryExecutorImpl.java:136
-#: org/postgresql/core/v2/QueryExecutorImpl.java:185
-#: org/postgresql/core/v2/QueryExecutorImpl.java:376
-#: org/postgresql/core/v3/QueryExecutorImpl.java:226
-#: org/postgresql/core/v3/QueryExecutorImpl.java:364
-#: org/postgresql/core/v3/QueryExecutorImpl.java:441
-#: org/postgresql/core/v3/QueryExecutorImpl.java:505
-#: org/postgresql/core/v3/QueryExecutorImpl.java:587
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2211
-#: org/postgresql/util/StreamWrapper.java:133
-#, fuzzy
-msgid "An I/O error occurred while sending to the backend."
-msgstr "Eingabe/Ausgabe-Fehler {0} beim Senden an das Backend."
+msgid "Illegal UTF-8 sequence: final value is out of range: {0}"
+msgstr ""
+"Ung�ltige UTF-8-Sequenz: Der letzte Wert ist au�erhalb des zul�ssigen "
+"Bereichs: {0}"
-#: org/postgresql/core/v2/QueryExecutorImpl.java:180
-#: org/postgresql/core/v2/QueryExecutorImpl.java:235
-#: org/postgresql/core/v2/QueryExecutorImpl.java:249
-#: org/postgresql/core/v3/QueryExecutorImpl.java:582
-#: org/postgresql/core/v3/QueryExecutorImpl.java:642
+#: org/postgresql/core/UTF8Encoding.java:151
#, java-format
-msgid "Unknown Response Type {0}."
-msgstr "Die Antwort weist einen unbekannten Typ auf: {0}."
+msgid "Illegal UTF-8 sequence: final value is a surrogate value: {0}"
+msgstr "Ung�ltige UTF-8-Sequenz: der letzte Wert ist ein Ersatzwert: {0}"
-#: org/postgresql/core/v2/QueryExecutorImpl.java:453
-#: org/postgresql/core/v2/QueryExecutorImpl.java:503
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1962
-msgid "Ran out of memory retrieving query results."
-msgstr "Nicht gen�gend Speicher beim Abholen der Abfrageergebnisse."
+#: org/postgresql/core/SetupQueryRunner.java:64
+msgid "An unexpected result was returned by a query."
+msgstr "Eine Abfrage lieferte ein unerwartetes Resultat."
-#: org/postgresql/core/v2/QueryExecutorImpl.java:640
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2328
+#: org/postgresql/core/PGStream.java:486
#, java-format
-msgid "Unable to interpret the update count in command completion tag: {0}."
-msgstr ""
-"Der Updatecount aus der Kommandovervollst�ndigungsmarkierung(?) {0} konnte "
-"nicht interpretiert werden."
-
-#: org/postgresql/core/v2/QueryExecutorImpl.java:654
-msgid "Copy not implemented for protocol version 2"
+msgid "Premature end of input stream, expected {0} bytes, but only read {1}."
msgstr ""
+"Vorzeitiges Ende des Eingabedatenstroms. Es wurden {0} Bytes erwartet, "
+"jedoch nur {1} gelesen."
-#: org/postgresql/core/v2/SocketFactoryFactory.java:36
-#, fuzzy, java-format
-msgid "The SocketFactory class provided {0} could not be instantiated."
-msgstr ""
-"Die von {0} bereitgestellte SSLSocketFactory-Klasse konnte nicht "
-"instanziiert werden."
+#: org/postgresql/core/PGStream.java:528
+#, java-format
+msgid "Expected an EOF from server, got: {0}"
+msgstr "Vom Server wurde ein EOF erwartet, jedoch {0} gelesen."
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:253
-#, fuzzy, java-format
-msgid ""
-"Connection to {0} refused. Check that the hostname and port are correct and "
-"that the postmaster is accepting TCP/IP connections."
+#: org/postgresql/core/v3/CopyOperationImpl.java:54
+msgid "CommandComplete expected COPY but got: "
msgstr ""
-"Verbindung verweigert. �berpr�fen Sie die Korrektheit von Hostnamen und der "
-"Portnummer und dass der Datenbankserver TCP/IP-Verbindungen annimmt."
-#: org/postgresql/core/v3/CopyOperationImpl.java:57
-msgid "CommandComplete expected COPY but got: "
+#: org/postgresql/core/v3/CopyInImpl.java:47
+msgid "CopyIn copy direction can't receive data"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:83
+#: org/postgresql/core/v3/QueryExecutorImpl.java:161
msgid "Tried to obtain lock while already holding it"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:98
+#: org/postgresql/core/v3/QueryExecutorImpl.java:177
msgid "Tried to break lock on database connection"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:115
+#: org/postgresql/core/v3/QueryExecutorImpl.java:195
#, fuzzy
msgid "Interrupted while waiting to obtain lock on database connection"
msgstr "Beim Verbindungsversuch trat eine Unterbrechung auf."
-#: org/postgresql/core/v3/QueryExecutorImpl.java:220
+#: org/postgresql/core/v3/QueryExecutorImpl.java:327
msgid "Unable to bind parameter values for statement."
msgstr "Der Anweisung konnten keine Parameterwerte zugewiesen werden."
-#: org/postgresql/core/v3/QueryExecutorImpl.java:689
+#: org/postgresql/core/v3/QueryExecutorImpl.java:333
+#: org/postgresql/core/v3/QueryExecutorImpl.java:485
+#: org/postgresql/core/v3/QueryExecutorImpl.java:559
+#: org/postgresql/core/v3/QueryExecutorImpl.java:602
+#: org/postgresql/core/v3/QueryExecutorImpl.java:729
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2372
+#: org/postgresql/util/StreamWrapper.java:130
+#, fuzzy
+msgid "An I/O error occurred while sending to the backend."
+msgstr "Eingabe/Ausgabe-Fehler {0} beim Senden an das Backend."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:534
+#: org/postgresql/core/v3/QueryExecutorImpl.java:576
+#, java-format
+msgid "Expected command status BEGIN, got {0}."
+msgstr "Statt des erwarteten Befehlsstatus BEGIN, wurde {0} empfangen."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:581
+#: org/postgresql/jdbc/PgResultSet.java:1778
+#, java-format
+msgid "Unexpected command status: {0}."
+msgstr "Unerwarteter Befehlsstatus: {0}."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:687
+#, fuzzy
+msgid "An error occurred while trying to get the socket timeout."
+msgstr "Eingabe/Ausgabe-Fehler {0} beim Senden an das Backend."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:722
+#: org/postgresql/core/v3/QueryExecutorImpl.java:798
+#, java-format
+msgid "Unknown Response Type {0}."
+msgstr "Die Antwort weist einen unbekannten Typ auf: {0}."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:745
+#, fuzzy
+msgid "An error occurred while trying to reset the socket timeout."
+msgstr "Eingabe/Ausgabe-Fehler {0} beim Senden an das Backend."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:843
msgid "Database connection failed when starting copy"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:724
+#: org/postgresql/core/v3/QueryExecutorImpl.java:878
msgid "Tried to cancel an inactive copy operation"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:765
+#: org/postgresql/core/v3/QueryExecutorImpl.java:917
msgid "Database connection failed when canceling copy operation"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:781
+#: org/postgresql/core/v3/QueryExecutorImpl.java:933
msgid "Missing expected error response to copy cancel request"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:785
+#: org/postgresql/core/v3/QueryExecutorImpl.java:937
#, java-format
msgid "Got {0} error responses to single copy cancel request"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:800
+#: org/postgresql/core/v3/QueryExecutorImpl.java:952
msgid "Tried to end inactive copy"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:815
+#: org/postgresql/core/v3/QueryExecutorImpl.java:967
msgid "Database connection failed when ending copy"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:833
-#: org/postgresql/core/v3/QueryExecutorImpl.java:855
+#: org/postgresql/core/v3/QueryExecutorImpl.java:985
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1005
msgid "Tried to write to an inactive copy operation"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:848
-#: org/postgresql/core/v3/QueryExecutorImpl.java:863
+#: org/postgresql/core/v3/QueryExecutorImpl.java:998
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1013
msgid "Database connection failed when writing to copy"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:877
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1028
msgid "Tried to read from inactive copy"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:884
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1035
msgid "Database connection failed when reading from copy"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:956
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1101
#, java-format
msgid "Received CommandComplete ''{0}'' without an active copy operation"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:983
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1126
#, java-format
msgid "Got CopyInResponse from server during an active {0}"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:999
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1140
#, java-format
msgid "Got CopyOutResponse from server during an active {0}"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1017
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1154
+#, java-format
+msgid "Got CopyBothResponse from server during an active {0}"
+msgstr ""
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1170
msgid "Got CopyData without an active copy operation"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1021
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1174
#, fuzzy, java-format
msgid "Unexpected copydata from server for {0}"
msgstr "Vom Server wurde ein EOF erwartet, jedoch {0} gelesen."
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1061
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2037
-#, fuzzy, java-format
-msgid ""
-"The server''s client_encoding parameter was changed to {0}. The JDBC driver "
-"requires client_encoding to be UTF8 for correct operation."
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1234
+#, java-format
+msgid "Unexpected packet type during copy: {0}"
msgstr ""
-"Der Parameter ''client_encoding'' wurde auf dem Server auf {0} ver�ndert. "
-"Der JDBC-Treiber setzt f�r korrektes Funktionieren die Einstellung UNICODE "
-"voraus."
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1069
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2045
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1524
#, java-format
msgid ""
-"The server''s DateStyle parameter was changed to {0}. The JDBC driver "
-"requires DateStyle to begin with ISO for correct operation."
+"Bind message length {0} too long. This can be caused by very large or "
+"incorrect length specifications on InputStream parameters."
msgstr ""
-"Der Parameter ''Date Style'' wurde auf dem Server auf {0} ver�ndert. Der "
+"Die Nachrichtenl�nge {0} ist zu gro�. Das kann von sehr gro�en oder "
+"inkorrekten L�ngenangaben eines InputStream-Parameters herr�hren."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2145
+msgid "Ran out of memory retrieving query results."
+msgstr "Nicht gen�gend Speicher beim Abholen der Abfrageergebnisse."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2313
+msgid "The driver currently does not support COPY operations."
+msgstr "Der Treiber unterst�tzt derzeit keine COPY-Operationen."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2487
+#, fuzzy, java-format
+msgid "Unable to parse the count in command completion tag: {0}."
+msgstr ""
+"Der Updatecount aus der Kommandovervollst�ndigungsmarkierung(?) {0} konnte "
+"nicht interpretiert werden."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2603
+#, fuzzy, java-format
+msgid ""
+"The server''s client_encoding parameter was changed to {0}. The JDBC driver "
+"requires client_encoding to be UTF8 for correct operation."
+msgstr ""
+"Der Parameter ''client_encoding'' wurde auf dem Server auf {0} ver�ndert. "
+"Der JDBC-Treiber setzt f�r korrektes Funktionieren die Einstellung UNICODE "
+"voraus."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2611
+#, java-format
+msgid ""
+"The server''s DateStyle parameter was changed to {0}. The JDBC driver "
+"requires DateStyle to begin with ISO for correct operation."
+msgstr ""
+"Der Parameter ''Date Style'' wurde auf dem Server auf {0} ver�ndert. Der "
"JDBC-Treiber setzt f�r korrekte Funktion voraus, dass ''Date Style'' mit "
"''ISO'' beginnt."
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1083
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2059
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2624
#, java-format
msgid ""
"The server''s standard_conforming_strings parameter was reported as {0}. The "
@@ -449,66 +438,202 @@ msgstr ""
"Der standard_conforming_strings Parameter des Servers steht auf {0}. Der "
"JDBC-Treiber erwartete on oder off."
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1122
+#: org/postgresql/core/v3/SimpleParameterList.java:54
+#: org/postgresql/core/v3/SimpleParameterList.java:65
+#: org/postgresql/core/v3/CompositeParameterList.java:33
+#: org/postgresql/jdbc/PgResultSetMetaData.java:493
+#: org/postgresql/jdbc/PgResultSet.java:2751
#, java-format
-msgid "Unexpected packet type during copy: {0}"
+msgid "The column index is out of range: {0}, number of columns: {1}."
+msgstr ""
+"Der Spaltenindex {0} ist au�erhalb des g�ltigen Bereichs. Anzahl Spalten: "
+"{1}."
+
+#: org/postgresql/core/v3/SimpleParameterList.java:257
+#, java-format
+msgid "No value specified for parameter {0}."
+msgstr "F�r den Parameter {0} wurde kein Wert angegeben."
+
+#: org/postgresql/core/v3/SimpleParameterList.java:431
+#, fuzzy, java-format
+msgid "Added parameters index out of range: {0}, number of columns: {1}."
msgstr ""
+"Der Parameterindex {0} ist au�erhalb des g�ltigen Bereichs. Es gibt {1} "
+"Parameter."
+
+#: org/postgresql/core/v3/replication/V3ReplicationProtocol.java:133
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:257
+msgid "The connection attempt failed."
+msgstr "Der Verbindungsversuch schlug fehl."
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1393
+#: org/postgresql/core/v3/replication/V3PGReplicationStream.java:144
#, java-format
+msgid "Unexpected packet type during replication: {0}"
+msgstr ""
+
+#: org/postgresql/core/v3/replication/V3PGReplicationStream.java:269
+#, fuzzy
+msgid "This replication stream has been closed."
+msgstr "Die Verbindung wurde geschlossen."
+
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:109
+#, fuzzy, java-format
+msgid "Invalid sslmode value: {0}"
+msgstr "Ung�ltige L�nge des Datenstroms: {0}."
+
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:124
+#, fuzzy, java-format
+msgid "Invalid targetServerType value: {0}"
+msgstr "Ung�ltige L�nge des Datenstroms: {0}."
+
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:246
+#, fuzzy, java-format
msgid ""
-"Bind message length {0} too long. This can be caused by very large or "
-"incorrect length specifications on InputStream parameters."
+"Connection to {0} refused. Check that the hostname and port are correct and "
+"that the postmaster is accepting TCP/IP connections."
msgstr ""
-"Die Nachrichtenl�nge {0} ist zu gro�. Das kann von sehr gro�en oder "
-"inkorrekten L�ngenangaben eines InputStream-Parameters herr�hren."
+"Verbindung verweigert. �berpr�fen Sie die Korrektheit von Hostnamen und der "
+"Portnummer und dass der Datenbankserver TCP/IP-Verbindungen annimmt."
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2131
-msgid "The driver currently does not support COPY operations."
-msgstr "Der Treiber unterst�tzt derzeit keine COPY-Operationen."
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:272
+#, java-format
+msgid "Could not find a server with specified targetServerType: {0}"
+msgstr ""
-#: org/postgresql/Driver.java:234
-msgid "Error loading default settings from driverconfig.properties"
-msgstr "Fehler beim Laden der Voreinstellungen aus driverconfig.properties"
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:366
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:379
+msgid "The server does not support SSL."
+msgstr "Der Server unterst�tzt SSL nicht."
-#: org/postgresql/Driver.java:247
-msgid "Properties for the driver contains a non-string value for the key "
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:393
+msgid "An error occurred while setting up the SSL connection."
+msgstr "Beim Aufbau der SSL-Verbindung trat ein Fehler auf."
+
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:494
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:521
+msgid ""
+"The server requested password-based authentication, but no password was "
+"provided."
msgstr ""
+"Der Server verlangt passwortbasierte Authentifizierung, jedoch wurde kein "
+"Passwort angegeben."
-#: org/postgresql/Driver.java:290
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:624
msgid ""
-"Your security policy has prevented the connection from being attempted. You "
-"probably need to grant the connect java.net.SocketPermission to the database "
-"server host and port that you wish to connect to."
+"SCRAM authentication is not supported by this driver. You need JDK >= 8 and "
+"pgjdbc >= 42.2.0 (not \".jre\" vesions)"
msgstr ""
-"Ihre Sicherheitsrichtlinie hat den Versuch des Verbindungsaufbaus "
-"verhindert. Sie m�ssen wahrscheinlich der Verbindung zum Datenbankrechner "
-"java.net.SocketPermission gew�hren, um den Rechner auf dem gew�hlten Port zu "
-"erreichen."
-#: org/postgresql/Driver.java:296 org/postgresql/Driver.java:362
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:648
+#, java-format
msgid ""
-"Something unusual has occurred to cause the driver to fail. Please report "
-"this exception."
+"The authentication type {0} is not supported. Check that you have configured "
+"the pg_hba.conf file to include the client''s IP address or subnet, and that "
+"it is using an authentication scheme supported by the driver."
msgstr ""
-"Etwas Ungew�hnliches ist passiert, das den Treiber fehlschlagen lie�. Bitte "
-"teilen Sie diesen Fehler mit."
+"Der Authentifizierungstyp {0} wird nicht unterst�tzt. Stellen Sie sicher, "
+"dass die Datei ''pg_hba.conf'' die IP-Adresse oder das Subnetz des Clients "
+"enth�lt und dass der Client ein Authentifizierungsschema nutzt, das vom "
+"Treiber unterst�tzt wird."
-#: org/postgresql/Driver.java:370
-msgid "Connection attempt timed out."
-msgstr "Keine Verbindung innerhalb des Zeitintervalls m�glich."
+#: org/postgresql/core/ConnectionFactory.java:57
+#, java-format
+msgid "A connection could not be made using the requested protocol {0}."
+msgstr ""
+"Es konnte keine Verbindung unter Verwendung des Protokolls {0} hergestellt "
+"werden."
-#: org/postgresql/Driver.java:383
-msgid "Interrupted while attempting to connect."
-msgstr "Beim Verbindungsversuch trat eine Unterbrechung auf."
+#: org/postgresql/core/Oid.java:116
+#, java-format
+msgid "oid type {0} not known and not a number"
+msgstr ""
+
+#: org/postgresql/util/HStoreConverter.java:43
+#: org/postgresql/util/HStoreConverter.java:74
+#: org/postgresql/jdbc/PgArray.java:210
+#: org/postgresql/jdbc/PgResultSet.java:1924
+msgid ""
+"Invalid character data was found. This is most likely caused by stored data "
+"containing characters that are invalid for the character set the database "
+"was created in. The most common example of this is storing 8bit data in a "
+"SQL_ASCII database."
+msgstr ""
+"Ung�ltige Zeichendaten. Das ist h�chstwahrscheinlich von in der Datenbank "
+"gespeicherten Zeichen hervorgerufen, die in einer anderen Kodierung "
+"vorliegen, als die, in der die Datenbank erstellt wurde. Das h�ufigste "
+"Beispiel daf�r ist es, 8Bit-Daten in SQL_ASCII-Datenbanken abzulegen."
+
+#: org/postgresql/util/PGmoney.java:62
+msgid "Conversion of money failed."
+msgstr "Die Umwandlung eines W�hrungsbetrags schlug fehl."
+
+#: org/postgresql/util/StreamWrapper.java:56
+#: org/postgresql/jdbc/PgPreparedStatement.java:1449
+msgid "Object is too large to send over the protocol."
+msgstr ""
+
+#: org/postgresql/util/PGInterval.java:152
+msgid "Conversion of interval failed"
+msgstr "Die Umwandlung eines Intervalls schlug fehl."
-#: org/postgresql/Driver.java:645
+#: org/postgresql/util/ServerErrorMessage.java:45
#, java-format
-msgid "Method {0} is not yet implemented."
-msgstr "Die Methode {0} ist noch nicht implementiert."
+msgid ""
+" (pgjdbc: autodetected server-encoding to be {0}, if the message is not "
+"readable, please check database logs and/or host, port, dbname, user, "
+"password, pg_hba.conf)"
+msgstr ""
+
+#: org/postgresql/util/ServerErrorMessage.java:176
+#, java-format
+msgid "Detail: {0}"
+msgstr "Detail: {0}"
+
+#: org/postgresql/util/ServerErrorMessage.java:181
+#, java-format
+msgid "Hint: {0}"
+msgstr "Hinweis: {0}"
+
+#: org/postgresql/util/ServerErrorMessage.java:185
+#, java-format
+msgid "Position: {0}"
+msgstr "Position: {0}"
+
+#: org/postgresql/util/ServerErrorMessage.java:189
+#, java-format
+msgid "Where: {0}"
+msgstr "Wobei: {0}"
+
+#: org/postgresql/util/ServerErrorMessage.java:195
+#, java-format
+msgid "Internal Query: {0}"
+msgstr "Interne Abfrage: {0}"
+
+#: org/postgresql/util/ServerErrorMessage.java:199
+#, java-format
+msgid "Internal Position: {0}"
+msgstr "Interne Position: {0}"
+
+#: org/postgresql/util/ServerErrorMessage.java:206
+#, java-format
+msgid "Location: File: {0}, Routine: {1}, Line: {2}"
+msgstr "Ort: Datei: {0}, Routine: {1}, Zeile: {2}."
+
+#: org/postgresql/util/ServerErrorMessage.java:211
+#, java-format
+msgid "Server SQLState: {0}"
+msgstr "Server SQLState: {0}"
+
+#: org/postgresql/ds/PGPoolingDataSource.java:269
+msgid "Failed to setup DataSource."
+msgstr ""
+
+#: org/postgresql/ds/PGPoolingDataSource.java:371
+msgid "DataSource has been closed."
+msgstr "Die Datenquelle wurde geschlossen."
-#: org/postgresql/ds/common/BaseDataSource.java:1037
-#: org/postgresql/ds/common/BaseDataSource.java:1047
+#: org/postgresql/ds/common/BaseDataSource.java:1132
+#: org/postgresql/ds/common/BaseDataSource.java:1142
#, fuzzy, java-format
msgid "Unsupported property name: {0}"
msgstr "Unbekannter Typ: {0}."
@@ -517,7 +642,7 @@ msgstr "Unbekannter Typ: {0}."
msgid "This PooledConnection has already been closed."
msgstr "Diese PooledConnection ist bereits geschlossen worden."
-#: org/postgresql/ds/PGPooledConnection.java:313
+#: org/postgresql/ds/PGPooledConnection.java:314
msgid ""
"Connection has been closed automatically because a new connection was opened "
"for the same PooledConnection or the PooledConnection has been closed."
@@ -526,416 +651,526 @@ msgstr ""
"Verbindung f�r die gleiche PooledConnection ge�ffnet wurde, oder die "
"PooledConnection geschlossen worden ist.."
-#: org/postgresql/ds/PGPooledConnection.java:314
+#: org/postgresql/ds/PGPooledConnection.java:315
msgid "Connection has been closed."
msgstr "Die Verbindung wurde geschlossen."
-#: org/postgresql/ds/PGPooledConnection.java:418
+#: org/postgresql/ds/PGPooledConnection.java:420
msgid "Statement has been closed."
msgstr "Die Anweisung wurde geschlossen."
-#: org/postgresql/ds/PGPoolingDataSource.java:269
-msgid "Failed to setup DataSource."
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:68
+msgid "No SCRAM mechanism(s) advertised by the server"
msgstr ""
-#: org/postgresql/ds/PGPoolingDataSource.java:371
-msgid "DataSource has been closed."
-msgstr "Die Datenquelle wurde geschlossen."
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:81
+msgid "Invalid or unsupported by client SCRAM mechanisms"
+msgstr ""
-#: org/postgresql/fastpath/Fastpath.java:82
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:117
#, fuzzy, java-format
-msgid "Fastpath call {0} - No result was returned and we expected a numeric."
-msgstr ""
-"Der Fastpath-Aufruf {0} gab kein Ergebnis zur�ck, jedoch wurde ein Integer "
-"erwartet."
+msgid "Invalid server-first-message: {0}"
+msgstr "Ung�ltige L�nge des Datenstroms: {0}."
-#: org/postgresql/fastpath/Fastpath.java:165
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:147
+#, fuzzy, java-format
+msgid "Invalid server-final-message: {0}"
+msgstr "Ung�ltige L�nge des Datenstroms: {0}."
+
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:153
#, java-format
-msgid "Fastpath call {0} - No result was returned and we expected an integer."
+msgid "SCRAM authentication failed, server returned error: {0}"
msgstr ""
-"Der Fastpath-Aufruf {0} gab kein Ergebnis zur�ck, jedoch wurde ein Integer "
-"erwartet."
-#: org/postgresql/fastpath/Fastpath.java:174
-#, fuzzy, java-format
-msgid ""
-"Fastpath call {0} - No result was returned or wrong size while expecting an "
-"integer."
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:160
+msgid "Invalid server SCRAM signature"
msgstr ""
-"Der Fastpath-Aufruf {0} gab kein Ergebnis zur�ck, jedoch wurde ein Integer "
-"erwartet."
-#: org/postgresql/fastpath/Fastpath.java:191
+#: org/postgresql/osgi/PGDataSourceFactory.java:82
#, fuzzy, java-format
-msgid "Fastpath call {0} - No result was returned and we expected a long."
+msgid "Unsupported properties: {0}"
+msgstr "Unbekannter Typ: {0}."
+
+#: org/postgresql/Driver.java:214
+msgid "Error loading default settings from driverconfig.properties"
+msgstr "Fehler beim Laden der Voreinstellungen aus driverconfig.properties"
+
+#: org/postgresql/Driver.java:226
+msgid "Properties for the driver contains a non-string value for the key "
msgstr ""
-"Der Fastpath-Aufruf {0} gab kein Ergebnis zur�ck, jedoch wurde ein Integer "
-"erwartet."
-#: org/postgresql/fastpath/Fastpath.java:200
-#, fuzzy, java-format
+#: org/postgresql/Driver.java:270
msgid ""
-"Fastpath call {0} - No result was returned or wrong size while expecting a "
-"long."
+"Your security policy has prevented the connection from being attempted. You "
+"probably need to grant the connect java.net.SocketPermission to the database "
+"server host and port that you wish to connect to."
msgstr ""
-"Der Fastpath-Aufruf {0} gab kein Ergebnis zur�ck, jedoch wurde ein Integer "
-"erwartet."
+"Ihre Sicherheitsrichtlinie hat den Versuch des Verbindungsaufbaus "
+"verhindert. Sie m�ssen wahrscheinlich der Verbindung zum Datenbankrechner "
+"java.net.SocketPermission gew�hren, um den Rechner auf dem gew�hlten Port zu "
+"erreichen."
+
+#: org/postgresql/Driver.java:276 org/postgresql/Driver.java:408
+msgid ""
+"Something unusual has occurred to cause the driver to fail. Please report "
+"this exception."
+msgstr ""
+"Etwas Ungew�hnliches ist passiert, das den Treiber fehlschlagen lie�. Bitte "
+"teilen Sie diesen Fehler mit."
+
+#: org/postgresql/Driver.java:416
+msgid "Connection attempt timed out."
+msgstr "Keine Verbindung innerhalb des Zeitintervalls m�glich."
+
+#: org/postgresql/Driver.java:429
+msgid "Interrupted while attempting to connect."
+msgstr "Beim Verbindungsversuch trat eine Unterbrechung auf."
-#: org/postgresql/fastpath/Fastpath.java:312
+#: org/postgresql/Driver.java:682
#, java-format
-msgid "The fastpath function {0} is unknown."
-msgstr "Die Fastpath-Funktion {0} ist unbekannt."
+msgid "Method {0} is not yet implemented."
+msgstr "Die Methode {0} ist noch nicht implementiert."
-#: org/postgresql/geometric/PGbox.java:79
-#: org/postgresql/geometric/PGcircle.java:76
-#: org/postgresql/geometric/PGcircle.java:84
-#: org/postgresql/geometric/PGline.java:109
-#: org/postgresql/geometric/PGline.java:118
-#: org/postgresql/geometric/PGlseg.java:72
-#: org/postgresql/geometric/PGpoint.java:78
+#: org/postgresql/geometric/PGlseg.java:70
+#: org/postgresql/geometric/PGline.java:107
+#: org/postgresql/geometric/PGline.java:116
+#: org/postgresql/geometric/PGcircle.java:74
+#: org/postgresql/geometric/PGcircle.java:82
+#: org/postgresql/geometric/PGpoint.java:76
+#: org/postgresql/geometric/PGbox.java:77
#, java-format
msgid "Conversion to type {0} failed: {1}."
msgstr "Die Umwandlung in den Typ {0} schlug fehl: {1}."
-#: org/postgresql/geometric/PGpath.java:73
+#: org/postgresql/geometric/PGpath.java:70
#, java-format
msgid "Cannot tell if path is open or closed: {0}."
msgstr ""
"Es konnte nicht ermittelt werden, ob der Pfad offen oder geschlossen ist: "
"{0}."
-#: org/postgresql/gss/GssAction.java:141 org/postgresql/gss/MakeGSS.java:69
-#: org/postgresql/gss/MakeGSS.java:77
-msgid "GSS Authentication failed"
-msgstr ""
-
-#: org/postgresql/jdbc/AbstractBlobClob.java:89
+#: org/postgresql/xa/PGXAConnection.java:128
msgid ""
-"Truncation of large objects is only implemented in 8.3 and later servers."
-msgstr ""
-"Das Abschneiden gro�er Objekte ist nur in Versionen nach 8.3 implementiert."
-
-#: org/postgresql/jdbc/AbstractBlobClob.java:94
-msgid "Cannot truncate LOB to a negative length."
+"Transaction control methods setAutoCommit(true), commit, rollback and "
+"setSavePoint not allowed while an XA transaction is active."
msgstr ""
-#: org/postgresql/jdbc/AbstractBlobClob.java:101
-#: org/postgresql/jdbc/AbstractBlobClob.java:245
-#, java-format
-msgid "PostgreSQL LOBs can only index to: {0}"
-msgstr "LOBs in PostgreSQL k�nnen nur auf {0} verweisen."
-
-#: org/postgresql/jdbc/AbstractBlobClob.java:241
-msgid "LOB positioning offsets start at 1."
-msgstr "Positionsoffsets f�r LOBs beginnen bei 1."
+#: org/postgresql/xa/PGXAConnection.java:177
+#: org/postgresql/xa/PGXAConnection.java:253
+#: org/postgresql/xa/PGXAConnection.java:347
+#, fuzzy, java-format
+msgid "Invalid flags {0}"
+msgstr "Ung�ltige Flags"
-#: org/postgresql/jdbc/AbstractBlobClob.java:257
-msgid "free() was called on this LOB previously"
-msgstr "free() wurde bereits f�r dieses LOB aufgerufen."
+#: org/postgresql/xa/PGXAConnection.java:181
+#: org/postgresql/xa/PGXAConnection.java:257
+#: org/postgresql/xa/PGXAConnection.java:449
+msgid "xid must not be null"
+msgstr "Die xid darf nicht null sein."
-#: org/postgresql/jdbc/BatchResultHandler.java:41
-#: org/postgresql/jdbc/PgConnection.java:474
-#: org/postgresql/jdbc/PgPreparedStatement.java:138
-#: org/postgresql/jdbc/PgStatement.java:299
-msgid "A result was returned when none was expected."
-msgstr "Die Anweisung lieferte ein Ergebnis obwohl keines erwartet wurde."
+#: org/postgresql/xa/PGXAConnection.java:185
+msgid "Connection is busy with another transaction"
+msgstr "Die Verbindung ist derzeit mit einer anderen Transaktion besch�ftigt."
-#: org/postgresql/jdbc/BatchResultHandler.java:59
-msgid "Too many update results were returned."
-msgstr "Zu viele Updateergebnisse wurden zur�ckgegeben."
+#: org/postgresql/xa/PGXAConnection.java:194
+#: org/postgresql/xa/PGXAConnection.java:267
+msgid "suspend/resume not implemented"
+msgstr "Anhalten/Fortsetzen ist nicht implementiert."
-#: org/postgresql/jdbc/BatchResultHandler.java:88
+#: org/postgresql/xa/PGXAConnection.java:202
+#: org/postgresql/xa/PGXAConnection.java:209
+#: org/postgresql/xa/PGXAConnection.java:213
#, java-format
msgid ""
-"Batch entry {0} {1} was aborted. Call getNextException to see the cause."
+"Invalid protocol state requested. Attempted transaction interleaving is not "
+"supported. xid={0}, currentXid={1}, state={2}, flags={3}"
msgstr ""
-"Batch-Eintrag {0} {1} wurde abgebrochen. Rufen Sie ''getNextException'' "
-"auf, um die Ursache zu erfahren."
-#: org/postgresql/jdbc/EscapedFunctions.java:243
-#, java-format
-msgid "{0} function takes four and only four argument."
-msgstr "Die {0}-Funktion erwartet genau vier Argumente."
+#: org/postgresql/xa/PGXAConnection.java:224
+msgid "Error disabling autocommit"
+msgstr "Fehler beim Abschalten von Autocommit."
-#: org/postgresql/jdbc/EscapedFunctions.java:273
-#: org/postgresql/jdbc/EscapedFunctions.java:347
-#: org/postgresql/jdbc/EscapedFunctions.java:752
-#: org/postgresql/jdbc/EscapedFunctions.java:790
-#, java-format
-msgid "{0} function takes two and only two arguments."
-msgstr "Die {0}-Funktion erwartet genau zwei Argumente."
+#: org/postgresql/xa/PGXAConnection.java:261
+#, fuzzy, java-format
+msgid ""
+"tried to call end without corresponding start call. state={0}, start "
+"xid={1}, currentXid={2}, preparedXid={3}"
+msgstr ""
+"Es wurde versucht, ohne dazugeh�rigen ''start''-Aufruf ''end'' aufzurufen."
-#: org/postgresql/jdbc/EscapedFunctions.java:291
-#: org/postgresql/jdbc/EscapedFunctions.java:329
-#: org/postgresql/jdbc/EscapedFunctions.java:449
-#: org/postgresql/jdbc/EscapedFunctions.java:464
-#: org/postgresql/jdbc/EscapedFunctions.java:479
-#: org/postgresql/jdbc/EscapedFunctions.java:494
-#: org/postgresql/jdbc/EscapedFunctions.java:509
-#: org/postgresql/jdbc/EscapedFunctions.java:524
-#: org/postgresql/jdbc/EscapedFunctions.java:539
-#: org/postgresql/jdbc/EscapedFunctions.java:554
-#: org/postgresql/jdbc/EscapedFunctions.java:569
-#: org/postgresql/jdbc/EscapedFunctions.java:584
-#: org/postgresql/jdbc/EscapedFunctions.java:599
-#: org/postgresql/jdbc/EscapedFunctions.java:614
-#: org/postgresql/jdbc/EscapedFunctions.java:778
+#: org/postgresql/xa/PGXAConnection.java:297
#, java-format
-msgid "{0} function takes one and only one argument."
-msgstr "Die {0}-Funktion erwartet nur genau ein Argument."
+msgid ""
+"Preparing already prepared transaction, the prepared xid {0}, prepare xid={1}"
+msgstr ""
-#: org/postgresql/jdbc/EscapedFunctions.java:313
-#: org/postgresql/jdbc/EscapedFunctions.java:394
+#: org/postgresql/xa/PGXAConnection.java:300
#, java-format
-msgid "{0} function takes two or three arguments."
-msgstr "Die {0}-Funktion erwartet zwei oder drei Argumente."
+msgid "Current connection does not have an associated xid. prepare xid={0}"
+msgstr ""
-#: org/postgresql/jdbc/EscapedFunctions.java:419
-#: org/postgresql/jdbc/EscapedFunctions.java:434
-#: org/postgresql/jdbc/EscapedFunctions.java:737
-#: org/postgresql/jdbc/EscapedFunctions.java:767
-#, java-format
-msgid "{0} function doesn''t take any argument."
-msgstr "Die {0}-Funktion akzeptiert kein Argument."
+#: org/postgresql/xa/PGXAConnection.java:307
+#, fuzzy, java-format
+msgid ""
+"Not implemented: Prepare must be issued using the same connection that "
+"started the transaction. currentXid={0}, prepare xid={1}"
+msgstr ""
+"Nicht implementiert: ''Prepare'' muss �ber die selbe Verbindung abgesetzt "
+"werden, die die Transaktion startete."
-#: org/postgresql/jdbc/EscapedFunctions.java:630
-#: org/postgresql/jdbc/EscapedFunctions.java:683
-#, java-format
-msgid "{0} function takes three and only three arguments."
-msgstr "Die {0}-Funktion erwartet genau drei Argumente."
+#: org/postgresql/xa/PGXAConnection.java:311
+#, fuzzy, java-format
+msgid "Prepare called before end. prepare xid={0}, state={1}"
+msgstr "''Prepare'' wurde vor ''end'' aufgerufen."
-#: org/postgresql/jdbc/EscapedFunctions.java:643
-#: org/postgresql/jdbc/EscapedFunctions.java:664
-#: org/postgresql/jdbc/EscapedFunctions.java:667
-#: org/postgresql/jdbc/EscapedFunctions.java:700
-#: org/postgresql/jdbc/EscapedFunctions.java:713
-#: org/postgresql/jdbc/EscapedFunctions.java:716
-#, java-format
-msgid "Interval {0} not yet implemented"
-msgstr "Intervall {0} ist noch nicht implementiert."
+#: org/postgresql/xa/PGXAConnection.java:331
+#, fuzzy, java-format
+msgid "Error preparing transaction. prepare xid={0}"
+msgstr "Beim Vorbereiten der Transaktion trat ein Fehler auf."
-#: org/postgresql/jdbc/PgArray.java:166 org/postgresql/jdbc/PgArray.java:822
+#: org/postgresql/xa/PGXAConnection.java:382
+msgid "Error during recover"
+msgstr "Beim Wiederherstellen trat ein Fehler auf."
+
+#: org/postgresql/xa/PGXAConnection.java:438
+#, fuzzy, java-format
+msgid ""
+"Error rolling back prepared transaction. rollback xid={0}, preparedXid={1}, "
+"currentXid={2}"
+msgstr "Fehler beim Rollback einer vorbereiteten Transaktion."
+
+#: org/postgresql/xa/PGXAConnection.java:471
#, java-format
-msgid "The array index is out of range: {0}"
-msgstr "Der Arrayindex ist au�erhalb des g�ltigen Bereichs: {0}."
+msgid ""
+"One-phase commit called for xid {0} but connection was prepared with xid {1}"
+msgstr ""
+
+#: org/postgresql/xa/PGXAConnection.java:479
+msgid ""
+"Not implemented: one-phase commit must be issued using the same connection "
+"that was used to start it"
+msgstr ""
+"Nicht implementiert: Die einphasige Best�tigung muss �ber die selbe "
+"Verbindung abgewickelt werden, die verwendet wurde, um sie zu beginnen."
-#: org/postgresql/jdbc/PgArray.java:183 org/postgresql/jdbc/PgArray.java:839
+#: org/postgresql/xa/PGXAConnection.java:483
#, java-format
-msgid "The array index is out of range: {0}, number of elements: {1}."
+msgid "One-phase commit with unknown xid. commit xid={0}, currentXid={1}"
msgstr ""
-"Der Arrayindex {0} ist au�erhalb des g�ltigen Bereichs. Vorhandene Elemente: "
-"{1}."
-#: org/postgresql/jdbc/PgArray.java:215
-#: org/postgresql/jdbc/PgResultSet.java:1885
-#: org/postgresql/util/HStoreConverter.java:38
-#: org/postgresql/util/HStoreConverter.java:69
+#: org/postgresql/xa/PGXAConnection.java:487
+#, fuzzy, java-format
+msgid "commit called before end. commit xid={0}, state={1}"
+msgstr "''Commit'' wurde vor ''end'' aufgerufen."
+
+#: org/postgresql/xa/PGXAConnection.java:498
+#, fuzzy, java-format
+msgid "Error during one-phase commit. commit xid={0}"
+msgstr "Bei der einphasigen Best�tigung trat ein Fehler auf."
+
+#: org/postgresql/xa/PGXAConnection.java:517
+#, fuzzy
msgid ""
-"Invalid character data was found. This is most likely caused by stored data "
-"containing characters that are invalid for the character set the database "
-"was created in. The most common example of this is storing 8bit data in a "
-"SQL_ASCII database."
+"Not implemented: 2nd phase commit must be issued using an idle connection. "
+"commit xid={0}, currentXid={1}, state={2], transactionState={3}"
msgstr ""
-"Ung�ltige Zeichendaten. Das ist h�chstwahrscheinlich von in der Datenbank "
-"gespeicherten Zeichen hervorgerufen, die in einer anderen Kodierung "
-"vorliegen, als die, in der die Datenbank erstellt wurde. Das h�ufigste "
-"Beispiel daf�r ist es, 8Bit-Daten in SQL_ASCII-Datenbanken abzulegen."
+"Nicht implementiert: Die zweite Best�tigungsphase muss �ber eine im Leerlauf "
+"befindliche Verbindung abgewickelt werden."
-#: org/postgresql/jdbc/PgCallableStatement.java:90
-#: org/postgresql/jdbc/PgCallableStatement.java:96
-msgid "A CallableStatement was executed with nothing returned."
-msgstr "Ein CallableStatement wurde ausgef�hrt ohne etwas zur�ckzugeben."
+#: org/postgresql/xa/PGXAConnection.java:550
+#, fuzzy, java-format
+msgid ""
+"Error committing prepared transaction. commit xid={0}, preparedXid={1}, "
+"currentXid={2}"
+msgstr "Fehler beim Rollback einer vorbereiteten Transaktion."
-#: org/postgresql/jdbc/PgCallableStatement.java:107
-msgid "A CallableStatement was executed with an invalid number of parameters"
+#: org/postgresql/xa/PGXAConnection.java:567
+#, fuzzy, java-format
+msgid "Heuristic commit/rollback not supported. forget xid={0}"
+msgstr "Heuristisches Commit/Rollback wird nicht unterst�tzt."
+
+#: org/postgresql/jdbc/PgSQLXML.java:147
+msgid "Unable to decode xml data."
msgstr ""
-"Ein CallableStatement wurde mit einer falschen Anzahl Parameter ausgef�hrt."
-#: org/postgresql/jdbc/PgCallableStatement.java:139
+#: org/postgresql/jdbc/PgSQLXML.java:150
#, java-format
+msgid "Unknown XML Source class: {0}"
+msgstr ""
+
+#: org/postgresql/jdbc/PgSQLXML.java:193
+#, fuzzy
+msgid "Unable to create SAXResult for SQLXML."
+msgstr "Erstellung des Objektes schlug fehl f�r: {0}."
+
+#: org/postgresql/jdbc/PgSQLXML.java:208
+msgid "Unable to create StAXResult for SQLXML"
+msgstr ""
+
+#: org/postgresql/jdbc/PgSQLXML.java:213
+#, fuzzy, java-format
+msgid "Unknown XML Result class: {0}"
+msgstr "Unbekannte Einstellung f�r die Haltbarkeit des ResultSets: {0}."
+
+#: org/postgresql/jdbc/PgSQLXML.java:225
+#, fuzzy
+msgid "This SQLXML object has already been freed."
+msgstr "Diese PooledConnection ist bereits geschlossen worden."
+
+#: org/postgresql/jdbc/PgSQLXML.java:234
msgid ""
-"A CallableStatement function was executed and the out parameter {0} was of "
-"type {1} however type {2} was registered."
+"This SQLXML object has not been initialized, so you cannot retrieve data "
+"from it."
+msgstr ""
+
+#: org/postgresql/jdbc/PgSQLXML.java:247
+#, java-format
+msgid "Failed to convert binary xml data to encoding: {0}."
msgstr ""
-"Eine CallableStatement-Funktion wurde ausgef�hrt und der R�ckgabewert {0} "
-"war vom Typ {1}. Jedoch wurde der Typ {2} daf�r registriert."
-#: org/postgresql/jdbc/PgCallableStatement.java:195
+#: org/postgresql/jdbc/PgSQLXML.java:273
+msgid "Unable to convert DOMResult SQLXML data to a string."
+msgstr ""
+
+#: org/postgresql/jdbc/PgSQLXML.java:287
msgid ""
-"This statement does not declare an OUT parameter. Use '{' ?= call ... '}' "
-"to declare one."
+"This SQLXML object has already been initialized, so you cannot manipulate it "
+"further."
msgstr ""
-"Diese Anweisung deklariert keinen OUT-Parameter. Benutzen Sie '{' ?= "
-"call ... '}' um das zu tun."
-#: org/postgresql/jdbc/PgCallableStatement.java:239
-msgid "wasNull cannot be call before fetching a result."
+#: org/postgresql/jdbc/PSQLSavepoint.java:37
+#: org/postgresql/jdbc/PSQLSavepoint.java:51
+#: org/postgresql/jdbc/PSQLSavepoint.java:69
+msgid "Cannot reference a savepoint after it has been released."
msgstr ""
-"wasNull kann nicht aufgerufen werden, bevor ein Ergebnis abgefragt wurde."
+"Ein Rettungspunkt kann nicht angesprochen werden, nach dem er entfernt wurde."
+
+#: org/postgresql/jdbc/PSQLSavepoint.java:42
+msgid "Cannot retrieve the id of a named savepoint."
+msgstr "Die ID eines benamten Rettungspunktes kann nicht ermittelt werden."
-#: org/postgresql/jdbc/PgCallableStatement.java:377
-#: org/postgresql/jdbc/PgCallableStatement.java:396
+#: org/postgresql/jdbc/PSQLSavepoint.java:56
+msgid "Cannot retrieve the name of an unnamed savepoint."
+msgstr "Der Name eines namenlosen Rettungpunktes kann nicht ermittelt werden."
+
+#: org/postgresql/jdbc/PgArray.java:157 org/postgresql/jdbc/PgArray.java:844
#, java-format
-msgid ""
-"Parameter of type {0} was registered, but call to get{1} (sqltype={2}) was "
-"made."
+msgid "The array index is out of range: {0}"
+msgstr "Der Arrayindex ist au�erhalb des g�ltigen Bereichs: {0}."
+
+#: org/postgresql/jdbc/PgArray.java:178 org/postgresql/jdbc/PgArray.java:861
+#, java-format
+msgid "The array index is out of range: {0}, number of elements: {1}."
msgstr ""
-"Ein Parameter des Typs {0} wurde registriert, jedoch erfolgte ein Aufruf "
-"get{1} (sqltype={2})."
+"Der Arrayindex {0} ist au�erhalb des g�ltigen Bereichs. Vorhandene Elemente: "
+"{1}."
-#: org/postgresql/jdbc/PgCallableStatement.java:417
-msgid ""
-"A CallableStatement was declared, but no call to registerOutParameter(1, "
-"<some type>) was made."
+#: org/postgresql/jdbc/PgParameterMetaData.java:83
+#, java-format
+msgid "The parameter index is out of range: {0}, number of parameters: {1}."
msgstr ""
-"Ein CallableStatement wurde deklariert, aber kein Aufruf von "
-"''registerOutParameter(1, <some type>)'' erfolgte."
+"Der Parameterindex {0} ist au�erhalb des g�ltigen Bereichs. Es gibt {1} "
+"Parameter."
-#: org/postgresql/jdbc/PgCallableStatement.java:423
-#, fuzzy
-msgid "No function outputs were registered."
-msgstr "Es wurden keine Funktionsausgaben registriert."
+#: org/postgresql/jdbc/BatchResultHandler.java:92
+msgid "Too many update results were returned."
+msgstr "Zu viele Updateergebnisse wurden zur�ckgegeben."
-#: org/postgresql/jdbc/PgCallableStatement.java:429
+#: org/postgresql/jdbc/BatchResultHandler.java:146
+#, fuzzy, java-format
msgid ""
-"Results cannot be retrieved from a CallableStatement before it is executed."
+"Batch entry {0} {1} was aborted: {2} Call getNextException to see other "
+"errors in the batch."
msgstr ""
-"Ergebnisse k�nnen nicht von einem CallableStatement abgerufen werden, bevor "
-"es ausgef�hrt wurde."
+"Batch-Eintrag {0} {1} wurde abgebrochen. Rufen Sie ''getNextException'' "
+"auf, um die Ursache zu erfahren."
-#: org/postgresql/jdbc/PgConnection.java:312
+#: org/postgresql/jdbc/PgConnection.java:272
#, java-format
msgid "Unsupported value for stringtype parameter: {0}"
msgstr "Nichtunterst�tzter Wert f�r den Stringparameter: {0}"
-#: org/postgresql/jdbc/PgConnection.java:457
-#: org/postgresql/jdbc/PgPreparedStatement.java:115
-#: org/postgresql/jdbc/PgStatement.java:282
-#: org/postgresql/jdbc/TypeInfoCache.java:230
-#: org/postgresql/jdbc/TypeInfoCache.java:370
-#: org/postgresql/jdbc/TypeInfoCache.java:412
+#: org/postgresql/jdbc/PgConnection.java:424
+#: org/postgresql/jdbc/PgStatement.java:225
+#: org/postgresql/jdbc/TypeInfoCache.java:226
+#: org/postgresql/jdbc/TypeInfoCache.java:371
+#: org/postgresql/jdbc/TypeInfoCache.java:411
+#: org/postgresql/jdbc/TypeInfoCache.java:484
#: org/postgresql/jdbc/TypeInfoCache.java:489
-#: org/postgresql/jdbc/TypeInfoCache.java:494
-#: org/postgresql/jdbc/TypeInfoCache.java:535
-#: org/postgresql/jdbc/TypeInfoCache.java:540
+#: org/postgresql/jdbc/TypeInfoCache.java:526
+#: org/postgresql/jdbc/TypeInfoCache.java:531
+#: org/postgresql/jdbc/PgPreparedStatement.java:119
msgid "No results were returned by the query."
msgstr "Die Abfrage lieferte kein Ergebnis."
-#: org/postgresql/jdbc/PgConnection.java:578
+#: org/postgresql/jdbc/PgConnection.java:441
+#: org/postgresql/jdbc/PgStatement.java:254
+msgid "A result was returned when none was expected."
+msgstr "Die Anweisung lieferte ein Ergebnis obwohl keines erwartet wurde."
+
+#: org/postgresql/jdbc/PgConnection.java:545
#, fuzzy
msgid "Custom type maps are not supported."
msgstr "Selbstdefinierte Typabbildungen werden nicht unterst�tzt."
-#: org/postgresql/jdbc/PgConnection.java:620
+#: org/postgresql/jdbc/PgConnection.java:587
#, java-format
msgid "Failed to create object for: {0}."
msgstr "Erstellung des Objektes schlug fehl f�r: {0}."
-#: org/postgresql/jdbc/PgConnection.java:672
+#: org/postgresql/jdbc/PgConnection.java:641
#, java-format
msgid "Unable to load the class {0} responsible for the datatype {1}"
msgstr ""
"Die f�r den Datentyp {1} verantwortliche Klasse {0} konnte nicht geladen "
"werden."
-#: org/postgresql/jdbc/PgConnection.java:724
+#: org/postgresql/jdbc/PgConnection.java:693
msgid ""
"Cannot change transaction read-only property in the middle of a transaction."
msgstr ""
"Die Nur-Lesen-Eigenschaft einer Transaktion kann nicht w�hrend der "
"Transaktion ver�ndert werden."
-#: org/postgresql/jdbc/PgConnection.java:775
+#: org/postgresql/jdbc/PgConnection.java:756
msgid "Cannot commit when autoCommit is enabled."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:786
-#: org/postgresql/jdbc/PgConnection.java:1358
-#: org/postgresql/jdbc/PgConnection.java:1395
+#: org/postgresql/jdbc/PgConnection.java:767
+#: org/postgresql/jdbc/PgConnection.java:1384
+#: org/postgresql/jdbc/PgConnection.java:1428
#, fuzzy
msgid "This connection has been closed."
msgstr "Die Verbindung wurde geschlossen."
-#: org/postgresql/jdbc/PgConnection.java:796
+#: org/postgresql/jdbc/PgConnection.java:777
msgid "Cannot rollback when autoCommit is enabled."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:870
+#: org/postgresql/jdbc/PgConnection.java:827
msgid ""
"Cannot change transaction isolation level in the middle of a transaction."
msgstr ""
"Die Transaktions-Trennungsstufe kann nicht w�hrend einer Transaktion "
"ver�ndert werden."
-#: org/postgresql/jdbc/PgConnection.java:876
+#: org/postgresql/jdbc/PgConnection.java:833
#, java-format
msgid "Transaction isolation level {0} not supported."
msgstr "Die Transaktions-Trennungsstufe {0} ist nicht unterst�tzt."
-#: org/postgresql/jdbc/PgConnection.java:921
+#: org/postgresql/jdbc/PgConnection.java:878
msgid "Finalizing a Connection that was never closed:"
msgstr "Eine Connection wurde finalisiert, die nie geschlossen wurde:"
-#: org/postgresql/jdbc/PgConnection.java:1009
+#: org/postgresql/jdbc/PgConnection.java:945
msgid "Unable to translate data into the desired encoding."
msgstr "Die Daten konnten nicht in die gew�nschte Kodierung gewandelt werden."
-#: org/postgresql/jdbc/PgConnection.java:1081
-#: org/postgresql/jdbc/PgResultSet.java:1782
-#: org/postgresql/jdbc/PgStatement.java:1053
+#: org/postgresql/jdbc/PgConnection.java:1008
+#: org/postgresql/jdbc/PgStatement.java:903
+#: org/postgresql/jdbc/PgResultSet.java:1817
msgid "Fetch size must be a value greater to or equal to 0."
msgstr "Die Fetch-Gr��e muss ein Wert gr��er oder gleich Null sein."
-#: org/postgresql/jdbc/PgConnection.java:1311
+#: org/postgresql/jdbc/PgConnection.java:1289
+#: org/postgresql/jdbc/PgConnection.java:1330
#, fuzzy, java-format
msgid "Unable to find server array type for provided name {0}."
msgstr ""
"F�r den angegebenen Namen {0} konnte kein Serverarraytyp gefunden werden."
-#: org/postgresql/jdbc/PgConnection.java:1327
+#: org/postgresql/jdbc/PgConnection.java:1312
+#, fuzzy, java-format
+msgid "Invalid elements {0}"
+msgstr "Ung�ltige L�nge des Datenstroms: {0}."
+
+#: org/postgresql/jdbc/PgConnection.java:1348
#, fuzzy, java-format
msgid "Invalid timeout ({0}<0)."
msgstr "Ung�ltige L�nge des Datenstroms: {0}."
-#: org/postgresql/jdbc/PgConnection.java:1340
+#: org/postgresql/jdbc/PgConnection.java:1372
msgid "Validating connection."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:1375
+#: org/postgresql/jdbc/PgConnection.java:1405
#, fuzzy, java-format
msgid "Failed to set ClientInfo property: {0}"
msgstr "Erstellung des Objektes schlug fehl f�r: {0}."
-#: org/postgresql/jdbc/PgConnection.java:1383
+#: org/postgresql/jdbc/PgConnection.java:1415
msgid "ClientInfo property not supported."
msgstr "Die ClientInfo-Eigenschaft ist nicht unterst�tzt."
-#: org/postgresql/jdbc/PgConnection.java:1408
+#: org/postgresql/jdbc/PgConnection.java:1441
msgid "One ore more ClientInfo failed."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:1517
+#: org/postgresql/jdbc/PgConnection.java:1540
+#, fuzzy
+msgid "Network timeout must be a value greater than or equal to 0."
+msgstr "Das Abfragetimeout muss ein Wert gr��er oder gleich Null sein."
+
+#: org/postgresql/jdbc/PgConnection.java:1552
+msgid "Unable to set network timeout."
+msgstr ""
+
+#: org/postgresql/jdbc/PgConnection.java:1563
+msgid "Unable to get network timeout."
+msgstr ""
+
+#: org/postgresql/jdbc/PgConnection.java:1580
#, java-format
msgid "Unknown ResultSet holdability setting: {0}."
msgstr "Unbekannte Einstellung f�r die Haltbarkeit des ResultSets: {0}."
-#: org/postgresql/jdbc/PgConnection.java:1531
-#: org/postgresql/jdbc/PgConnection.java:1554
-#: org/postgresql/jdbc/PgConnection.java:1576
-#: org/postgresql/jdbc/PgConnection.java:1587
-msgid "Server versions prior to 8.0 do not support savepoints."
-msgstr "Der Server unterst�tzt keine Rettungspunkte vor Version 8.0."
-
-#: org/postgresql/jdbc/PgConnection.java:1535
-#: org/postgresql/jdbc/PgConnection.java:1558
+#: org/postgresql/jdbc/PgConnection.java:1598
+#: org/postgresql/jdbc/PgConnection.java:1619
msgid "Cannot establish a savepoint in auto-commit mode."
msgstr "Ein Rettungspunkt kann im Modus ''auto-commit'' nicht erstellt werden."
-#: org/postgresql/jdbc/PgConnection.java:1635
+#: org/postgresql/jdbc/PgConnection.java:1685
msgid "Returning autogenerated keys is not supported."
msgstr "Die R�ckgabe automatisch generierter Schl�ssel wird nicht unterst�tzt,"
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:78
+#: org/postgresql/jdbc/PgStatement.java:235
+msgid "Multiple ResultSets were returned by the query."
+msgstr "Die Abfrage ergab mehrere ResultSets."
+
+#: org/postgresql/jdbc/PgStatement.java:316
+msgid "Can''t use executeWithFlags(int) on a Statement."
+msgstr ""
+
+#: org/postgresql/jdbc/PgStatement.java:509
+msgid "Maximum number of rows must be a value grater than or equal to 0."
+msgstr "Die maximale Zeilenzahl muss ein Wert gr��er oder gleich Null sein."
+
+#: org/postgresql/jdbc/PgStatement.java:550
+msgid "Query timeout must be a value greater than or equals to 0."
+msgstr "Das Abfragetimeout muss ein Wert gr��er oder gleich Null sein."
+
+#: org/postgresql/jdbc/PgStatement.java:590
+msgid "The maximum field size must be a value greater than or equal to 0."
+msgstr "Die maximale Feldgr��e muss ein Wert gr��er oder gleich Null sein."
+
+#: org/postgresql/jdbc/PgStatement.java:689
+msgid "This statement has been closed."
+msgstr "Die Anweisung wurde geschlossen."
+
+#: org/postgresql/jdbc/PgStatement.java:895
+#: org/postgresql/jdbc/PgResultSet.java:878
+#, java-format
+msgid "Invalid fetch direction constant: {0}."
+msgstr "Unzul�ssige Richtungskonstante bei fetch: {0}."
+
+#: org/postgresql/jdbc/PgStatement.java:1145
+#: org/postgresql/jdbc/PgStatement.java:1173
+#, fuzzy
+msgid "Returning autogenerated keys by column index is not supported."
+msgstr "Die R�ckgabe automatisch generierter Schl�ssel wird nicht unterst�tzt,"
+
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:66
msgid ""
"Unable to determine a value for MaxIndexKeys due to missing system catalog "
"data."
@@ -943,122 +1178,137 @@ msgstr ""
"Es konnte kein Wert f�r MaxIndexKeys gefunden werden, da die "
"Systemkatalogdaten fehlen."
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:100
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:89
msgid "Unable to find name datatype in the system catalogs."
msgstr ""
"In den Systemkatalogen konnte der Namensdatentyp nicht gefunden werden."
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1117
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1028
msgid "proname"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1117
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1028
msgid "oid"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1119
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1714
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1030
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1481
msgid "typtype"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1122
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1033
msgid "proargtypes"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1732
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1499
msgid "adsrc"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1872
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1963
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1512
+msgid "attidentity"
+msgstr ""
+
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1608
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1684
msgid "rolname"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1873
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1964
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1609
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1685
msgid "relacl"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1878
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1615
msgid "attacl"
msgstr ""
-#: org/postgresql/jdbc/PgParameterMetaData.java:86
-#, java-format
-msgid "The parameter index is out of range: {0}, number of parameters: {1}."
-msgstr ""
-"Der Parameterindex {0} ist au�erhalb des g�ltigen Bereichs. Es gibt {1} "
-"Parameter."
-
-#: org/postgresql/jdbc/PgPreparedStatement.java:102
-#: org/postgresql/jdbc/PgPreparedStatement.java:128
-#: org/postgresql/jdbc/PgPreparedStatement.java:150
-#: org/postgresql/jdbc/PgPreparedStatement.java:1108
-#, fuzzy
+#: org/postgresql/jdbc/AbstractBlobClob.java:78
msgid ""
-"Can''t use query methods that take a query string on a PreparedStatement."
+"Truncation of large objects is only implemented in 8.3 and later servers."
msgstr ""
-"Abfragemethoden, die einen Abfragestring annehmen, k�nnen nicht auf ein "
-"PreparedStatement angewandt werden."
+"Das Abschneiden gro�er Objekte ist nur in Versionen nach 8.3 implementiert."
-#: org/postgresql/jdbc/PgPreparedStatement.java:119
-#: org/postgresql/jdbc/PgStatement.java:286
-msgid "Multiple ResultSets were returned by the query."
-msgstr "Die Abfrage ergab mehrere ResultSets."
+#: org/postgresql/jdbc/AbstractBlobClob.java:83
+msgid "Cannot truncate LOB to a negative length."
+msgstr ""
-#: org/postgresql/jdbc/PgPreparedStatement.java:270
-msgid "Unknown Types value."
+#: org/postgresql/jdbc/AbstractBlobClob.java:90
+#: org/postgresql/jdbc/AbstractBlobClob.java:234
+#, java-format
+msgid "PostgreSQL LOBs can only index to: {0}"
+msgstr "LOBs in PostgreSQL k�nnen nur auf {0} verweisen."
+
+#: org/postgresql/jdbc/AbstractBlobClob.java:230
+msgid "LOB positioning offsets start at 1."
+msgstr "Positionsoffsets f�r LOBs beginnen bei 1."
+
+#: org/postgresql/jdbc/AbstractBlobClob.java:246
+msgid "free() was called on this LOB previously"
+msgstr "free() wurde bereits f�r dieses LOB aufgerufen."
+
+#: org/postgresql/jdbc/PgPreparedStatement.java:106
+#: org/postgresql/jdbc/PgPreparedStatement.java:127
+#: org/postgresql/jdbc/PgPreparedStatement.java:139
+#: org/postgresql/jdbc/PgPreparedStatement.java:1035
+#, fuzzy
+msgid ""
+"Can''t use query methods that take a query string on a PreparedStatement."
+msgstr ""
+"Abfragemethoden, die einen Abfragestring annehmen, k�nnen nicht auf ein "
+"PreparedStatement angewandt werden."
+
+#: org/postgresql/jdbc/PgPreparedStatement.java:249
+msgid "Unknown Types value."
msgstr "Unbekannter Typ."
-#: org/postgresql/jdbc/PgPreparedStatement.java:417
-#: org/postgresql/jdbc/PgPreparedStatement.java:486
-#: org/postgresql/jdbc/PgPreparedStatement.java:1251
-#: org/postgresql/jdbc/PgPreparedStatement.java:1583
+#: org/postgresql/jdbc/PgPreparedStatement.java:382
+#: org/postgresql/jdbc/PgPreparedStatement.java:439
+#: org/postgresql/jdbc/PgPreparedStatement.java:1191
+#: org/postgresql/jdbc/PgPreparedStatement.java:1490
#, java-format
msgid "Invalid stream length {0}."
msgstr "Ung�ltige L�nge des Datenstroms: {0}."
-#: org/postgresql/jdbc/PgPreparedStatement.java:447
+#: org/postgresql/jdbc/PgPreparedStatement.java:411
#, java-format
msgid "The JVM claims not to support the {0} encoding."
msgstr "Die JVM behauptet, die Zeichenkodierung {0} nicht zu unterst�tzen."
-#: org/postgresql/jdbc/PgPreparedStatement.java:450
-#: org/postgresql/jdbc/PgPreparedStatement.java:519
-#: org/postgresql/jdbc/PgResultSet.java:1075
-#: org/postgresql/jdbc/PgResultSet.java:1109
+#: org/postgresql/jdbc/PgPreparedStatement.java:414
+#: org/postgresql/jdbc/PgResultSet.java:1122
+#: org/postgresql/jdbc/PgResultSet.java:1156
msgid "Provided InputStream failed."
msgstr "Der bereitgestellte InputStream scheiterte."
-#: org/postgresql/jdbc/PgPreparedStatement.java:536
-#: org/postgresql/jdbc/PgPreparedStatement.java:1170
+#: org/postgresql/jdbc/PgPreparedStatement.java:460
+#: org/postgresql/jdbc/PgPreparedStatement.java:1096
#, java-format
msgid "Unknown type {0}."
msgstr "Unbekannter Typ {0}."
-#: org/postgresql/jdbc/PgPreparedStatement.java:553
+#: org/postgresql/jdbc/PgPreparedStatement.java:477
msgid "No hstore extension installed."
msgstr ""
-#: org/postgresql/jdbc/PgPreparedStatement.java:683
-#: org/postgresql/jdbc/PgPreparedStatement.java:705
-#: org/postgresql/jdbc/PgPreparedStatement.java:715
-#: org/postgresql/jdbc/PgPreparedStatement.java:725
+#: org/postgresql/jdbc/PgPreparedStatement.java:619
+#: org/postgresql/jdbc/PgPreparedStatement.java:642
+#: org/postgresql/jdbc/PgPreparedStatement.java:652
+#: org/postgresql/jdbc/PgPreparedStatement.java:664
#, java-format
msgid "Cannot cast an instance of {0} to type {1}"
msgstr "Die Typwandlung f�r eine Instanz von {0} nach {1} ist nicht m�glich."
-#: org/postgresql/jdbc/PgPreparedStatement.java:741
+#: org/postgresql/jdbc/PgPreparedStatement.java:682
#, java-format
msgid "Unsupported Types value: {0}"
msgstr "Unbekannter Typ: {0}."
-#: org/postgresql/jdbc/PgPreparedStatement.java:970
+#: org/postgresql/jdbc/PgPreparedStatement.java:894
#, java-format
msgid "Cannot convert an instance of {0} to type {1}"
msgstr "Die Typwandlung f�r eine Instanz von {0} nach {1} ist nicht m�glich."
-#: org/postgresql/jdbc/PgPreparedStatement.java:1040
+#: org/postgresql/jdbc/PgPreparedStatement.java:968
#, java-format
msgid ""
"Can''t infer the SQL type to use for an instance of {0}. Use setObject() "
@@ -1068,25 +1318,24 @@ msgstr ""
"abgeleitet werden. Benutzen Sie ''setObject()'' mit einem expliziten Typ, um "
"ihn festzulegen."
-#: org/postgresql/jdbc/PgPreparedStatement.java:1207
-#: org/postgresql/jdbc/PgPreparedStatement.java:1303
-#: org/postgresql/jdbc/PgPreparedStatement.java:1340
+#: org/postgresql/jdbc/PgPreparedStatement.java:1133
+#: org/postgresql/jdbc/PgPreparedStatement.java:1233
msgid "Unexpected error writing large object to database."
msgstr ""
"Beim Schreiben eines LargeObjects (LOB) in die Datenbank trat ein "
"unerwarteter Fehler auf."
-#: org/postgresql/jdbc/PgPreparedStatement.java:1278
-#: org/postgresql/jdbc/PgResultSet.java:1163
+#: org/postgresql/jdbc/PgPreparedStatement.java:1178
+#: org/postgresql/jdbc/PgResultSet.java:1210
msgid "Provided Reader failed."
msgstr "Der bereitgestellte Reader scheiterte."
-#: org/postgresql/jdbc/PgPreparedStatement.java:1542
-#: org/postgresql/util/StreamWrapper.java:59
-msgid "Object is too large to send over the protocol."
+#: org/postgresql/jdbc/BooleanTypeUtil.java:99
+#, java-format
+msgid "Cannot cast to boolean: \"{0}\""
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:285
+#: org/postgresql/jdbc/PgResultSet.java:280
msgid ""
"Operation requires a scrollable ResultSet, but this ResultSet is "
"FORWARD_ONLY."
@@ -1094,44 +1343,34 @@ msgstr ""
"Die Operation erfordert ein scrollbares ResultSet, dieses jedoch ist "
"FORWARD_ONLY."
-#: org/postgresql/jdbc/PgResultSet.java:456
-msgid "Unexpected error while decoding character data from a large object."
-msgstr ""
-"Ein unerwarteter Fehler trat beim Dekodieren von Zeichen aus einem "
-"LargeObject (LOB) auf."
-
-#: org/postgresql/jdbc/PgResultSet.java:507
-#: org/postgresql/jdbc/PgResultSet.java:537
-#: org/postgresql/jdbc/PgResultSet.java:570
-#: org/postgresql/jdbc/PgResultSet.java:2964
+#: org/postgresql/jdbc/PgResultSet.java:492
+#: org/postgresql/jdbc/PgResultSet.java:532
+#: org/postgresql/jdbc/PgResultSet.java:556
+#: org/postgresql/jdbc/PgResultSet.java:594
+#: org/postgresql/jdbc/PgResultSet.java:624
#: org/postgresql/jdbc/PgResultSet.java:3008
+#: org/postgresql/jdbc/PgResultSet.java:3052
#, fuzzy, java-format
msgid "Cannot convert the column of type {0} to requested type {1}."
msgstr "Die Typwandlung f�r eine Instanz von {0} nach {1} ist nicht m�glich."
-#: org/postgresql/jdbc/PgResultSet.java:789
-#: org/postgresql/jdbc/PgResultSet.java:810
-#: org/postgresql/jdbc/PgResultSet.java:1797
+#: org/postgresql/jdbc/PgResultSet.java:838
+#: org/postgresql/jdbc/PgResultSet.java:859
+#: org/postgresql/jdbc/PgResultSet.java:1832
msgid "Can''t use relative move methods while on the insert row."
msgstr ""
"Relative Bewegungen k�nnen in der Einf�gezeile nicht durchgef�hrt werden."
-#: org/postgresql/jdbc/PgResultSet.java:829
-#: org/postgresql/jdbc/PgStatement.java:1045
-#, java-format
-msgid "Invalid fetch direction constant: {0}."
-msgstr "Unzul�ssige Richtungskonstante bei fetch: {0}."
-
-#: org/postgresql/jdbc/PgResultSet.java:840
+#: org/postgresql/jdbc/PgResultSet.java:889
msgid "Cannot call cancelRowUpdates() when on the insert row."
msgstr ""
"''cancelRowUpdates()'' kann in der Einf�gezeile nicht aufgerufen werden."
-#: org/postgresql/jdbc/PgResultSet.java:856
+#: org/postgresql/jdbc/PgResultSet.java:905
msgid "Cannot call deleteRow() when on the insert row."
msgstr "''deleteRow()'' kann in der Einf�gezeile nicht aufgerufen werden."
-#: org/postgresql/jdbc/PgResultSet.java:863
+#: org/postgresql/jdbc/PgResultSet.java:912
msgid ""
"Currently positioned before the start of the ResultSet. You cannot call "
"deleteRow() here."
@@ -1139,7 +1378,7 @@ msgstr ""
"Die augenblickliche Position ist vor dem Beginn des ResultSets. Dort kann "
"''deleteRow()'' nicht aufgerufen werden."
-#: org/postgresql/jdbc/PgResultSet.java:869
+#: org/postgresql/jdbc/PgResultSet.java:918
msgid ""
"Currently positioned after the end of the ResultSet. You cannot call "
"deleteRow() here."
@@ -1147,37 +1386,37 @@ msgstr ""
"Die augenblickliche Position ist hinter dem Ende des ResultSets. Dort kann "
"''deleteRow()'' nicht aufgerufen werden."
-#: org/postgresql/jdbc/PgResultSet.java:873
+#: org/postgresql/jdbc/PgResultSet.java:922
msgid "There are no rows in this ResultSet."
msgstr "Es gibt keine Zeilen in diesem ResultSet."
-#: org/postgresql/jdbc/PgResultSet.java:914
+#: org/postgresql/jdbc/PgResultSet.java:963
msgid "Not on the insert row."
msgstr "Nicht in der Einf�gezeile."
-#: org/postgresql/jdbc/PgResultSet.java:916
+#: org/postgresql/jdbc/PgResultSet.java:965
msgid "You must specify at least one column value to insert a row."
msgstr ""
"Sie m�ssen mindestens einen Spaltenwert angeben, um eine Zeile einzuf�gen."
-#: org/postgresql/jdbc/PgResultSet.java:1072
-#: org/postgresql/jdbc/PgResultSet.java:1706
-#: org/postgresql/jdbc/PgResultSet.java:2377
-#: org/postgresql/jdbc/PgResultSet.java:2402
+#: org/postgresql/jdbc/PgResultSet.java:1119
+#: org/postgresql/jdbc/PgResultSet.java:1754
+#: org/postgresql/jdbc/PgResultSet.java:2416
+#: org/postgresql/jdbc/PgResultSet.java:2437
#, java-format
msgid "The JVM claims not to support the encoding: {0}"
msgstr "Die JVM behauptet, die Zeichenkodierung {0} nicht zu unterst�tzen."
-#: org/postgresql/jdbc/PgResultSet.java:1214
+#: org/postgresql/jdbc/PgResultSet.java:1261
msgid "Can''t refresh the insert row."
msgstr "Die Einf�gezeile kann nicht aufgefrischt werden."
-#: org/postgresql/jdbc/PgResultSet.java:1280
+#: org/postgresql/jdbc/PgResultSet.java:1328
msgid "Cannot call updateRow() when on the insert row."
msgstr "''updateRow()'' kann in der Einf�gezeile nicht aufgerufen werden."
-#: org/postgresql/jdbc/PgResultSet.java:1287
-#: org/postgresql/jdbc/PgResultSet.java:3025
+#: org/postgresql/jdbc/PgResultSet.java:1335
+#: org/postgresql/jdbc/PgResultSet.java:3069
msgid ""
"Cannot update the ResultSet because it is either before the start or after "
"the end of the results."
@@ -1185,40 +1424,40 @@ msgstr ""
"Das ResultSet kann nicht aktualisiert werden, da es entweder vor oder nach "
"dem Ende der Ergebnisse ist."
-#: org/postgresql/jdbc/PgResultSet.java:1486
+#: org/postgresql/jdbc/PgResultSet.java:1535
msgid "ResultSets with concurrency CONCUR_READ_ONLY cannot be updated."
msgstr ""
"ResultSets, deren Zugriffsart CONCUR_READ_ONLY ist, k�nnen nicht "
"aktualisiert werden."
-#: org/postgresql/jdbc/PgResultSet.java:1555
+#: org/postgresql/jdbc/PgResultSet.java:1603
#, java-format
msgid "No primary key found for table {0}."
msgstr "F�r die Tabelle {0} konnte kein Prim�rschl�ssel gefunden werden."
-#: org/postgresql/jdbc/PgResultSet.java:1941
-#: org/postgresql/jdbc/PgResultSet.java:1946
-#: org/postgresql/jdbc/PgResultSet.java:1986
-#: org/postgresql/jdbc/PgResultSet.java:1992
-#: org/postgresql/jdbc/PgResultSet.java:2790
-#: org/postgresql/jdbc/PgResultSet.java:2796
-#: org/postgresql/jdbc/PgResultSet.java:2820
-#: org/postgresql/jdbc/PgResultSet.java:2825
-#: org/postgresql/jdbc/PgResultSet.java:2841
-#: org/postgresql/jdbc/PgResultSet.java:2862
-#: org/postgresql/jdbc/PgResultSet.java:2873
-#: org/postgresql/jdbc/PgResultSet.java:2886
-#: org/postgresql/jdbc/PgResultSet.java:3013
+#: org/postgresql/jdbc/PgResultSet.java:2011
+#: org/postgresql/jdbc/PgResultSet.java:2016
+#: org/postgresql/jdbc/PgResultSet.java:2803
+#: org/postgresql/jdbc/PgResultSet.java:2809
+#: org/postgresql/jdbc/PgResultSet.java:2834
+#: org/postgresql/jdbc/PgResultSet.java:2840
+#: org/postgresql/jdbc/PgResultSet.java:2864
+#: org/postgresql/jdbc/PgResultSet.java:2869
+#: org/postgresql/jdbc/PgResultSet.java:2885
+#: org/postgresql/jdbc/PgResultSet.java:2906
+#: org/postgresql/jdbc/PgResultSet.java:2917
+#: org/postgresql/jdbc/PgResultSet.java:2930
+#: org/postgresql/jdbc/PgResultSet.java:3057
#, java-format
msgid "Bad value for type {0} : {1}"
msgstr "Unzul�ssiger Wert f�r den Typ {0} : {1}."
-#: org/postgresql/jdbc/PgResultSet.java:2564
+#: org/postgresql/jdbc/PgResultSet.java:2589
#, java-format
msgid "The column name {0} was not found in this ResultSet."
msgstr "Der Spaltenname {0} wurde in diesem ResultSet nicht gefunden."
-#: org/postgresql/jdbc/PgResultSet.java:2689
+#: org/postgresql/jdbc/PgResultSet.java:2725
msgid ""
"ResultSet is not updateable. The query that generated this result set must "
"select only one table, and must select all primary keys from that table. See "
@@ -1228,440 +1467,332 @@ msgstr ""
"darf nur eine Tabelle und muss darin alle Prim�rschl�ssel ausw�hlen. Siehe "
"JDBC 2.1 API-Spezifikation, Abschnitt 5.6 f�r mehr Details."
-#: org/postgresql/jdbc/PgResultSet.java:2701
+#: org/postgresql/jdbc/PgResultSet.java:2737
msgid "This ResultSet is closed."
msgstr "Dieses ResultSet ist geschlossen."
-#: org/postgresql/jdbc/PgResultSet.java:2732
+#: org/postgresql/jdbc/PgResultSet.java:2768
msgid "ResultSet not positioned properly, perhaps you need to call next."
msgstr ""
"Das ResultSet ist nicht richtig positioniert. Eventuell muss ''next'' "
"aufgerufen werden."
-#: org/postgresql/jdbc/PgResultSet.java:3045
+#: org/postgresql/jdbc/PgResultSet.java:3089
#, fuzzy
msgid "Invalid UUID data."
msgstr "Ung�ltiges Flag."
-#: org/postgresql/jdbc/PgSQLXML.java:150
-msgid "Unable to decode xml data."
-msgstr ""
-
-#: org/postgresql/jdbc/PgSQLXML.java:153
-#, java-format
-msgid "Unknown XML Source class: {0}"
-msgstr ""
-
-#: org/postgresql/jdbc/PgSQLXML.java:196
-#, fuzzy
-msgid "Unable to create SAXResult for SQLXML."
-msgstr "Erstellung des Objektes schlug fehl f�r: {0}."
+#: org/postgresql/jdbc/PgResultSet.java:3178
+#: org/postgresql/jdbc/PgResultSet.java:3185
+#: org/postgresql/jdbc/PgResultSet.java:3196
+#: org/postgresql/jdbc/PgResultSet.java:3207
+#: org/postgresql/jdbc/PgResultSet.java:3218
+#: org/postgresql/jdbc/PgResultSet.java:3229
+#: org/postgresql/jdbc/PgResultSet.java:3240
+#: org/postgresql/jdbc/PgResultSet.java:3251
+#: org/postgresql/jdbc/PgResultSet.java:3262
+#: org/postgresql/jdbc/PgResultSet.java:3269
+#: org/postgresql/jdbc/PgResultSet.java:3276
+#: org/postgresql/jdbc/PgResultSet.java:3287
+#: org/postgresql/jdbc/PgResultSet.java:3304
+#: org/postgresql/jdbc/PgResultSet.java:3311
+#: org/postgresql/jdbc/PgResultSet.java:3318
+#: org/postgresql/jdbc/PgResultSet.java:3329
+#: org/postgresql/jdbc/PgResultSet.java:3336
+#: org/postgresql/jdbc/PgResultSet.java:3343
+#: org/postgresql/jdbc/PgResultSet.java:3381
+#: org/postgresql/jdbc/PgResultSet.java:3388
+#: org/postgresql/jdbc/PgResultSet.java:3395
+#: org/postgresql/jdbc/PgResultSet.java:3415
+#: org/postgresql/jdbc/PgResultSet.java:3428
+#, fuzzy, java-format
+msgid "conversion to {0} from {1} not supported"
+msgstr "Die Transaktions-Trennungsstufe {0} ist nicht unterst�tzt."
-#: org/postgresql/jdbc/PgSQLXML.java:211
-msgid "Unable to create StAXResult for SQLXML"
-msgstr ""
+#: org/postgresql/jdbc/TimestampUtils.java:355
+#: org/postgresql/jdbc/TimestampUtils.java:423
+#, fuzzy, java-format
+msgid "Bad value for type timestamp/date/time: {1}"
+msgstr "Unzul�ssiger Wert f�r den Typ {0} : {1}."
-#: org/postgresql/jdbc/PgSQLXML.java:216
+#: org/postgresql/jdbc/TimestampUtils.java:858
+#: org/postgresql/jdbc/TimestampUtils.java:915
+#: org/postgresql/jdbc/TimestampUtils.java:961
+#: org/postgresql/jdbc/TimestampUtils.java:1010
#, fuzzy, java-format
-msgid "Unknown XML Result class: {0}"
-msgstr "Unbekannte Einstellung f�r die Haltbarkeit des ResultSets: {0}."
+msgid "Unsupported binary encoding of {0}."
+msgstr "Unbekannter Typ: {0}."
-#: org/postgresql/jdbc/PgSQLXML.java:228
-#, fuzzy
-msgid "This SQLXML object has already been freed."
-msgstr "Diese PooledConnection ist bereits geschlossen worden."
+#: org/postgresql/jdbc/PgCallableStatement.java:86
+#: org/postgresql/jdbc/PgCallableStatement.java:96
+msgid "A CallableStatement was executed with nothing returned."
+msgstr "Ein CallableStatement wurde ausgef�hrt ohne etwas zur�ckzugeben."
-#: org/postgresql/jdbc/PgSQLXML.java:237
-msgid ""
-"This SQLXML object has not been initialized, so you cannot retrieve data "
-"from it."
+#: org/postgresql/jdbc/PgCallableStatement.java:107
+msgid "A CallableStatement was executed with an invalid number of parameters"
msgstr ""
+"Ein CallableStatement wurde mit einer falschen Anzahl Parameter ausgef�hrt."
-#: org/postgresql/jdbc/PgSQLXML.java:250
+#: org/postgresql/jdbc/PgCallableStatement.java:145
#, java-format
-msgid "Failed to convert binary xml data to encoding: {0}."
-msgstr ""
-
-#: org/postgresql/jdbc/PgSQLXML.java:276
-msgid "Unable to convert DOMResult SQLXML data to a string."
+msgid ""
+"A CallableStatement function was executed and the out parameter {0} was of "
+"type {1} however type {2} was registered."
msgstr ""
+"Eine CallableStatement-Funktion wurde ausgef�hrt und der R�ckgabewert {0} "
+"war vom Typ {1}. Jedoch wurde der Typ {2} daf�r registriert."
-#: org/postgresql/jdbc/PgSQLXML.java:290
+#: org/postgresql/jdbc/PgCallableStatement.java:202
msgid ""
-"This SQLXML object has already been initialized, so you cannot manipulate it "
-"further."
+"This statement does not declare an OUT parameter. Use '{' ?= call ... '}' "
+"to declare one."
msgstr ""
+"Diese Anweisung deklariert keinen OUT-Parameter. Benutzen Sie '{' ?= "
+"call ... '}' um das zu tun."
-#: org/postgresql/jdbc/PgStatement.java:325
-msgid "Can''t use executeWithFlags(int) on a Statement."
+#: org/postgresql/jdbc/PgCallableStatement.java:246
+msgid "wasNull cannot be call before fetching a result."
msgstr ""
+"wasNull kann nicht aufgerufen werden, bevor ein Ergebnis abgefragt wurde."
-#: org/postgresql/jdbc/PgStatement.java:484
-msgid "Maximum number of rows must be a value grater than or equal to 0."
-msgstr "Die maximale Zeilenzahl muss ein Wert gr��er oder gleich Null sein."
-
-#: org/postgresql/jdbc/PgStatement.java:525
-msgid "Query timeout must be a value greater than or equals to 0."
-msgstr "Das Abfragetimeout muss ein Wert gr��er oder gleich Null sein."
-
-#: org/postgresql/jdbc/PgStatement.java:561
-msgid "The maximum field size must be a value greater than or equal to 0."
-msgstr "Die maximale Feldgr��e muss ein Wert gr��er oder gleich Null sein."
-
-#: org/postgresql/jdbc/PgStatement.java:871
-msgid "This statement has been closed."
-msgstr "Die Anweisung wurde geschlossen."
-
-#: org/postgresql/jdbc/PgStatement.java:1148
-#, fuzzy
+#: org/postgresql/jdbc/PgCallableStatement.java:384
+#: org/postgresql/jdbc/PgCallableStatement.java:403
+#, java-format
msgid ""
-"Returning autogenerated keys is only supported for 8.2 and later servers."
-msgstr "Die R�ckgabe automatisch generierter Schl�ssel wird nicht unterst�tzt,"
-
-#: org/postgresql/jdbc/PgStatement.java:1326
-#: org/postgresql/jdbc/PgStatement.java:1357
-#, fuzzy
-msgid "Returning autogenerated keys by column index is not supported."
-msgstr "Die R�ckgabe automatisch generierter Schl�ssel wird nicht unterst�tzt,"
-
-#: org/postgresql/jdbc/PSQLSavepoint.java:40
-#: org/postgresql/jdbc/PSQLSavepoint.java:54
-#: org/postgresql/jdbc/PSQLSavepoint.java:72
-msgid "Cannot reference a savepoint after it has been released."
+"Parameter of type {0} was registered, but call to get{1} (sqltype={2}) was "
+"made."
msgstr ""
-"Ein Rettungspunkt kann nicht angesprochen werden, nach dem er entfernt wurde."
-
-#: org/postgresql/jdbc/PSQLSavepoint.java:45
-msgid "Cannot retrieve the id of a named savepoint."
-msgstr "Die ID eines benamten Rettungspunktes kann nicht ermittelt werden."
-
-#: org/postgresql/jdbc/PSQLSavepoint.java:59
-msgid "Cannot retrieve the name of an unnamed savepoint."
-msgstr "Der Name eines namenlosen Rettungpunktes kann nicht ermittelt werden."
-
-#: org/postgresql/jdbc/TimestampUtils.java:298
-#, fuzzy, java-format
-msgid "Bad value for type timestamp/date/time: {1}"
-msgstr "Unzul�ssiger Wert f�r den Typ {0} : {1}."
+"Ein Parameter des Typs {0} wurde registriert, jedoch erfolgte ein Aufruf "
+"get{1} (sqltype={2})."
-#: org/postgresql/jdbc/TimestampUtils.java:359
+#: org/postgresql/jdbc/PgCallableStatement.java:424
msgid ""
-"Infinite value found for timestamp/date. This cannot be represented as time."
+"A CallableStatement was declared, but no call to registerOutParameter(1, "
+"<some type>) was made."
msgstr ""
-"F�r den Zeitstempel oder das Datum wurde der Wert ''unendlich'' gefunden. "
-"Dies kann nicht als Zeit repr�sentiert werden."
-
-#: org/postgresql/jdbc/TimestampUtils.java:674
-#: org/postgresql/jdbc/TimestampUtils.java:710
-#: org/postgresql/jdbc/TimestampUtils.java:757
-#, fuzzy, java-format
-msgid "Unsupported binary encoding of {0}."
-msgstr "Unbekannter Typ: {0}."
+"Ein CallableStatement wurde deklariert, aber kein Aufruf von "
+"''registerOutParameter(1, <some type>)'' erfolgte."
-#: org/postgresql/largeobject/LargeObjectManager.java:147
-msgid "Failed to initialize LargeObject API"
-msgstr "Die LargeObject-API konnte nicht initialisiert werden."
+#: org/postgresql/jdbc/PgCallableStatement.java:430
+#, fuzzy
+msgid "No function outputs were registered."
+msgstr "Es wurden keine Funktionsausgaben registriert."
-#: org/postgresql/largeobject/LargeObjectManager.java:265
-#: org/postgresql/largeobject/LargeObjectManager.java:308
-msgid "Large Objects may not be used in auto-commit mode."
+#: org/postgresql/jdbc/PgCallableStatement.java:436
+msgid ""
+"Results cannot be retrieved from a CallableStatement before it is executed."
msgstr ""
-"LargeObjects (LOB) d�rfen im Modus ''auto-commit'' nicht verwendet werden."
+"Ergebnisse k�nnen nicht von einem CallableStatement abgerufen werden, bevor "
+"es ausgef�hrt wurde."
-#: org/postgresql/osgi/PGDataSourceFactory.java:85
+#: org/postgresql/jdbc/PgCallableStatement.java:703
#, fuzzy, java-format
-msgid "Unsupported properties: {0}"
+msgid "Unsupported type conversion to {1}."
msgstr "Unbekannter Typ: {0}."
-#: org/postgresql/PGProperty.java:450 org/postgresql/PGProperty.java:470
+#: org/postgresql/jdbc/EscapedFunctions.java:240
#, java-format
-msgid "{0} parameter value must be an integer but was: {1}"
-msgstr ""
-
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:125
-msgid ""
-"Could not find a java cryptographic algorithm: X.509 CertificateFactory not "
-"available."
-msgstr ""
+msgid "{0} function takes four and only four argument."
+msgstr "Die {0}-Funktion erwartet genau vier Argumente."
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:135
+#: org/postgresql/jdbc/EscapedFunctions.java:270
+#: org/postgresql/jdbc/EscapedFunctions.java:344
+#: org/postgresql/jdbc/EscapedFunctions.java:749
+#: org/postgresql/jdbc/EscapedFunctions.java:787
#, java-format
-msgid "Could not open SSL certificate file {0}."
-msgstr ""
+msgid "{0} function takes two and only two arguments."
+msgstr "Die {0}-Funktion erwartet genau zwei Argumente."
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:140
+#: org/postgresql/jdbc/EscapedFunctions.java:288
+#: org/postgresql/jdbc/EscapedFunctions.java:326
+#: org/postgresql/jdbc/EscapedFunctions.java:446
+#: org/postgresql/jdbc/EscapedFunctions.java:461
+#: org/postgresql/jdbc/EscapedFunctions.java:476
+#: org/postgresql/jdbc/EscapedFunctions.java:491
+#: org/postgresql/jdbc/EscapedFunctions.java:506
+#: org/postgresql/jdbc/EscapedFunctions.java:521
+#: org/postgresql/jdbc/EscapedFunctions.java:536
+#: org/postgresql/jdbc/EscapedFunctions.java:551
+#: org/postgresql/jdbc/EscapedFunctions.java:566
+#: org/postgresql/jdbc/EscapedFunctions.java:581
+#: org/postgresql/jdbc/EscapedFunctions.java:596
+#: org/postgresql/jdbc/EscapedFunctions.java:611
+#: org/postgresql/jdbc/EscapedFunctions.java:775
#, java-format
-msgid "Loading the SSL certificate {0} into a KeyManager failed."
-msgstr ""
+msgid "{0} function takes one and only one argument."
+msgstr "Die {0}-Funktion erwartet nur genau ein Argument."
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:195
-msgid "Enter SSL password: "
-msgstr ""
+#: org/postgresql/jdbc/EscapedFunctions.java:310
+#: org/postgresql/jdbc/EscapedFunctions.java:391
+#, java-format
+msgid "{0} function takes two or three arguments."
+msgstr "Die {0}-Funktion erwartet zwei oder drei Argumente."
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:202
-msgid "Could not read password for SSL key file, console is not available."
-msgstr ""
+#: org/postgresql/jdbc/EscapedFunctions.java:416
+#: org/postgresql/jdbc/EscapedFunctions.java:431
+#: org/postgresql/jdbc/EscapedFunctions.java:734
+#: org/postgresql/jdbc/EscapedFunctions.java:764
+#, java-format
+msgid "{0} function doesn''t take any argument."
+msgstr "Die {0}-Funktion akzeptiert kein Argument."
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:207
+#: org/postgresql/jdbc/EscapedFunctions.java:627
+#: org/postgresql/jdbc/EscapedFunctions.java:680
#, java-format
-msgid "Could not read password for SSL key file by callbackhandler {0}."
-msgstr ""
+msgid "{0} function takes three and only three arguments."
+msgstr "Die {0}-Funktion erwartet genau drei Argumente."
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:226
+#: org/postgresql/jdbc/EscapedFunctions.java:640
+#: org/postgresql/jdbc/EscapedFunctions.java:661
+#: org/postgresql/jdbc/EscapedFunctions.java:664
+#: org/postgresql/jdbc/EscapedFunctions.java:697
+#: org/postgresql/jdbc/EscapedFunctions.java:710
+#: org/postgresql/jdbc/EscapedFunctions.java:713
#, java-format
-msgid "Could not decrypt SSL key file {0}."
-msgstr ""
+msgid "Interval {0} not yet implemented"
+msgstr "Intervall {0} ist noch nicht implementiert."
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:240
+#: org/postgresql/PGProperty.java:535 org/postgresql/PGProperty.java:555
#, java-format
-msgid "Could not read SSL key file {0}."
+msgid "{0} parameter value must be an integer but was: {1}"
msgstr ""
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:243
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:162
-#, java-format
-msgid "Could not find a java cryptographic algorithm: {0}."
+#: org/postgresql/largeobject/LargeObjectManager.java:144
+msgid "Failed to initialize LargeObject API"
+msgstr "Die LargeObject-API konnte nicht initialisiert werden."
+
+#: org/postgresql/largeobject/LargeObjectManager.java:262
+#: org/postgresql/largeobject/LargeObjectManager.java:305
+msgid "Large Objects may not be used in auto-commit mode."
msgstr ""
+"LargeObjects (LOB) d�rfen im Modus ''auto-commit'' nicht verwendet werden."
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:90
+#: org/postgresql/copy/PGCopyInputStream.java:51
#, fuzzy, java-format
-msgid "The password callback class provided {0} could not be instantiated."
-msgstr ""
-"Die von {0} bereitgestellte SSLSocketFactory-Klasse konnte nicht "
-"instanziiert werden."
+msgid "Copying from database failed: {0}"
+msgstr "Konnte �{0}� nicht in Typ �box� umwandeln"
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:123
-#, java-format
-msgid "Could not open SSL root certificate file {0}."
-msgstr ""
+#: org/postgresql/copy/PGCopyInputStream.java:67
+#: org/postgresql/copy/PGCopyOutputStream.java:94
+#, fuzzy
+msgid "This copy stream is closed."
+msgstr "Dieses ResultSet ist geschlossen."
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:139
-#, java-format
-msgid "Could not read SSL root certificate file {0}."
+#: org/postgresql/copy/PGCopyInputStream.java:110
+msgid "Read from copy failed."
msgstr ""
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:143
+#: org/postgresql/copy/CopyManager.java:53
#, java-format
-msgid "Loading the SSL root certificate {0} into a TrustManager failed."
+msgid "Requested CopyIn but got {0}"
msgstr ""
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:156
-msgid "Could not initialize SSL context."
+#: org/postgresql/copy/CopyManager.java:64
+#, java-format
+msgid "Requested CopyOut but got {0}"
msgstr ""
-#: org/postgresql/ssl/MakeSSL.java:52
+#: org/postgresql/copy/CopyManager.java:75
#, java-format
-msgid "The SSLSocketFactory class provided {0} could not be instantiated."
+msgid "Requested CopyDual but got {0}"
msgstr ""
-"Die von {0} bereitgestellte SSLSocketFactory-Klasse konnte nicht "
-"instanziiert werden."
-#: org/postgresql/ssl/MakeSSL.java:67
+#: org/postgresql/copy/PGCopyOutputStream.java:71
#, java-format
-msgid "SSL error: {0}"
+msgid "Cannot write to copy a byte of value {0}"
msgstr ""
-#: org/postgresql/ssl/MakeSSL.java:78
+#: org/postgresql/fastpath/Fastpath.java:80
#, fuzzy, java-format
-msgid "The HostnameVerifier class provided {0} could not be instantiated."
-msgstr ""
-"Die von {0} bereitgestellte SSLSocketFactory-Klasse konnte nicht "
-"instanziiert werden."
-
-#: org/postgresql/ssl/MakeSSL.java:84
-#, java-format
-msgid "The hostname {0} could not be verified by hostnameverifier {1}."
+msgid "Fastpath call {0} - No result was returned and we expected a numeric."
msgstr ""
+"Der Fastpath-Aufruf {0} gab kein Ergebnis zur�ck, jedoch wurde ein Integer "
+"erwartet."
-#: org/postgresql/ssl/MakeSSL.java:93
+#: org/postgresql/fastpath/Fastpath.java:157
#, java-format
-msgid "The hostname {0} could not be verified."
-msgstr ""
-
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:167
-msgid "The sslfactoryarg property may not be empty."
+msgid "Fastpath call {0} - No result was returned and we expected an integer."
msgstr ""
+"Der Fastpath-Aufruf {0} gab kein Ergebnis zur�ck, jedoch wurde ein Integer "
+"erwartet."
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:183
+#: org/postgresql/fastpath/Fastpath.java:165
+#, fuzzy, java-format
msgid ""
-"The environment variable containing the server's SSL certificate must not be "
-"empty."
+"Fastpath call {0} - No result was returned or wrong size while expecting an "
+"integer."
msgstr ""
+"Der Fastpath-Aufruf {0} gab kein Ergebnis zur�ck, jedoch wurde ein Integer "
+"erwartet."
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:191
-msgid ""
-"The system property containing the server's SSL certificate must not be "
-"empty."
+#: org/postgresql/fastpath/Fastpath.java:182
+#, fuzzy, java-format
+msgid "Fastpath call {0} - No result was returned and we expected a long."
msgstr ""
+"Der Fastpath-Aufruf {0} gab kein Ergebnis zur�ck, jedoch wurde ein Integer "
+"erwartet."
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:198
+#: org/postgresql/fastpath/Fastpath.java:190
+#, fuzzy, java-format
msgid ""
-"The sslfactoryarg property must start with the prefix file:, classpath:, "
-"env:, sys:, or -----BEGIN CERTIFICATE-----."
-msgstr ""
-
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:210
-#, fuzzy
-msgid "An error occurred reading the certificate"
-msgstr "Beim Aufbau der SSL-Verbindung trat ein Fehler auf."
-
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:243
-msgid "No X509TrustManager found"
+"Fastpath call {0} - No result was returned or wrong size while expecting a "
+"long."
msgstr ""
+"Der Fastpath-Aufruf {0} gab kein Ergebnis zur�ck, jedoch wurde ein Integer "
+"erwartet."
-#: org/postgresql/util/PGInterval.java:155
-msgid "Conversion of interval failed"
-msgstr "Die Umwandlung eines Intervalls schlug fehl."
-
-#: org/postgresql/util/PGmoney.java:65
-msgid "Conversion of money failed."
-msgstr "Die Umwandlung eines W�hrungsbetrags schlug fehl."
-
-#: org/postgresql/util/ServerErrorMessage.java:165
-#, java-format
-msgid "Detail: {0}"
-msgstr "Detail: {0}"
-
-#: org/postgresql/util/ServerErrorMessage.java:170
-#, java-format
-msgid "Hint: {0}"
-msgstr "Hinweis: {0}"
-
-#: org/postgresql/util/ServerErrorMessage.java:174
-#, java-format
-msgid "Position: {0}"
-msgstr "Position: {0}"
-
-#: org/postgresql/util/ServerErrorMessage.java:178
-#, java-format
-msgid "Where: {0}"
-msgstr "Wobei: {0}"
-
-#: org/postgresql/util/ServerErrorMessage.java:184
-#, java-format
-msgid "Internal Query: {0}"
-msgstr "Interne Abfrage: {0}"
-
-#: org/postgresql/util/ServerErrorMessage.java:188
-#, java-format
-msgid "Internal Position: {0}"
-msgstr "Interne Position: {0}"
-
-#: org/postgresql/util/ServerErrorMessage.java:195
-#, java-format
-msgid "Location: File: {0}, Routine: {1}, Line: {2}"
-msgstr "Ort: Datei: {0}, Routine: {1}, Zeile: {2}."
-
-#: org/postgresql/util/ServerErrorMessage.java:200
+#: org/postgresql/fastpath/Fastpath.java:302
#, java-format
-msgid "Server SQLState: {0}"
-msgstr "Server SQLState: {0}"
-
-#: org/postgresql/xa/PGXAConnection.java:148
-msgid ""
-"Transaction control methods setAutoCommit(true), commit, rollback and "
-"setSavePoint not allowed while an XA transaction is active."
-msgstr ""
-
-#: org/postgresql/xa/PGXAConnection.java:196
-#: org/postgresql/xa/PGXAConnection.java:265
-msgid "Invalid flags"
-msgstr "Ung�ltige Flags"
-
-#: org/postgresql/xa/PGXAConnection.java:200
-#: org/postgresql/xa/PGXAConnection.java:269
-#: org/postgresql/xa/PGXAConnection.java:437
-msgid "xid must not be null"
-msgstr "Die xid darf nicht null sein."
-
-#: org/postgresql/xa/PGXAConnection.java:204
-msgid "Connection is busy with another transaction"
-msgstr "Die Verbindung ist derzeit mit einer anderen Transaktion besch�ftigt."
-
-#: org/postgresql/xa/PGXAConnection.java:213
-#: org/postgresql/xa/PGXAConnection.java:279
-msgid "suspend/resume not implemented"
-msgstr "Anhalten/Fortsetzen ist nicht implementiert."
-
-#: org/postgresql/xa/PGXAConnection.java:219
-#: org/postgresql/xa/PGXAConnection.java:224
-#: org/postgresql/xa/PGXAConnection.java:228
-msgid "Transaction interleaving not implemented"
-msgstr "Transaktionsinterleaving ist nicht implementiert."
-
-#: org/postgresql/xa/PGXAConnection.java:239
-msgid "Error disabling autocommit"
-msgstr "Fehler beim Abschalten von Autocommit."
-
-#: org/postgresql/xa/PGXAConnection.java:273
-msgid "tried to call end without corresponding start call"
-msgstr ""
-"Es wurde versucht, ohne dazugeh�rigen ''start''-Aufruf ''end'' aufzurufen."
-
-#: org/postgresql/xa/PGXAConnection.java:305
-msgid ""
-"Not implemented: Prepare must be issued using the same connection that "
-"started the transaction"
-msgstr ""
-"Nicht implementiert: ''Prepare'' muss �ber die selbe Verbindung abgesetzt "
-"werden, die die Transaktion startete."
-
-#: org/postgresql/xa/PGXAConnection.java:309
-msgid "Prepare called before end"
-msgstr "''Prepare'' wurde vor ''end'' aufgerufen."
+msgid "The fastpath function {0} is unknown."
+msgstr "Die Fastpath-Funktion {0} ist unbekannt."
-#: org/postgresql/xa/PGXAConnection.java:317
-msgid "Server versions prior to 8.1 do not support two-phase commit."
-msgstr "Der Server unterst�tzt keine zweiphasige Best�tigung vor Version 8.1."
+#~ msgid ""
+#~ "Connection refused. Check that the hostname and port are correct and that "
+#~ "the postmaster is accepting TCP/IP connections."
+#~ msgstr ""
+#~ "Verbindung verweigert. �berpr�fen Sie die Korrektheit von Hostnamen und "
+#~ "der Portnummer und dass der Datenbankserver TCP/IP-Verbindungen annimmt."
-#: org/postgresql/xa/PGXAConnection.java:334
-msgid "Error preparing transaction"
-msgstr "Beim Vorbereiten der Transaktion trat ein Fehler auf."
+#, fuzzy
+#~ msgid "The connection url is invalid."
+#~ msgstr "Der Verbindungsversuch schlug fehl."
-#: org/postgresql/xa/PGXAConnection.java:349
-msgid "Invalid flag"
-msgstr "Ung�ltiges Flag."
+#~ msgid "Connection rejected: {0}."
+#~ msgstr "Verbindung abgewiesen: {0}."
-#: org/postgresql/xa/PGXAConnection.java:384
-msgid "Error during recover"
-msgstr "Beim Wiederherstellen trat ein Fehler auf."
+#~ msgid "Backend start-up failed: {0}."
+#~ msgstr "Das Backend konnte nicht gestartet werden: {0}."
-#: org/postgresql/xa/PGXAConnection.java:423
-#: org/postgresql/xa/PGXAConnection.java:426
-msgid "Error rolling back prepared transaction"
-msgstr "Fehler beim Rollback einer vorbereiteten Transaktion."
+#~ msgid "Server versions prior to 8.0 do not support savepoints."
+#~ msgstr "Der Server unterst�tzt keine Rettungspunkte vor Version 8.0."
-#: org/postgresql/xa/PGXAConnection.java:464
-msgid ""
-"Not implemented: one-phase commit must be issued using the same connection "
-"that was used to start it"
-msgstr ""
-"Nicht implementiert: Die einphasige Best�tigung muss �ber die selbe "
-"Verbindung abgewickelt werden, die verwendet wurde, um sie zu beginnen."
+#~ msgid "Unexpected error while decoding character data from a large object."
+#~ msgstr ""
+#~ "Ein unerwarteter Fehler trat beim Dekodieren von Zeichen aus einem "
+#~ "LargeObject (LOB) auf."
-#: org/postgresql/xa/PGXAConnection.java:468
-msgid "commit called before end"
-msgstr "''Commit'' wurde vor ''end'' aufgerufen."
+#, fuzzy
+#~ msgid ""
+#~ "Returning autogenerated keys is only supported for 8.2 and later servers."
+#~ msgstr ""
+#~ "Die R�ckgabe automatisch generierter Schl�ssel wird nicht unterst�tzt,"
-#: org/postgresql/xa/PGXAConnection.java:478
-msgid "Error during one-phase commit"
-msgstr "Bei der einphasigen Best�tigung trat ein Fehler auf."
+#~ msgid ""
+#~ "Infinite value found for timestamp/date. This cannot be represented as "
+#~ "time."
+#~ msgstr ""
+#~ "F�r den Zeitstempel oder das Datum wurde der Wert ''unendlich'' gefunden. "
+#~ "Dies kann nicht als Zeit repr�sentiert werden."
-#: org/postgresql/xa/PGXAConnection.java:497
-msgid ""
-"Not implemented: 2nd phase commit must be issued using an idle connection"
-msgstr ""
-"Nicht implementiert: Die zweite Best�tigungsphase muss �ber eine im Leerlauf "
-"befindliche Verbindung abgewickelt werden."
+#~ msgid "Transaction interleaving not implemented"
+#~ msgstr "Transaktionsinterleaving ist nicht implementiert."
-#: org/postgresql/xa/PGXAConnection.java:513
-#, fuzzy
-msgid "Error committing prepared transaction"
-msgstr "Fehler beim Rollback einer vorbereiteten Transaktion."
+#~ msgid "Server versions prior to 8.1 do not support two-phase commit."
+#~ msgstr ""
+#~ "Der Server unterst�tzt keine zweiphasige Best�tigung vor Version 8.1."
-#: org/postgresql/xa/PGXAConnection.java:529
-msgid "Heuristic commit/rollback not supported"
-msgstr "Heuristisches Commit/Rollback wird nicht unterst�tzt."
+#~ msgid "Invalid flag"
+#~ msgstr "Ung�ltiges Flag."
#~ msgid "The class {0} does not implement org.postgresql.util.PGobject."
#~ msgstr ""
diff --git a/pgjdbc/src/main/java/org/postgresql/translation/es.po b/pgjdbc/src/main/java/org/postgresql/translation/es.po
index f1c80fc..99151a7 100644
--- a/pgjdbc/src/main/java/org/postgresql/translation/es.po
+++ b/pgjdbc/src/main/java/org/postgresql/translation/es.po
@@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: JDBC PostgreSQL Driver\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-01-07 13:37+0300\n"
+"POT-Creation-Date: 2018-03-10 23:24+0300\n"
"PO-Revision-Date: 2004-10-22 16:51-0300\n"
"Last-Translator: Diego Gil <diego at adminsa.com>\n"
"Language-Team: \n"
@@ -15,289 +15,444 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"X-Poedit-Language: Spanish\n"
-#: org/postgresql/copy/CopyManager.java:57
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:164
+msgid "The sslfactoryarg property may not be empty."
+msgstr ""
+
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:180
+msgid ""
+"The environment variable containing the server's SSL certificate must not be "
+"empty."
+msgstr ""
+
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:188
+msgid ""
+"The system property containing the server's SSL certificate must not be "
+"empty."
+msgstr ""
+
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:195
+msgid ""
+"The sslfactoryarg property must start with the prefix file:, classpath:, "
+"env:, sys:, or -----BEGIN CERTIFICATE-----."
+msgstr ""
+
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:207
+#, fuzzy
+msgid "An error occurred reading the certificate"
+msgstr "Ha ocorrido un error mientras se establecía la conexión SSL."
+
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:240
+msgid "No X509TrustManager found"
+msgstr ""
+
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:133
+msgid ""
+"Could not find a java cryptographic algorithm: X.509 CertificateFactory not "
+"available."
+msgstr ""
+
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:143
#, java-format
-msgid "Requested CopyIn but got {0}"
+msgid "Could not open SSL certificate file {0}."
msgstr ""
-#: org/postgresql/copy/CopyManager.java:69
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:148
#, java-format
-msgid "Requested CopyOut but got {0}"
+msgid "Loading the SSL certificate {0} into a KeyManager failed."
msgstr ""
-#: org/postgresql/copy/PGCopyInputStream.java:54
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:205
+msgid "Enter SSL password: "
+msgstr ""
+
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:212
+msgid "Could not read password for SSL key file, console is not available."
+msgstr ""
+
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:217
#, java-format
-msgid "Copying from database failed: {0}"
+msgid "Could not read password for SSL key file by callbackhandler {0}."
msgstr ""
-#: org/postgresql/copy/PGCopyInputStream.java:70
-#: org/postgresql/copy/PGCopyOutputStream.java:97
-msgid "This copy stream is closed."
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:236
+#, java-format
+msgid "Could not decrypt SSL key file {0}."
msgstr ""
-#: org/postgresql/copy/PGCopyInputStream.java:113
-msgid "Read from copy failed."
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:250
+#, java-format
+msgid "Could not read SSL key file {0}."
msgstr ""
-#: org/postgresql/copy/PGCopyOutputStream.java:74
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:253
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:176
#, java-format
-msgid "Cannot write to copy a byte of value {0}"
+msgid "Could not find a java cryptographic algorithm: {0}."
msgstr ""
-#: org/postgresql/core/ConnectionFactory.java:74
-#, fuzzy, java-format
-msgid "A connection could not be made using the requested protocol {0}."
-msgstr "No se pudo hacer una conexión para el protocolo solicitado {0}."
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:99
+#, java-format
+msgid "The password callback class provided {0} could not be instantiated."
+msgstr ""
-#: org/postgresql/core/Oid.java:114
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:132
#, java-format
-msgid "oid type {0} not known and not a number"
+msgid "Could not open SSL root certificate file {0}."
msgstr ""
-#: org/postgresql/core/Parser.java:616
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:147
#, java-format
-msgid "Malformed function or procedure escape syntax at offset {0}."
+msgid "Could not read SSL root certificate file {0}."
msgstr ""
-#: org/postgresql/core/PGStream.java:497
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:151
#, java-format
-msgid "Premature end of input stream, expected {0} bytes, but only read {1}."
+msgid "Loading the SSL root certificate {0} into a TrustManager failed."
msgstr ""
-"Final prematuro del flujo de entrada, se esperaban {0} bytes, pero solo se "
-"leyeron {1}."
-#: org/postgresql/core/PGStream.java:538
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:170
+msgid "Could not initialize SSL context."
+msgstr ""
+
+#: org/postgresql/ssl/MakeSSL.java:52
#, java-format
-msgid "Expected an EOF from server, got: {0}"
+msgid "The SSLSocketFactory class provided {0} could not be instantiated."
msgstr ""
-#: org/postgresql/core/SetupQueryRunner.java:90
-msgid "An unexpected result was returned by a query."
-msgstr "Una consulta retornó un resultado inesperado."
+#: org/postgresql/ssl/MakeSSL.java:67
+#, java-format
+msgid "SSL error: {0}"
+msgstr ""
-#: org/postgresql/core/UTF8Encoding.java:31
+#: org/postgresql/ssl/MakeSSL.java:78
#, java-format
-msgid ""
-"Illegal UTF-8 sequence: byte {0} of {1} byte sequence is not 10xxxxxx: {2}"
+msgid "The HostnameVerifier class provided {0} could not be instantiated."
msgstr ""
-#: org/postgresql/core/UTF8Encoding.java:69
+#: org/postgresql/ssl/MakeSSL.java:84
#, java-format
-msgid "Illegal UTF-8 sequence: {0} bytes used to encode a {1} byte value: {2}"
+msgid "The hostname {0} could not be verified by hostnameverifier {1}."
msgstr ""
-#: org/postgresql/core/UTF8Encoding.java:104
-#: org/postgresql/core/UTF8Encoding.java:131
+#: org/postgresql/ssl/MakeSSL.java:93
#, java-format
-msgid "Illegal UTF-8 sequence: initial byte is {0}: {1}"
+msgid "The hostname {0} could not be verified."
+msgstr ""
+
+#: org/postgresql/gss/GssAction.java:126
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2550
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2581
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2585
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2640
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2650
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2659
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:655
+msgid "Protocol error. Session setup failed."
+msgstr "Error de protocolo. Falló el inicio de la sesión."
+
+#: org/postgresql/gss/GssAction.java:137 org/postgresql/gss/MakeGSS.java:66
+#: org/postgresql/gss/MakeGSS.java:74
+msgid "GSS Authentication failed"
msgstr ""
-#: org/postgresql/core/UTF8Encoding.java:137
+#: org/postgresql/core/Parser.java:933
#, java-format
-msgid "Illegal UTF-8 sequence: final value is out of range: {0}"
+msgid "Malformed function or procedure escape syntax at offset {0}."
msgstr ""
-#: org/postgresql/core/UTF8Encoding.java:153
+#: org/postgresql/core/SocketFactoryFactory.java:41
#, java-format
-msgid "Illegal UTF-8 sequence: final value is a surrogate value: {0}"
+msgid "The SocketFactory class provided {0} could not be instantiated."
msgstr ""
-#: org/postgresql/core/Utils.java:119 org/postgresql/core/Utils.java:136
+#: org/postgresql/core/Utils.java:93 org/postgresql/core/Utils.java:110
msgid "Zero bytes may not occur in string parameters."
msgstr ""
-#: org/postgresql/core/Utils.java:146 org/postgresql/core/Utils.java:217
+#: org/postgresql/core/Utils.java:120 org/postgresql/core/Utils.java:170
msgid "No IOException expected from StringBuffer or StringBuilder"
msgstr ""
-#: org/postgresql/core/Utils.java:206
+#: org/postgresql/core/Utils.java:159
msgid "Zero bytes may not occur in identifiers."
msgstr ""
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:72
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:87
+#: org/postgresql/core/UTF8Encoding.java:28
#, java-format
-msgid "Invalid sslmode value: {0}"
+msgid ""
+"Illegal UTF-8 sequence: byte {0} of {1} byte sequence is not 10xxxxxx: {2}"
msgstr ""
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:87
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:111
+#: org/postgresql/core/UTF8Encoding.java:66
#, java-format
-msgid "Invalid targetServerType value: {0}"
+msgid "Illegal UTF-8 sequence: {0} bytes used to encode a {1} byte value: {2}"
msgstr ""
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:152
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:228
+#: org/postgresql/core/UTF8Encoding.java:102
+#: org/postgresql/core/UTF8Encoding.java:129
#, java-format
-msgid "Could not find a server with specified targetServerType: {0}"
+msgid "Illegal UTF-8 sequence: initial byte is {0}: {1}"
msgstr ""
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:172
-msgid ""
-"Connection refused. Check that the hostname and port are correct and that "
-"the postmaster is accepting TCP/IP connections."
+#: org/postgresql/core/UTF8Encoding.java:135
+#, java-format
+msgid "Illegal UTF-8 sequence: final value is out of range: {0}"
msgstr ""
-"Conexión rechazada. Verifique que el nombre del Host y el puerto sean "
-"correctos y que postmaster este aceptando conexiones TCP/IP."
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:181
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:262
-msgid "The connection attempt failed."
-msgstr "El intento de conexión falló."
-
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:192
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:273
-#, fuzzy
-msgid "The connection url is invalid."
-msgstr "El intento de conexión falló."
+#: org/postgresql/core/UTF8Encoding.java:151
+#, java-format
+msgid "Illegal UTF-8 sequence: final value is a surrogate value: {0}"
+msgstr ""
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:218
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:233
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:324
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:339
-msgid "The server does not support SSL."
-msgstr "Este servidor no soporta SSL."
+#: org/postgresql/core/SetupQueryRunner.java:64
+msgid "An unexpected result was returned by a query."
+msgstr "Una consulta retornó un resultado inesperado."
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:249
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:355
-msgid "An error occurred while setting up the SSL connection."
-msgstr "Ha ocorrido un error mientras se establecía la conexión SSL."
+#: org/postgresql/core/PGStream.java:486
+#, java-format
+msgid "Premature end of input stream, expected {0} bytes, but only read {1}."
+msgstr ""
+"Final prematuro del flujo de entrada, se esperaban {0} bytes, pero solo se "
+"leyeron {1}."
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:300
+#: org/postgresql/core/PGStream.java:528
#, java-format
-msgid "Connection rejected: {0}."
-msgstr "Conexión rechazada: {0}."
+msgid "Expected an EOF from server, got: {0}"
+msgstr ""
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:321
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:349
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:375
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:456
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:486
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:515
-msgid ""
-"The server requested password-based authentication, but no password was "
-"provided."
+#: org/postgresql/core/v3/CopyOperationImpl.java:54
+msgid "CommandComplete expected COPY but got: "
msgstr ""
-"El servidor requiere autenticación basada en contraseña, pero no se ha "
-"provisto ninguna contraseña."
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:405
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:625
-#, fuzzy, java-format
-msgid ""
-"The authentication type {0} is not supported. Check that you have configured "
-"the pg_hba.conf file to include the client''s IP address or subnet, and that "
-"it is using an authentication scheme supported by the driver."
+#: org/postgresql/core/v3/CopyInImpl.java:47
+msgid "CopyIn copy direction can't receive data"
msgstr ""
-"El tipo de autenticación {0} no es soportada. Verifique que ha configurado "
-"el archivo pg_hba.conf para incluir las direcciones IP de los clientes o la "
-"subred, y que está usando un esquema de autenticación soportado por el "
-"driver."
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:412
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:455
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:632
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:688
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:744
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:754
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:763
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:774
-#: org/postgresql/gss/GssAction.java:130
-msgid "Protocol error. Session setup failed."
-msgstr "Error de protocolo. Falló el inicio de la sesión."
+#: org/postgresql/core/v3/QueryExecutorImpl.java:161
+msgid "Tried to obtain lock while already holding it"
+msgstr ""
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:443
-#, java-format
-msgid "Backend start-up failed: {0}."
-msgstr "Falló el arranque del Backend: {0}. "
-
-#: org/postgresql/core/v2/FastpathParameterList.java:63
-#: org/postgresql/core/v2/FastpathParameterList.java:89
-#: org/postgresql/core/v2/FastpathParameterList.java:100
-#: org/postgresql/core/v2/FastpathParameterList.java:111
-#: org/postgresql/core/v2/SimpleParameterList.java:70
-#: org/postgresql/core/v2/SimpleParameterList.java:94
-#: org/postgresql/core/v2/SimpleParameterList.java:105
-#: org/postgresql/core/v2/SimpleParameterList.java:116
-#: org/postgresql/core/v2/SimpleParameterList.java:127
-#: org/postgresql/core/v3/CompositeParameterList.java:36
-#: org/postgresql/core/v3/SimpleParameterList.java:53
-#: org/postgresql/core/v3/SimpleParameterList.java:64
-#: org/postgresql/jdbc/PgResultSet.java:2715
-#: org/postgresql/jdbc/PgResultSetMetaData.java:472
-#, java-format
-msgid "The column index is out of range: {0}, number of columns: {1}."
+#: org/postgresql/core/v3/QueryExecutorImpl.java:177
+msgid "Tried to break lock on database connection"
msgstr ""
-"El índice de la columna está fuera de rango: {0}, número de columnas: {1}."
-#: org/postgresql/core/v2/FastpathParameterList.java:164
-#: org/postgresql/core/v2/SimpleParameterList.java:191
-#: org/postgresql/core/v3/SimpleParameterList.java:225
-#, java-format
-msgid "No value specified for parameter {0}."
-msgstr "No se ha especificado un valor para el parámetro {0}."
+#: org/postgresql/core/v3/QueryExecutorImpl.java:195
+msgid "Interrupted while waiting to obtain lock on database connection"
+msgstr ""
-#: org/postgresql/core/v2/QueryExecutorImpl.java:87
-#: org/postgresql/core/v2/QueryExecutorImpl.java:347
-#: org/postgresql/core/v3/QueryExecutorImpl.java:404
-#: org/postgresql/core/v3/QueryExecutorImpl.java:465
+#: org/postgresql/core/v3/QueryExecutorImpl.java:327
+msgid "Unable to bind parameter values for statement."
+msgstr ""
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:333
+#: org/postgresql/core/v3/QueryExecutorImpl.java:485
+#: org/postgresql/core/v3/QueryExecutorImpl.java:559
+#: org/postgresql/core/v3/QueryExecutorImpl.java:602
+#: org/postgresql/core/v3/QueryExecutorImpl.java:729
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2372
+#: org/postgresql/util/StreamWrapper.java:130
+#, fuzzy
+msgid "An I/O error occurred while sending to the backend."
+msgstr "Un error de E/S ha ocurrido mientras se enviaba al backend."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:534
+#: org/postgresql/core/v3/QueryExecutorImpl.java:576
#, java-format
msgid "Expected command status BEGIN, got {0}."
msgstr ""
-#: org/postgresql/core/v2/QueryExecutorImpl.java:92
-#: org/postgresql/core/v3/QueryExecutorImpl.java:470
-#: org/postgresql/jdbc/PgResultSet.java:1731
+#: org/postgresql/core/v3/QueryExecutorImpl.java:581
+#: org/postgresql/jdbc/PgResultSet.java:1778
#, java-format
msgid "Unexpected command status: {0}."
msgstr ""
-#: org/postgresql/core/v2/QueryExecutorImpl.java:127
-#: org/postgresql/core/v2/QueryExecutorImpl.java:136
-#: org/postgresql/core/v2/QueryExecutorImpl.java:185
-#: org/postgresql/core/v2/QueryExecutorImpl.java:376
-#: org/postgresql/core/v3/QueryExecutorImpl.java:226
-#: org/postgresql/core/v3/QueryExecutorImpl.java:364
-#: org/postgresql/core/v3/QueryExecutorImpl.java:441
-#: org/postgresql/core/v3/QueryExecutorImpl.java:505
-#: org/postgresql/core/v3/QueryExecutorImpl.java:587
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2211
-#: org/postgresql/util/StreamWrapper.java:133
+#: org/postgresql/core/v3/QueryExecutorImpl.java:687
#, fuzzy
-msgid "An I/O error occurred while sending to the backend."
+msgid "An error occurred while trying to get the socket timeout."
msgstr "Un error de E/S ha ocurrido mientras se enviaba al backend."
-#: org/postgresql/core/v2/QueryExecutorImpl.java:180
-#: org/postgresql/core/v2/QueryExecutorImpl.java:235
-#: org/postgresql/core/v2/QueryExecutorImpl.java:249
-#: org/postgresql/core/v3/QueryExecutorImpl.java:582
-#: org/postgresql/core/v3/QueryExecutorImpl.java:642
+#: org/postgresql/core/v3/QueryExecutorImpl.java:722
+#: org/postgresql/core/v3/QueryExecutorImpl.java:798
#, java-format
msgid "Unknown Response Type {0}."
msgstr "Tipo de respuesta desconocida {0}."
-#: org/postgresql/core/v2/QueryExecutorImpl.java:453
-#: org/postgresql/core/v2/QueryExecutorImpl.java:503
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1962
+#: org/postgresql/core/v3/QueryExecutorImpl.java:745
+#, fuzzy
+msgid "An error occurred while trying to reset the socket timeout."
+msgstr "Un error de E/S ha ocurrido mientras se enviaba al backend."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:843
+msgid "Database connection failed when starting copy"
+msgstr ""
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:878
+msgid "Tried to cancel an inactive copy operation"
+msgstr ""
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:917
+msgid "Database connection failed when canceling copy operation"
+msgstr ""
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:933
+msgid "Missing expected error response to copy cancel request"
+msgstr ""
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:937
+#, java-format
+msgid "Got {0} error responses to single copy cancel request"
+msgstr ""
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:952
+msgid "Tried to end inactive copy"
+msgstr ""
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:967
+msgid "Database connection failed when ending copy"
+msgstr ""
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:985
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1005
+msgid "Tried to write to an inactive copy operation"
+msgstr ""
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:998
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1013
+msgid "Database connection failed when writing to copy"
+msgstr ""
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1028
+msgid "Tried to read from inactive copy"
+msgstr ""
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1035
+msgid "Database connection failed when reading from copy"
+msgstr ""
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1101
+#, java-format
+msgid "Received CommandComplete ''{0}'' without an active copy operation"
+msgstr ""
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1126
+#, java-format
+msgid "Got CopyInResponse from server during an active {0}"
+msgstr ""
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1140
+#, java-format
+msgid "Got CopyOutResponse from server during an active {0}"
+msgstr ""
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1154
+#, java-format
+msgid "Got CopyBothResponse from server during an active {0}"
+msgstr ""
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1170
+msgid "Got CopyData without an active copy operation"
+msgstr ""
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1174
+#, java-format
+msgid "Unexpected copydata from server for {0}"
+msgstr ""
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1234
+#, java-format
+msgid "Unexpected packet type during copy: {0}"
+msgstr ""
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1524
+#, java-format
+msgid ""
+"Bind message length {0} too long. This can be caused by very large or "
+"incorrect length specifications on InputStream parameters."
+msgstr ""
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2145
msgid "Ran out of memory retrieving query results."
msgstr ""
-#: org/postgresql/core/v2/QueryExecutorImpl.java:640
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2328
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2313
+msgid "The driver currently does not support COPY operations."
+msgstr ""
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2487
#, java-format
-msgid "Unable to interpret the update count in command completion tag: {0}."
+msgid "Unable to parse the count in command completion tag: {0}."
msgstr ""
-#: org/postgresql/core/v2/QueryExecutorImpl.java:654
-msgid "Copy not implemented for protocol version 2"
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2603
+#, java-format
+msgid ""
+"The server''s client_encoding parameter was changed to {0}. The JDBC driver "
+"requires client_encoding to be UTF8 for correct operation."
msgstr ""
-#: org/postgresql/core/v2/SocketFactoryFactory.java:36
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2611
#, java-format
-msgid "The SocketFactory class provided {0} could not be instantiated."
+msgid ""
+"The server''s DateStyle parameter was changed to {0}. The JDBC driver "
+"requires DateStyle to begin with ISO for correct operation."
+msgstr ""
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2624
+#, java-format
+msgid ""
+"The server''s standard_conforming_strings parameter was reported as {0}. The "
+"JDBC driver expected on or off."
+msgstr ""
+
+#: org/postgresql/core/v3/SimpleParameterList.java:54
+#: org/postgresql/core/v3/SimpleParameterList.java:65
+#: org/postgresql/core/v3/CompositeParameterList.java:33
+#: org/postgresql/jdbc/PgResultSetMetaData.java:493
+#: org/postgresql/jdbc/PgResultSet.java:2751
+#, java-format
+msgid "The column index is out of range: {0}, number of columns: {1}."
+msgstr ""
+"El índice de la columna está fuera de rango: {0}, número de columnas: {1}."
+
+#: org/postgresql/core/v3/SimpleParameterList.java:257
+#, java-format
+msgid "No value specified for parameter {0}."
+msgstr "No se ha especificado un valor para el parámetro {0}."
+
+#: org/postgresql/core/v3/SimpleParameterList.java:431
+#, fuzzy, java-format
+msgid "Added parameters index out of range: {0}, number of columns: {1}."
+msgstr ""
+"El índice del arreglo esta fuera de rango: {0}, número de elementos: {1}."
+
+#: org/postgresql/core/v3/replication/V3ReplicationProtocol.java:133
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:257
+msgid "The connection attempt failed."
+msgstr "El intento de conexión falló."
+
+#: org/postgresql/core/v3/replication/V3PGReplicationStream.java:144
+#, java-format
+msgid "Unexpected packet type during replication: {0}"
+msgstr ""
+
+#: org/postgresql/core/v3/replication/V3PGReplicationStream.java:269
+#, fuzzy
+msgid "This replication stream has been closed."
+msgstr "El intento de conexión falló."
+
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:109
+#, java-format
+msgid "Invalid sslmode value: {0}"
+msgstr ""
+
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:124
+#, java-format
+msgid "Invalid targetServerType value: {0}"
msgstr ""
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:253
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:246
#, fuzzy, java-format
msgid ""
"Connection to {0} refused. Check that the hostname and port are correct and "
@@ -306,153 +461,210 @@ msgstr ""
"Conexión rechazada. Verifique que el nombre del Host y el puerto sean "
"correctos y que postmaster este aceptando conexiones TCP/IP."
-#: org/postgresql/core/v3/CopyOperationImpl.java:57
-msgid "CommandComplete expected COPY but got: "
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:272
+#, java-format
+msgid "Could not find a server with specified targetServerType: {0}"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:83
-msgid "Tried to obtain lock while already holding it"
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:366
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:379
+msgid "The server does not support SSL."
+msgstr "Este servidor no soporta SSL."
+
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:393
+msgid "An error occurred while setting up the SSL connection."
+msgstr "Ha ocorrido un error mientras se establecía la conexión SSL."
+
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:494
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:521
+msgid ""
+"The server requested password-based authentication, but no password was "
+"provided."
msgstr ""
+"El servidor requiere autenticación basada en contraseña, pero no se ha "
+"provisto ninguna contraseña."
-#: org/postgresql/core/v3/QueryExecutorImpl.java:98
-msgid "Tried to break lock on database connection"
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:624
+msgid ""
+"SCRAM authentication is not supported by this driver. You need JDK >= 8 and "
+"pgjdbc >= 42.2.0 (not \".jre\" vesions)"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:115
-msgid "Interrupted while waiting to obtain lock on database connection"
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:648
+#, fuzzy, java-format
+msgid ""
+"The authentication type {0} is not supported. Check that you have configured "
+"the pg_hba.conf file to include the client''s IP address or subnet, and that "
+"it is using an authentication scheme supported by the driver."
msgstr ""
+"El tipo de autenticación {0} no es soportada. Verifique que ha configurado "
+"el archivo pg_hba.conf para incluir las direcciones IP de los clientes o la "
+"subred, y que está usando un esquema de autenticación soportado por el "
+"driver."
-#: org/postgresql/core/v3/QueryExecutorImpl.java:220
-msgid "Unable to bind parameter values for statement."
+#: org/postgresql/core/ConnectionFactory.java:57
+#, fuzzy, java-format
+msgid "A connection could not be made using the requested protocol {0}."
+msgstr "No se pudo hacer una conexión para el protocolo solicitado {0}."
+
+#: org/postgresql/core/Oid.java:116
+#, java-format
+msgid "oid type {0} not known and not a number"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:689
-msgid "Database connection failed when starting copy"
+#: org/postgresql/util/HStoreConverter.java:43
+#: org/postgresql/util/HStoreConverter.java:74
+#: org/postgresql/jdbc/PgArray.java:210
+#: org/postgresql/jdbc/PgResultSet.java:1924
+msgid ""
+"Invalid character data was found. This is most likely caused by stored data "
+"containing characters that are invalid for the character set the database "
+"was created in. The most common example of this is storing 8bit data in a "
+"SQL_ASCII database."
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:724
-msgid "Tried to cancel an inactive copy operation"
+#: org/postgresql/util/PGmoney.java:62
+msgid "Conversion of money failed."
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:765
-msgid "Database connection failed when canceling copy operation"
+#: org/postgresql/util/StreamWrapper.java:56
+#: org/postgresql/jdbc/PgPreparedStatement.java:1449
+msgid "Object is too large to send over the protocol."
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:781
-msgid "Missing expected error response to copy cancel request"
+#: org/postgresql/util/PGInterval.java:152
+msgid "Conversion of interval failed"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:785
+#: org/postgresql/util/ServerErrorMessage.java:45
#, java-format
-msgid "Got {0} error responses to single copy cancel request"
+msgid ""
+" (pgjdbc: autodetected server-encoding to be {0}, if the message is not "
+"readable, please check database logs and/or host, port, dbname, user, "
+"password, pg_hba.conf)"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:800
-msgid "Tried to end inactive copy"
+#: org/postgresql/util/ServerErrorMessage.java:176
+#, java-format
+msgid "Detail: {0}"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:815
-msgid "Database connection failed when ending copy"
+#: org/postgresql/util/ServerErrorMessage.java:181
+#, java-format
+msgid "Hint: {0}"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:833
-#: org/postgresql/core/v3/QueryExecutorImpl.java:855
-msgid "Tried to write to an inactive copy operation"
+#: org/postgresql/util/ServerErrorMessage.java:185
+#, java-format
+msgid "Position: {0}"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:848
-#: org/postgresql/core/v3/QueryExecutorImpl.java:863
-msgid "Database connection failed when writing to copy"
+#: org/postgresql/util/ServerErrorMessage.java:189
+#, java-format
+msgid "Where: {0}"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:877
-msgid "Tried to read from inactive copy"
+#: org/postgresql/util/ServerErrorMessage.java:195
+#, java-format
+msgid "Internal Query: {0}"
+msgstr ""
+
+#: org/postgresql/util/ServerErrorMessage.java:199
+#, java-format
+msgid "Internal Position: {0}"
+msgstr ""
+
+#: org/postgresql/util/ServerErrorMessage.java:206
+#, java-format
+msgid "Location: File: {0}, Routine: {1}, Line: {2}"
+msgstr ""
+
+#: org/postgresql/util/ServerErrorMessage.java:211
+#, java-format
+msgid "Server SQLState: {0}"
+msgstr "SQLState del servidor: {0}."
+
+#: org/postgresql/ds/PGPoolingDataSource.java:269
+msgid "Failed to setup DataSource."
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:884
-msgid "Database connection failed when reading from copy"
+#: org/postgresql/ds/PGPoolingDataSource.java:371
+msgid "DataSource has been closed."
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:956
+#: org/postgresql/ds/common/BaseDataSource.java:1132
+#: org/postgresql/ds/common/BaseDataSource.java:1142
#, java-format
-msgid "Received CommandComplete ''{0}'' without an active copy operation"
+msgid "Unsupported property name: {0}"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:983
-#, java-format
-msgid "Got CopyInResponse from server during an active {0}"
+#: org/postgresql/ds/PGPooledConnection.java:118
+msgid "This PooledConnection has already been closed."
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:999
-#, java-format
-msgid "Got CopyOutResponse from server during an active {0}"
+#: org/postgresql/ds/PGPooledConnection.java:314
+msgid ""
+"Connection has been closed automatically because a new connection was opened "
+"for the same PooledConnection or the PooledConnection has been closed."
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1017
-msgid "Got CopyData without an active copy operation"
+#: org/postgresql/ds/PGPooledConnection.java:315
+#, fuzzy
+msgid "Connection has been closed."
+msgstr "Conexión rechazada: {0}."
+
+#: org/postgresql/ds/PGPooledConnection.java:420
+msgid "Statement has been closed."
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1021
-#, java-format
-msgid "Unexpected copydata from server for {0}"
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:68
+msgid "No SCRAM mechanism(s) advertised by the server"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1061
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2037
-#, java-format
-msgid ""
-"The server''s client_encoding parameter was changed to {0}. The JDBC driver "
-"requires client_encoding to be UTF8 for correct operation."
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:81
+msgid "Invalid or unsupported by client SCRAM mechanisms"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1069
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2045
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:117
#, java-format
-msgid ""
-"The server''s DateStyle parameter was changed to {0}. The JDBC driver "
-"requires DateStyle to begin with ISO for correct operation."
+msgid "Invalid server-first-message: {0}"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1083
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2059
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:147
#, java-format
-msgid ""
-"The server''s standard_conforming_strings parameter was reported as {0}. The "
-"JDBC driver expected on or off."
+msgid "Invalid server-final-message: {0}"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1122
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:153
#, java-format
-msgid "Unexpected packet type during copy: {0}"
+msgid "SCRAM authentication failed, server returned error: {0}"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1393
-#, java-format
-msgid ""
-"Bind message length {0} too long. This can be caused by very large or "
-"incorrect length specifications on InputStream parameters."
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:160
+msgid "Invalid server SCRAM signature"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2131
-msgid "The driver currently does not support COPY operations."
+#: org/postgresql/osgi/PGDataSourceFactory.java:82
+#, java-format
+msgid "Unsupported properties: {0}"
msgstr ""
-#: org/postgresql/Driver.java:234
+#: org/postgresql/Driver.java:214
msgid "Error loading default settings from driverconfig.properties"
msgstr ""
-#: org/postgresql/Driver.java:247
+#: org/postgresql/Driver.java:226
msgid "Properties for the driver contains a non-string value for the key "
msgstr ""
-#: org/postgresql/Driver.java:290
+#: org/postgresql/Driver.java:270
msgid ""
"Your security policy has prevented the connection from being attempted. You "
"probably need to grant the connect java.net.SocketPermission to the database "
"server host and port that you wish to connect to."
msgstr ""
-#: org/postgresql/Driver.java:296 org/postgresql/Driver.java:362
+#: org/postgresql/Driver.java:276 org/postgresql/Driver.java:408
msgid ""
"Something unusual has occurred to cause the driver to fail. Please report "
"this exception."
@@ -460,1081 +672,972 @@ msgstr ""
"Algo inusual ha ocurrido que provocó un fallo en el controlador. Por favor "
"reporte esta excepción."
-#: org/postgresql/Driver.java:370
+#: org/postgresql/Driver.java:416
#, fuzzy
msgid "Connection attempt timed out."
msgstr "El intento de conexión falló."
-#: org/postgresql/Driver.java:383
+#: org/postgresql/Driver.java:429
#, fuzzy
msgid "Interrupted while attempting to connect."
msgstr "Ha ocorrido un error mientras se establecía la conexión SSL."
-#: org/postgresql/Driver.java:645
+#: org/postgresql/Driver.java:682
#, fuzzy, java-format
msgid "Method {0} is not yet implemented."
msgstr "Este método aún no ha sido implementado."
-#: org/postgresql/ds/common/BaseDataSource.java:1037
-#: org/postgresql/ds/common/BaseDataSource.java:1047
+#: org/postgresql/geometric/PGlseg.java:70
+#: org/postgresql/geometric/PGline.java:107
+#: org/postgresql/geometric/PGline.java:116
+#: org/postgresql/geometric/PGcircle.java:74
+#: org/postgresql/geometric/PGcircle.java:82
+#: org/postgresql/geometric/PGpoint.java:76
+#: org/postgresql/geometric/PGbox.java:77
#, java-format
-msgid "Unsupported property name: {0}"
+msgid "Conversion to type {0} failed: {1}."
msgstr ""
-#: org/postgresql/ds/PGPooledConnection.java:118
-msgid "This PooledConnection has already been closed."
+#: org/postgresql/geometric/PGpath.java:70
+#, java-format
+msgid "Cannot tell if path is open or closed: {0}."
msgstr ""
-#: org/postgresql/ds/PGPooledConnection.java:313
+#: org/postgresql/xa/PGXAConnection.java:128
msgid ""
-"Connection has been closed automatically because a new connection was opened "
-"for the same PooledConnection or the PooledConnection has been closed."
+"Transaction control methods setAutoCommit(true), commit, rollback and "
+"setSavePoint not allowed while an XA transaction is active."
msgstr ""
-#: org/postgresql/ds/PGPooledConnection.java:314
-#, fuzzy
-msgid "Connection has been closed."
-msgstr "Conexión rechazada: {0}."
-
-#: org/postgresql/ds/PGPooledConnection.java:418
-msgid "Statement has been closed."
+#: org/postgresql/xa/PGXAConnection.java:177
+#: org/postgresql/xa/PGXAConnection.java:253
+#: org/postgresql/xa/PGXAConnection.java:347
+#, java-format
+msgid "Invalid flags {0}"
msgstr ""
-#: org/postgresql/ds/PGPoolingDataSource.java:269
-msgid "Failed to setup DataSource."
+#: org/postgresql/xa/PGXAConnection.java:181
+#: org/postgresql/xa/PGXAConnection.java:257
+#: org/postgresql/xa/PGXAConnection.java:449
+msgid "xid must not be null"
msgstr ""
-#: org/postgresql/ds/PGPoolingDataSource.java:371
-msgid "DataSource has been closed."
+#: org/postgresql/xa/PGXAConnection.java:185
+msgid "Connection is busy with another transaction"
msgstr ""
-#: org/postgresql/fastpath/Fastpath.java:82
+#: org/postgresql/xa/PGXAConnection.java:194
+#: org/postgresql/xa/PGXAConnection.java:267
+#, fuzzy
+msgid "suspend/resume not implemented"
+msgstr "Este método aún no ha sido implementado."
+
+#: org/postgresql/xa/PGXAConnection.java:202
+#: org/postgresql/xa/PGXAConnection.java:209
+#: org/postgresql/xa/PGXAConnection.java:213
#, java-format
-msgid "Fastpath call {0} - No result was returned and we expected a numeric."
+msgid ""
+"Invalid protocol state requested. Attempted transaction interleaving is not "
+"supported. xid={0}, currentXid={1}, state={2}, flags={3}"
msgstr ""
-#: org/postgresql/fastpath/Fastpath.java:165
-#, java-format
-msgid "Fastpath call {0} - No result was returned and we expected an integer."
+#: org/postgresql/xa/PGXAConnection.java:224
+msgid "Error disabling autocommit"
msgstr ""
-#: org/postgresql/fastpath/Fastpath.java:174
+#: org/postgresql/xa/PGXAConnection.java:261
#, java-format
msgid ""
-"Fastpath call {0} - No result was returned or wrong size while expecting an "
-"integer."
+"tried to call end without corresponding start call. state={0}, start "
+"xid={1}, currentXid={2}, preparedXid={3}"
msgstr ""
-#: org/postgresql/fastpath/Fastpath.java:191
-#, fuzzy, java-format
-msgid "Fastpath call {0} - No result was returned and we expected a long."
-msgstr "Se retornó un resultado cuando no se esperaba ninguno."
-
-#: org/postgresql/fastpath/Fastpath.java:200
+#: org/postgresql/xa/PGXAConnection.java:297
#, java-format
msgid ""
-"Fastpath call {0} - No result was returned or wrong size while expecting a "
-"long."
+"Preparing already prepared transaction, the prepared xid {0}, prepare xid={1}"
msgstr ""
-#: org/postgresql/fastpath/Fastpath.java:312
+#: org/postgresql/xa/PGXAConnection.java:300
#, java-format
-msgid "The fastpath function {0} is unknown."
+msgid "Current connection does not have an associated xid. prepare xid={0}"
msgstr ""
-#: org/postgresql/geometric/PGbox.java:79
-#: org/postgresql/geometric/PGcircle.java:76
-#: org/postgresql/geometric/PGcircle.java:84
-#: org/postgresql/geometric/PGline.java:109
-#: org/postgresql/geometric/PGline.java:118
-#: org/postgresql/geometric/PGlseg.java:72
-#: org/postgresql/geometric/PGpoint.java:78
+#: org/postgresql/xa/PGXAConnection.java:307
#, java-format
-msgid "Conversion to type {0} failed: {1}."
+msgid ""
+"Not implemented: Prepare must be issued using the same connection that "
+"started the transaction. currentXid={0}, prepare xid={1}"
msgstr ""
-#: org/postgresql/geometric/PGpath.java:73
+#: org/postgresql/xa/PGXAConnection.java:311
#, java-format
-msgid "Cannot tell if path is open or closed: {0}."
+msgid "Prepare called before end. prepare xid={0}, state={1}"
msgstr ""
-#: org/postgresql/gss/GssAction.java:141 org/postgresql/gss/MakeGSS.java:69
-#: org/postgresql/gss/MakeGSS.java:77
-msgid "GSS Authentication failed"
+#: org/postgresql/xa/PGXAConnection.java:331
+#, java-format
+msgid "Error preparing transaction. prepare xid={0}"
msgstr ""
-#: org/postgresql/jdbc/AbstractBlobClob.java:89
-msgid ""
-"Truncation of large objects is only implemented in 8.3 and later servers."
+#: org/postgresql/xa/PGXAConnection.java:382
+msgid "Error during recover"
msgstr ""
-#: org/postgresql/jdbc/AbstractBlobClob.java:94
-msgid "Cannot truncate LOB to a negative length."
+#: org/postgresql/xa/PGXAConnection.java:438
+#, java-format
+msgid ""
+"Error rolling back prepared transaction. rollback xid={0}, preparedXid={1}, "
+"currentXid={2}"
msgstr ""
-#: org/postgresql/jdbc/AbstractBlobClob.java:101
-#: org/postgresql/jdbc/AbstractBlobClob.java:245
+#: org/postgresql/xa/PGXAConnection.java:471
#, java-format
-msgid "PostgreSQL LOBs can only index to: {0}"
+msgid ""
+"One-phase commit called for xid {0} but connection was prepared with xid {1}"
msgstr ""
-#: org/postgresql/jdbc/AbstractBlobClob.java:241
-msgid "LOB positioning offsets start at 1."
+#: org/postgresql/xa/PGXAConnection.java:479
+msgid ""
+"Not implemented: one-phase commit must be issued using the same connection "
+"that was used to start it"
msgstr ""
-#: org/postgresql/jdbc/AbstractBlobClob.java:257
-msgid "free() was called on this LOB previously"
+#: org/postgresql/xa/PGXAConnection.java:483
+#, java-format
+msgid "One-phase commit with unknown xid. commit xid={0}, currentXid={1}"
msgstr ""
-#: org/postgresql/jdbc/BatchResultHandler.java:41
-#: org/postgresql/jdbc/PgConnection.java:474
-#: org/postgresql/jdbc/PgPreparedStatement.java:138
-#: org/postgresql/jdbc/PgStatement.java:299
-msgid "A result was returned when none was expected."
-msgstr "Se retornó un resultado cuando no se esperaba ninguno."
-
-#: org/postgresql/jdbc/BatchResultHandler.java:59
-#, fuzzy
-msgid "Too many update results were returned."
-msgstr "La consulta no retornó ningún resultado."
-
-#: org/postgresql/jdbc/BatchResultHandler.java:88
+#: org/postgresql/xa/PGXAConnection.java:487
#, java-format
-msgid ""
-"Batch entry {0} {1} was aborted. Call getNextException to see the cause."
+msgid "commit called before end. commit xid={0}, state={1}"
msgstr ""
-#: org/postgresql/jdbc/EscapedFunctions.java:243
+#: org/postgresql/xa/PGXAConnection.java:498
#, java-format
-msgid "{0} function takes four and only four argument."
+msgid "Error during one-phase commit. commit xid={0}"
msgstr ""
-#: org/postgresql/jdbc/EscapedFunctions.java:273
-#: org/postgresql/jdbc/EscapedFunctions.java:347
-#: org/postgresql/jdbc/EscapedFunctions.java:752
-#: org/postgresql/jdbc/EscapedFunctions.java:790
-#, java-format
-msgid "{0} function takes two and only two arguments."
+#: org/postgresql/xa/PGXAConnection.java:517
+msgid ""
+"Not implemented: 2nd phase commit must be issued using an idle connection. "
+"commit xid={0}, currentXid={1}, state={2], transactionState={3}"
msgstr ""
-#: org/postgresql/jdbc/EscapedFunctions.java:291
-#: org/postgresql/jdbc/EscapedFunctions.java:329
-#: org/postgresql/jdbc/EscapedFunctions.java:449
-#: org/postgresql/jdbc/EscapedFunctions.java:464
-#: org/postgresql/jdbc/EscapedFunctions.java:479
-#: org/postgresql/jdbc/EscapedFunctions.java:494
-#: org/postgresql/jdbc/EscapedFunctions.java:509
-#: org/postgresql/jdbc/EscapedFunctions.java:524
-#: org/postgresql/jdbc/EscapedFunctions.java:539
-#: org/postgresql/jdbc/EscapedFunctions.java:554
-#: org/postgresql/jdbc/EscapedFunctions.java:569
-#: org/postgresql/jdbc/EscapedFunctions.java:584
-#: org/postgresql/jdbc/EscapedFunctions.java:599
-#: org/postgresql/jdbc/EscapedFunctions.java:614
-#: org/postgresql/jdbc/EscapedFunctions.java:778
+#: org/postgresql/xa/PGXAConnection.java:550
#, java-format
-msgid "{0} function takes one and only one argument."
+msgid ""
+"Error committing prepared transaction. commit xid={0}, preparedXid={1}, "
+"currentXid={2}"
msgstr ""
-#: org/postgresql/jdbc/EscapedFunctions.java:313
-#: org/postgresql/jdbc/EscapedFunctions.java:394
+#: org/postgresql/xa/PGXAConnection.java:567
#, java-format
-msgid "{0} function takes two or three arguments."
+msgid "Heuristic commit/rollback not supported. forget xid={0}"
msgstr ""
-#: org/postgresql/jdbc/EscapedFunctions.java:419
-#: org/postgresql/jdbc/EscapedFunctions.java:434
-#: org/postgresql/jdbc/EscapedFunctions.java:737
-#: org/postgresql/jdbc/EscapedFunctions.java:767
-#, java-format
-msgid "{0} function doesn''t take any argument."
+#: org/postgresql/jdbc/PgSQLXML.java:147
+msgid "Unable to decode xml data."
msgstr ""
-#: org/postgresql/jdbc/EscapedFunctions.java:630
-#: org/postgresql/jdbc/EscapedFunctions.java:683
+#: org/postgresql/jdbc/PgSQLXML.java:150
#, java-format
-msgid "{0} function takes three and only three arguments."
+msgid "Unknown XML Source class: {0}"
msgstr ""
-#: org/postgresql/jdbc/EscapedFunctions.java:643
-#: org/postgresql/jdbc/EscapedFunctions.java:664
-#: org/postgresql/jdbc/EscapedFunctions.java:667
-#: org/postgresql/jdbc/EscapedFunctions.java:700
-#: org/postgresql/jdbc/EscapedFunctions.java:713
-#: org/postgresql/jdbc/EscapedFunctions.java:716
-#, fuzzy, java-format
-msgid "Interval {0} not yet implemented"
-msgstr "Este método aún no ha sido implementado."
+#: org/postgresql/jdbc/PgSQLXML.java:193
+#, fuzzy
+msgid "Unable to create SAXResult for SQLXML."
+msgstr "Fallo al crear objeto: {0}."
-#: org/postgresql/jdbc/PgArray.java:166 org/postgresql/jdbc/PgArray.java:822
-#, java-format
-msgid "The array index is out of range: {0}"
+#: org/postgresql/jdbc/PgSQLXML.java:208
+msgid "Unable to create StAXResult for SQLXML"
msgstr ""
-#: org/postgresql/jdbc/PgArray.java:183 org/postgresql/jdbc/PgArray.java:839
+#: org/postgresql/jdbc/PgSQLXML.java:213
#, java-format
-msgid "The array index is out of range: {0}, number of elements: {1}."
+msgid "Unknown XML Result class: {0}"
+msgstr ""
+
+#: org/postgresql/jdbc/PgSQLXML.java:225
+msgid "This SQLXML object has already been freed."
msgstr ""
-"El índice del arreglo esta fuera de rango: {0}, número de elementos: {1}."
-#: org/postgresql/jdbc/PgArray.java:215
-#: org/postgresql/jdbc/PgResultSet.java:1885
-#: org/postgresql/util/HStoreConverter.java:38
-#: org/postgresql/util/HStoreConverter.java:69
+#: org/postgresql/jdbc/PgSQLXML.java:234
msgid ""
-"Invalid character data was found. This is most likely caused by stored data "
-"containing characters that are invalid for the character set the database "
-"was created in. The most common example of this is storing 8bit data in a "
-"SQL_ASCII database."
+"This SQLXML object has not been initialized, so you cannot retrieve data "
+"from it."
msgstr ""
-#: org/postgresql/jdbc/PgCallableStatement.java:90
-#: org/postgresql/jdbc/PgCallableStatement.java:96
-msgid "A CallableStatement was executed with nothing returned."
+#: org/postgresql/jdbc/PgSQLXML.java:247
+#, java-format
+msgid "Failed to convert binary xml data to encoding: {0}."
msgstr ""
-#: org/postgresql/jdbc/PgCallableStatement.java:107
-msgid "A CallableStatement was executed with an invalid number of parameters"
+#: org/postgresql/jdbc/PgSQLXML.java:273
+msgid "Unable to convert DOMResult SQLXML data to a string."
msgstr ""
-#: org/postgresql/jdbc/PgCallableStatement.java:139
-#, java-format
+#: org/postgresql/jdbc/PgSQLXML.java:287
msgid ""
-"A CallableStatement function was executed and the out parameter {0} was of "
-"type {1} however type {2} was registered."
+"This SQLXML object has already been initialized, so you cannot manipulate it "
+"further."
msgstr ""
-#: org/postgresql/jdbc/PgCallableStatement.java:195
-msgid ""
-"This statement does not declare an OUT parameter. Use '{' ?= call ... '}' "
-"to declare one."
+#: org/postgresql/jdbc/PSQLSavepoint.java:37
+#: org/postgresql/jdbc/PSQLSavepoint.java:51
+#: org/postgresql/jdbc/PSQLSavepoint.java:69
+msgid "Cannot reference a savepoint after it has been released."
msgstr ""
-#: org/postgresql/jdbc/PgCallableStatement.java:239
-msgid "wasNull cannot be call before fetching a result."
+#: org/postgresql/jdbc/PSQLSavepoint.java:42
+msgid "Cannot retrieve the id of a named savepoint."
+msgstr ""
+
+#: org/postgresql/jdbc/PSQLSavepoint.java:56
+msgid "Cannot retrieve the name of an unnamed savepoint."
msgstr ""
-#: org/postgresql/jdbc/PgCallableStatement.java:377
-#: org/postgresql/jdbc/PgCallableStatement.java:396
+#: org/postgresql/jdbc/PgArray.java:157 org/postgresql/jdbc/PgArray.java:844
#, java-format
-msgid ""
-"Parameter of type {0} was registered, but call to get{1} (sqltype={2}) was "
-"made."
+msgid "The array index is out of range: {0}"
msgstr ""
-#: org/postgresql/jdbc/PgCallableStatement.java:417
-msgid ""
-"A CallableStatement was declared, but no call to registerOutParameter(1, "
-"<some type>) was made."
+#: org/postgresql/jdbc/PgArray.java:178 org/postgresql/jdbc/PgArray.java:861
+#, java-format
+msgid "The array index is out of range: {0}, number of elements: {1}."
msgstr ""
+"El índice del arreglo esta fuera de rango: {0}, número de elementos: {1}."
-#: org/postgresql/jdbc/PgCallableStatement.java:423
-msgid "No function outputs were registered."
+#: org/postgresql/jdbc/PgParameterMetaData.java:83
+#, fuzzy, java-format
+msgid "The parameter index is out of range: {0}, number of parameters: {1}."
msgstr ""
+"El índice del arreglo esta fuera de rango: {0}, número de elementos: {1}."
+
+#: org/postgresql/jdbc/BatchResultHandler.java:92
+#, fuzzy
+msgid "Too many update results were returned."
+msgstr "La consulta no retornó ningún resultado."
-#: org/postgresql/jdbc/PgCallableStatement.java:429
+#: org/postgresql/jdbc/BatchResultHandler.java:146
+#, java-format
msgid ""
-"Results cannot be retrieved from a CallableStatement before it is executed."
+"Batch entry {0} {1} was aborted: {2} Call getNextException to see other "
+"errors in the batch."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:312
+#: org/postgresql/jdbc/PgConnection.java:272
#, java-format
msgid "Unsupported value for stringtype parameter: {0}"
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:457
-#: org/postgresql/jdbc/PgPreparedStatement.java:115
-#: org/postgresql/jdbc/PgStatement.java:282
-#: org/postgresql/jdbc/TypeInfoCache.java:230
-#: org/postgresql/jdbc/TypeInfoCache.java:370
-#: org/postgresql/jdbc/TypeInfoCache.java:412
+#: org/postgresql/jdbc/PgConnection.java:424
+#: org/postgresql/jdbc/PgStatement.java:225
+#: org/postgresql/jdbc/TypeInfoCache.java:226
+#: org/postgresql/jdbc/TypeInfoCache.java:371
+#: org/postgresql/jdbc/TypeInfoCache.java:411
+#: org/postgresql/jdbc/TypeInfoCache.java:484
#: org/postgresql/jdbc/TypeInfoCache.java:489
-#: org/postgresql/jdbc/TypeInfoCache.java:494
-#: org/postgresql/jdbc/TypeInfoCache.java:535
-#: org/postgresql/jdbc/TypeInfoCache.java:540
+#: org/postgresql/jdbc/TypeInfoCache.java:526
+#: org/postgresql/jdbc/TypeInfoCache.java:531
+#: org/postgresql/jdbc/PgPreparedStatement.java:119
msgid "No results were returned by the query."
msgstr "La consulta no retornó ningún resultado."
-#: org/postgresql/jdbc/PgConnection.java:578
+#: org/postgresql/jdbc/PgConnection.java:441
+#: org/postgresql/jdbc/PgStatement.java:254
+msgid "A result was returned when none was expected."
+msgstr "Se retornó un resultado cuando no se esperaba ninguno."
+
+#: org/postgresql/jdbc/PgConnection.java:545
msgid "Custom type maps are not supported."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:620
+#: org/postgresql/jdbc/PgConnection.java:587
#, java-format
msgid "Failed to create object for: {0}."
msgstr "Fallo al crear objeto: {0}."
-#: org/postgresql/jdbc/PgConnection.java:672
+#: org/postgresql/jdbc/PgConnection.java:641
#, java-format
msgid "Unable to load the class {0} responsible for the datatype {1}"
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:724
+#: org/postgresql/jdbc/PgConnection.java:693
msgid ""
"Cannot change transaction read-only property in the middle of a transaction."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:775
+#: org/postgresql/jdbc/PgConnection.java:756
msgid "Cannot commit when autoCommit is enabled."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:786
-#: org/postgresql/jdbc/PgConnection.java:1358
-#: org/postgresql/jdbc/PgConnection.java:1395
+#: org/postgresql/jdbc/PgConnection.java:767
+#: org/postgresql/jdbc/PgConnection.java:1384
+#: org/postgresql/jdbc/PgConnection.java:1428
#, fuzzy
msgid "This connection has been closed."
msgstr "El intento de conexión falló."
-#: org/postgresql/jdbc/PgConnection.java:796
+#: org/postgresql/jdbc/PgConnection.java:777
msgid "Cannot rollback when autoCommit is enabled."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:870
+#: org/postgresql/jdbc/PgConnection.java:827
msgid ""
"Cannot change transaction isolation level in the middle of a transaction."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:876
+#: org/postgresql/jdbc/PgConnection.java:833
#, java-format
msgid "Transaction isolation level {0} not supported."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:921
+#: org/postgresql/jdbc/PgConnection.java:878
msgid "Finalizing a Connection that was never closed:"
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:1009
+#: org/postgresql/jdbc/PgConnection.java:945
msgid "Unable to translate data into the desired encoding."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:1081
-#: org/postgresql/jdbc/PgResultSet.java:1782
-#: org/postgresql/jdbc/PgStatement.java:1053
+#: org/postgresql/jdbc/PgConnection.java:1008
+#: org/postgresql/jdbc/PgStatement.java:903
+#: org/postgresql/jdbc/PgResultSet.java:1817
msgid "Fetch size must be a value greater to or equal to 0."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:1311
+#: org/postgresql/jdbc/PgConnection.java:1289
+#: org/postgresql/jdbc/PgConnection.java:1330
#, java-format
msgid "Unable to find server array type for provided name {0}."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:1327
+#: org/postgresql/jdbc/PgConnection.java:1312
+#, java-format
+msgid "Invalid elements {0}"
+msgstr ""
+
+#: org/postgresql/jdbc/PgConnection.java:1348
#, java-format
msgid "Invalid timeout ({0}<0)."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:1340
+#: org/postgresql/jdbc/PgConnection.java:1372
msgid "Validating connection."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:1375
+#: org/postgresql/jdbc/PgConnection.java:1405
#, fuzzy, java-format
msgid "Failed to set ClientInfo property: {0}"
msgstr "Fallo al crear objeto: {0}."
-#: org/postgresql/jdbc/PgConnection.java:1383
+#: org/postgresql/jdbc/PgConnection.java:1415
msgid "ClientInfo property not supported."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:1408
+#: org/postgresql/jdbc/PgConnection.java:1441
msgid "One ore more ClientInfo failed."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:1517
-#, java-format
-msgid "Unknown ResultSet holdability setting: {0}."
+#: org/postgresql/jdbc/PgConnection.java:1540
+msgid "Network timeout must be a value greater than or equal to 0."
+msgstr ""
+
+#: org/postgresql/jdbc/PgConnection.java:1552
+msgid "Unable to set network timeout."
+msgstr ""
+
+#: org/postgresql/jdbc/PgConnection.java:1563
+msgid "Unable to get network timeout."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:1531
-#: org/postgresql/jdbc/PgConnection.java:1554
-#: org/postgresql/jdbc/PgConnection.java:1576
-#: org/postgresql/jdbc/PgConnection.java:1587
-msgid "Server versions prior to 8.0 do not support savepoints."
+#: org/postgresql/jdbc/PgConnection.java:1580
+#, java-format
+msgid "Unknown ResultSet holdability setting: {0}."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:1535
-#: org/postgresql/jdbc/PgConnection.java:1558
+#: org/postgresql/jdbc/PgConnection.java:1598
+#: org/postgresql/jdbc/PgConnection.java:1619
msgid "Cannot establish a savepoint in auto-commit mode."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:1635
+#: org/postgresql/jdbc/PgConnection.java:1685
msgid "Returning autogenerated keys is not supported."
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:78
+#: org/postgresql/jdbc/PgStatement.java:235
+msgid "Multiple ResultSets were returned by the query."
+msgstr ""
+
+#: org/postgresql/jdbc/PgStatement.java:316
+msgid "Can''t use executeWithFlags(int) on a Statement."
+msgstr ""
+
+#: org/postgresql/jdbc/PgStatement.java:509
+msgid "Maximum number of rows must be a value grater than or equal to 0."
+msgstr ""
+
+#: org/postgresql/jdbc/PgStatement.java:550
+msgid "Query timeout must be a value greater than or equals to 0."
+msgstr ""
+
+#: org/postgresql/jdbc/PgStatement.java:590
+msgid "The maximum field size must be a value greater than or equal to 0."
+msgstr ""
+
+#: org/postgresql/jdbc/PgStatement.java:689
+msgid "This statement has been closed."
+msgstr ""
+
+#: org/postgresql/jdbc/PgStatement.java:895
+#: org/postgresql/jdbc/PgResultSet.java:878
+#, java-format
+msgid "Invalid fetch direction constant: {0}."
+msgstr ""
+
+#: org/postgresql/jdbc/PgStatement.java:1145
+#: org/postgresql/jdbc/PgStatement.java:1173
+msgid "Returning autogenerated keys by column index is not supported."
+msgstr ""
+
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:66
msgid ""
"Unable to determine a value for MaxIndexKeys due to missing system catalog "
"data."
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:100
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:89
msgid "Unable to find name datatype in the system catalogs."
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1117
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1028
msgid "proname"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1117
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1028
msgid "oid"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1119
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1714
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1030
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1481
msgid "typtype"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1122
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1033
msgid "proargtypes"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1732
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1499
msgid "adsrc"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1872
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1963
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1512
+msgid "attidentity"
+msgstr ""
+
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1608
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1684
msgid "rolname"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1873
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1964
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1609
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1685
msgid "relacl"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1878
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1615
msgid "attacl"
msgstr ""
-#: org/postgresql/jdbc/PgParameterMetaData.java:86
-#, fuzzy, java-format
-msgid "The parameter index is out of range: {0}, number of parameters: {1}."
+#: org/postgresql/jdbc/AbstractBlobClob.java:78
+msgid ""
+"Truncation of large objects is only implemented in 8.3 and later servers."
msgstr ""
-"El índice del arreglo esta fuera de rango: {0}, número de elementos: {1}."
-#: org/postgresql/jdbc/PgPreparedStatement.java:102
-#: org/postgresql/jdbc/PgPreparedStatement.java:128
-#: org/postgresql/jdbc/PgPreparedStatement.java:150
-#: org/postgresql/jdbc/PgPreparedStatement.java:1108
-msgid ""
-"Can''t use query methods that take a query string on a PreparedStatement."
+#: org/postgresql/jdbc/AbstractBlobClob.java:83
+msgid "Cannot truncate LOB to a negative length."
msgstr ""
-#: org/postgresql/jdbc/PgPreparedStatement.java:119
-#: org/postgresql/jdbc/PgStatement.java:286
-msgid "Multiple ResultSets were returned by the query."
+#: org/postgresql/jdbc/AbstractBlobClob.java:90
+#: org/postgresql/jdbc/AbstractBlobClob.java:234
+#, java-format
+msgid "PostgreSQL LOBs can only index to: {0}"
+msgstr ""
+
+#: org/postgresql/jdbc/AbstractBlobClob.java:230
+msgid "LOB positioning offsets start at 1."
+msgstr ""
+
+#: org/postgresql/jdbc/AbstractBlobClob.java:246
+msgid "free() was called on this LOB previously"
+msgstr ""
+
+#: org/postgresql/jdbc/PgPreparedStatement.java:106
+#: org/postgresql/jdbc/PgPreparedStatement.java:127
+#: org/postgresql/jdbc/PgPreparedStatement.java:139
+#: org/postgresql/jdbc/PgPreparedStatement.java:1035
+msgid ""
+"Can''t use query methods that take a query string on a PreparedStatement."
msgstr ""
-#: org/postgresql/jdbc/PgPreparedStatement.java:270
+#: org/postgresql/jdbc/PgPreparedStatement.java:249
msgid "Unknown Types value."
msgstr ""
-#: org/postgresql/jdbc/PgPreparedStatement.java:417
-#: org/postgresql/jdbc/PgPreparedStatement.java:486
-#: org/postgresql/jdbc/PgPreparedStatement.java:1251
-#: org/postgresql/jdbc/PgPreparedStatement.java:1583
+#: org/postgresql/jdbc/PgPreparedStatement.java:382
+#: org/postgresql/jdbc/PgPreparedStatement.java:439
+#: org/postgresql/jdbc/PgPreparedStatement.java:1191
+#: org/postgresql/jdbc/PgPreparedStatement.java:1490
#, java-format
msgid "Invalid stream length {0}."
msgstr ""
-#: org/postgresql/jdbc/PgPreparedStatement.java:447
+#: org/postgresql/jdbc/PgPreparedStatement.java:411
#, java-format
msgid "The JVM claims not to support the {0} encoding."
msgstr ""
-#: org/postgresql/jdbc/PgPreparedStatement.java:450
-#: org/postgresql/jdbc/PgPreparedStatement.java:519
-#: org/postgresql/jdbc/PgResultSet.java:1075
-#: org/postgresql/jdbc/PgResultSet.java:1109
+#: org/postgresql/jdbc/PgPreparedStatement.java:414
+#: org/postgresql/jdbc/PgResultSet.java:1122
+#: org/postgresql/jdbc/PgResultSet.java:1156
msgid "Provided InputStream failed."
msgstr ""
-#: org/postgresql/jdbc/PgPreparedStatement.java:536
-#: org/postgresql/jdbc/PgPreparedStatement.java:1170
+#: org/postgresql/jdbc/PgPreparedStatement.java:460
+#: org/postgresql/jdbc/PgPreparedStatement.java:1096
#, java-format
msgid "Unknown type {0}."
msgstr ""
-#: org/postgresql/jdbc/PgPreparedStatement.java:553
+#: org/postgresql/jdbc/PgPreparedStatement.java:477
msgid "No hstore extension installed."
msgstr ""
-#: org/postgresql/jdbc/PgPreparedStatement.java:683
-#: org/postgresql/jdbc/PgPreparedStatement.java:705
-#: org/postgresql/jdbc/PgPreparedStatement.java:715
-#: org/postgresql/jdbc/PgPreparedStatement.java:725
+#: org/postgresql/jdbc/PgPreparedStatement.java:619
+#: org/postgresql/jdbc/PgPreparedStatement.java:642
+#: org/postgresql/jdbc/PgPreparedStatement.java:652
+#: org/postgresql/jdbc/PgPreparedStatement.java:664
#, java-format
msgid "Cannot cast an instance of {0} to type {1}"
msgstr ""
-#: org/postgresql/jdbc/PgPreparedStatement.java:741
+#: org/postgresql/jdbc/PgPreparedStatement.java:682
#, java-format
msgid "Unsupported Types value: {0}"
msgstr ""
-#: org/postgresql/jdbc/PgPreparedStatement.java:970
+#: org/postgresql/jdbc/PgPreparedStatement.java:894
#, java-format
msgid "Cannot convert an instance of {0} to type {1}"
msgstr ""
-#: org/postgresql/jdbc/PgPreparedStatement.java:1040
+#: org/postgresql/jdbc/PgPreparedStatement.java:968
#, java-format
msgid ""
"Can''t infer the SQL type to use for an instance of {0}. Use setObject() "
"with an explicit Types value to specify the type to use."
msgstr ""
-#: org/postgresql/jdbc/PgPreparedStatement.java:1207
-#: org/postgresql/jdbc/PgPreparedStatement.java:1303
-#: org/postgresql/jdbc/PgPreparedStatement.java:1340
+#: org/postgresql/jdbc/PgPreparedStatement.java:1133
+#: org/postgresql/jdbc/PgPreparedStatement.java:1233
msgid "Unexpected error writing large object to database."
msgstr ""
-#: org/postgresql/jdbc/PgPreparedStatement.java:1278
-#: org/postgresql/jdbc/PgResultSet.java:1163
+#: org/postgresql/jdbc/PgPreparedStatement.java:1178
+#: org/postgresql/jdbc/PgResultSet.java:1210
msgid "Provided Reader failed."
msgstr ""
-#: org/postgresql/jdbc/PgPreparedStatement.java:1542
-#: org/postgresql/util/StreamWrapper.java:59
-msgid "Object is too large to send over the protocol."
+#: org/postgresql/jdbc/BooleanTypeUtil.java:99
+#, java-format
+msgid "Cannot cast to boolean: \"{0}\""
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:285
+#: org/postgresql/jdbc/PgResultSet.java:280
msgid ""
"Operation requires a scrollable ResultSet, but this ResultSet is "
"FORWARD_ONLY."
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:456
-msgid "Unexpected error while decoding character data from a large object."
-msgstr ""
-
-#: org/postgresql/jdbc/PgResultSet.java:507
-#: org/postgresql/jdbc/PgResultSet.java:537
-#: org/postgresql/jdbc/PgResultSet.java:570
-#: org/postgresql/jdbc/PgResultSet.java:2964
+#: org/postgresql/jdbc/PgResultSet.java:492
+#: org/postgresql/jdbc/PgResultSet.java:532
+#: org/postgresql/jdbc/PgResultSet.java:556
+#: org/postgresql/jdbc/PgResultSet.java:594
+#: org/postgresql/jdbc/PgResultSet.java:624
#: org/postgresql/jdbc/PgResultSet.java:3008
+#: org/postgresql/jdbc/PgResultSet.java:3052
#, java-format
msgid "Cannot convert the column of type {0} to requested type {1}."
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:789
-#: org/postgresql/jdbc/PgResultSet.java:810
-#: org/postgresql/jdbc/PgResultSet.java:1797
+#: org/postgresql/jdbc/PgResultSet.java:838
+#: org/postgresql/jdbc/PgResultSet.java:859
+#: org/postgresql/jdbc/PgResultSet.java:1832
msgid "Can''t use relative move methods while on the insert row."
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:829
-#: org/postgresql/jdbc/PgStatement.java:1045
-#, java-format
-msgid "Invalid fetch direction constant: {0}."
-msgstr ""
-
-#: org/postgresql/jdbc/PgResultSet.java:840
+#: org/postgresql/jdbc/PgResultSet.java:889
msgid "Cannot call cancelRowUpdates() when on the insert row."
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:856
+#: org/postgresql/jdbc/PgResultSet.java:905
msgid "Cannot call deleteRow() when on the insert row."
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:863
+#: org/postgresql/jdbc/PgResultSet.java:912
msgid ""
"Currently positioned before the start of the ResultSet. You cannot call "
"deleteRow() here."
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:869
+#: org/postgresql/jdbc/PgResultSet.java:918
msgid ""
"Currently positioned after the end of the ResultSet. You cannot call "
"deleteRow() here."
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:873
+#: org/postgresql/jdbc/PgResultSet.java:922
msgid "There are no rows in this ResultSet."
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:914
+#: org/postgresql/jdbc/PgResultSet.java:963
msgid "Not on the insert row."
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:916
+#: org/postgresql/jdbc/PgResultSet.java:965
msgid "You must specify at least one column value to insert a row."
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:1072
-#: org/postgresql/jdbc/PgResultSet.java:1706
-#: org/postgresql/jdbc/PgResultSet.java:2377
-#: org/postgresql/jdbc/PgResultSet.java:2402
+#: org/postgresql/jdbc/PgResultSet.java:1119
+#: org/postgresql/jdbc/PgResultSet.java:1754
+#: org/postgresql/jdbc/PgResultSet.java:2416
+#: org/postgresql/jdbc/PgResultSet.java:2437
#, java-format
msgid "The JVM claims not to support the encoding: {0}"
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:1214
+#: org/postgresql/jdbc/PgResultSet.java:1261
msgid "Can''t refresh the insert row."
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:1280
+#: org/postgresql/jdbc/PgResultSet.java:1328
msgid "Cannot call updateRow() when on the insert row."
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:1287
-#: org/postgresql/jdbc/PgResultSet.java:3025
+#: org/postgresql/jdbc/PgResultSet.java:1335
+#: org/postgresql/jdbc/PgResultSet.java:3069
msgid ""
"Cannot update the ResultSet because it is either before the start or after "
"the end of the results."
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:1486
+#: org/postgresql/jdbc/PgResultSet.java:1535
msgid "ResultSets with concurrency CONCUR_READ_ONLY cannot be updated."
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:1555
+#: org/postgresql/jdbc/PgResultSet.java:1603
#, java-format
msgid "No primary key found for table {0}."
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:1941
-#: org/postgresql/jdbc/PgResultSet.java:1946
-#: org/postgresql/jdbc/PgResultSet.java:1986
-#: org/postgresql/jdbc/PgResultSet.java:1992
-#: org/postgresql/jdbc/PgResultSet.java:2790
-#: org/postgresql/jdbc/PgResultSet.java:2796
-#: org/postgresql/jdbc/PgResultSet.java:2820
-#: org/postgresql/jdbc/PgResultSet.java:2825
-#: org/postgresql/jdbc/PgResultSet.java:2841
-#: org/postgresql/jdbc/PgResultSet.java:2862
-#: org/postgresql/jdbc/PgResultSet.java:2873
-#: org/postgresql/jdbc/PgResultSet.java:2886
-#: org/postgresql/jdbc/PgResultSet.java:3013
+#: org/postgresql/jdbc/PgResultSet.java:2011
+#: org/postgresql/jdbc/PgResultSet.java:2016
+#: org/postgresql/jdbc/PgResultSet.java:2803
+#: org/postgresql/jdbc/PgResultSet.java:2809
+#: org/postgresql/jdbc/PgResultSet.java:2834
+#: org/postgresql/jdbc/PgResultSet.java:2840
+#: org/postgresql/jdbc/PgResultSet.java:2864
+#: org/postgresql/jdbc/PgResultSet.java:2869
+#: org/postgresql/jdbc/PgResultSet.java:2885
+#: org/postgresql/jdbc/PgResultSet.java:2906
+#: org/postgresql/jdbc/PgResultSet.java:2917
+#: org/postgresql/jdbc/PgResultSet.java:2930
+#: org/postgresql/jdbc/PgResultSet.java:3057
#, java-format
msgid "Bad value for type {0} : {1}"
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:2564
+#: org/postgresql/jdbc/PgResultSet.java:2589
#, java-format
msgid "The column name {0} was not found in this ResultSet."
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:2689
+#: org/postgresql/jdbc/PgResultSet.java:2725
msgid ""
"ResultSet is not updateable. The query that generated this result set must "
"select only one table, and must select all primary keys from that table. See "
"the JDBC 2.1 API Specification, section 5.6 for more details."
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:2701
+#: org/postgresql/jdbc/PgResultSet.java:2737
msgid "This ResultSet is closed."
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:2732
+#: org/postgresql/jdbc/PgResultSet.java:2768
msgid "ResultSet not positioned properly, perhaps you need to call next."
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:3045
+#: org/postgresql/jdbc/PgResultSet.java:3089
msgid "Invalid UUID data."
msgstr ""
-#: org/postgresql/jdbc/PgSQLXML.java:150
-msgid "Unable to decode xml data."
-msgstr ""
-
-#: org/postgresql/jdbc/PgSQLXML.java:153
+#: org/postgresql/jdbc/PgResultSet.java:3178
+#: org/postgresql/jdbc/PgResultSet.java:3185
+#: org/postgresql/jdbc/PgResultSet.java:3196
+#: org/postgresql/jdbc/PgResultSet.java:3207
+#: org/postgresql/jdbc/PgResultSet.java:3218
+#: org/postgresql/jdbc/PgResultSet.java:3229
+#: org/postgresql/jdbc/PgResultSet.java:3240
+#: org/postgresql/jdbc/PgResultSet.java:3251
+#: org/postgresql/jdbc/PgResultSet.java:3262
+#: org/postgresql/jdbc/PgResultSet.java:3269
+#: org/postgresql/jdbc/PgResultSet.java:3276
+#: org/postgresql/jdbc/PgResultSet.java:3287
+#: org/postgresql/jdbc/PgResultSet.java:3304
+#: org/postgresql/jdbc/PgResultSet.java:3311
+#: org/postgresql/jdbc/PgResultSet.java:3318
+#: org/postgresql/jdbc/PgResultSet.java:3329
+#: org/postgresql/jdbc/PgResultSet.java:3336
+#: org/postgresql/jdbc/PgResultSet.java:3343
+#: org/postgresql/jdbc/PgResultSet.java:3381
+#: org/postgresql/jdbc/PgResultSet.java:3388
+#: org/postgresql/jdbc/PgResultSet.java:3395
+#: org/postgresql/jdbc/PgResultSet.java:3415
+#: org/postgresql/jdbc/PgResultSet.java:3428
+#, java-format
+msgid "conversion to {0} from {1} not supported"
+msgstr ""
+
+#: org/postgresql/jdbc/TimestampUtils.java:355
+#: org/postgresql/jdbc/TimestampUtils.java:423
#, java-format
-msgid "Unknown XML Source class: {0}"
-msgstr ""
-
-#: org/postgresql/jdbc/PgSQLXML.java:196
-#, fuzzy
-msgid "Unable to create SAXResult for SQLXML."
-msgstr "Fallo al crear objeto: {0}."
-
-#: org/postgresql/jdbc/PgSQLXML.java:211
-msgid "Unable to create StAXResult for SQLXML"
+msgid "Bad value for type timestamp/date/time: {1}"
msgstr ""
-#: org/postgresql/jdbc/PgSQLXML.java:216
+#: org/postgresql/jdbc/TimestampUtils.java:858
+#: org/postgresql/jdbc/TimestampUtils.java:915
+#: org/postgresql/jdbc/TimestampUtils.java:961
+#: org/postgresql/jdbc/TimestampUtils.java:1010
#, java-format
-msgid "Unknown XML Result class: {0}"
+msgid "Unsupported binary encoding of {0}."
msgstr ""
-#: org/postgresql/jdbc/PgSQLXML.java:228
-msgid "This SQLXML object has already been freed."
+#: org/postgresql/jdbc/PgCallableStatement.java:86
+#: org/postgresql/jdbc/PgCallableStatement.java:96
+msgid "A CallableStatement was executed with nothing returned."
msgstr ""
-#: org/postgresql/jdbc/PgSQLXML.java:237
-msgid ""
-"This SQLXML object has not been initialized, so you cannot retrieve data "
-"from it."
+#: org/postgresql/jdbc/PgCallableStatement.java:107
+msgid "A CallableStatement was executed with an invalid number of parameters"
msgstr ""
-#: org/postgresql/jdbc/PgSQLXML.java:250
+#: org/postgresql/jdbc/PgCallableStatement.java:145
#, java-format
-msgid "Failed to convert binary xml data to encoding: {0}."
-msgstr ""
-
-#: org/postgresql/jdbc/PgSQLXML.java:276
-msgid "Unable to convert DOMResult SQLXML data to a string."
-msgstr ""
-
-#: org/postgresql/jdbc/PgSQLXML.java:290
msgid ""
-"This SQLXML object has already been initialized, so you cannot manipulate it "
-"further."
-msgstr ""
-
-#: org/postgresql/jdbc/PgStatement.java:325
-msgid "Can''t use executeWithFlags(int) on a Statement."
-msgstr ""
-
-#: org/postgresql/jdbc/PgStatement.java:484
-msgid "Maximum number of rows must be a value grater than or equal to 0."
-msgstr ""
-
-#: org/postgresql/jdbc/PgStatement.java:525
-msgid "Query timeout must be a value greater than or equals to 0."
-msgstr ""
-
-#: org/postgresql/jdbc/PgStatement.java:561
-msgid "The maximum field size must be a value greater than or equal to 0."
-msgstr ""
-
-#: org/postgresql/jdbc/PgStatement.java:871
-msgid "This statement has been closed."
+"A CallableStatement function was executed and the out parameter {0} was of "
+"type {1} however type {2} was registered."
msgstr ""
-#: org/postgresql/jdbc/PgStatement.java:1148
+#: org/postgresql/jdbc/PgCallableStatement.java:202
msgid ""
-"Returning autogenerated keys is only supported for 8.2 and later servers."
-msgstr ""
-
-#: org/postgresql/jdbc/PgStatement.java:1326
-#: org/postgresql/jdbc/PgStatement.java:1357
-msgid "Returning autogenerated keys by column index is not supported."
-msgstr ""
-
-#: org/postgresql/jdbc/PSQLSavepoint.java:40
-#: org/postgresql/jdbc/PSQLSavepoint.java:54
-#: org/postgresql/jdbc/PSQLSavepoint.java:72
-msgid "Cannot reference a savepoint after it has been released."
-msgstr ""
-
-#: org/postgresql/jdbc/PSQLSavepoint.java:45
-msgid "Cannot retrieve the id of a named savepoint."
+"This statement does not declare an OUT parameter. Use '{' ?= call ... '}' "
+"to declare one."
msgstr ""
-#: org/postgresql/jdbc/PSQLSavepoint.java:59
-msgid "Cannot retrieve the name of an unnamed savepoint."
+#: org/postgresql/jdbc/PgCallableStatement.java:246
+msgid "wasNull cannot be call before fetching a result."
msgstr ""
-#: org/postgresql/jdbc/TimestampUtils.java:298
+#: org/postgresql/jdbc/PgCallableStatement.java:384
+#: org/postgresql/jdbc/PgCallableStatement.java:403
#, java-format
-msgid "Bad value for type timestamp/date/time: {1}"
-msgstr ""
-
-#: org/postgresql/jdbc/TimestampUtils.java:359
msgid ""
-"Infinite value found for timestamp/date. This cannot be represented as time."
-msgstr ""
-
-#: org/postgresql/jdbc/TimestampUtils.java:674
-#: org/postgresql/jdbc/TimestampUtils.java:710
-#: org/postgresql/jdbc/TimestampUtils.java:757
-#, java-format
-msgid "Unsupported binary encoding of {0}."
-msgstr ""
-
-#: org/postgresql/largeobject/LargeObjectManager.java:147
-msgid "Failed to initialize LargeObject API"
-msgstr ""
-
-#: org/postgresql/largeobject/LargeObjectManager.java:265
-#: org/postgresql/largeobject/LargeObjectManager.java:308
-msgid "Large Objects may not be used in auto-commit mode."
+"Parameter of type {0} was registered, but call to get{1} (sqltype={2}) was "
+"made."
msgstr ""
-#: org/postgresql/osgi/PGDataSourceFactory.java:85
-#, java-format
-msgid "Unsupported properties: {0}"
+#: org/postgresql/jdbc/PgCallableStatement.java:424
+msgid ""
+"A CallableStatement was declared, but no call to registerOutParameter(1, "
+"<some type>) was made."
msgstr ""
-#: org/postgresql/PGProperty.java:450 org/postgresql/PGProperty.java:470
-#, java-format
-msgid "{0} parameter value must be an integer but was: {1}"
+#: org/postgresql/jdbc/PgCallableStatement.java:430
+msgid "No function outputs were registered."
msgstr ""
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:125
+#: org/postgresql/jdbc/PgCallableStatement.java:436
msgid ""
-"Could not find a java cryptographic algorithm: X.509 CertificateFactory not "
-"available."
-msgstr ""
-
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:135
-#, java-format
-msgid "Could not open SSL certificate file {0}."
+"Results cannot be retrieved from a CallableStatement before it is executed."
msgstr ""
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:140
+#: org/postgresql/jdbc/PgCallableStatement.java:703
#, java-format
-msgid "Loading the SSL certificate {0} into a KeyManager failed."
-msgstr ""
-
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:195
-msgid "Enter SSL password: "
-msgstr ""
-
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:202
-msgid "Could not read password for SSL key file, console is not available."
+msgid "Unsupported type conversion to {1}."
msgstr ""
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:207
+#: org/postgresql/jdbc/EscapedFunctions.java:240
#, java-format
-msgid "Could not read password for SSL key file by callbackhandler {0}."
+msgid "{0} function takes four and only four argument."
msgstr ""
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:226
+#: org/postgresql/jdbc/EscapedFunctions.java:270
+#: org/postgresql/jdbc/EscapedFunctions.java:344
+#: org/postgresql/jdbc/EscapedFunctions.java:749
+#: org/postgresql/jdbc/EscapedFunctions.java:787
#, java-format
-msgid "Could not decrypt SSL key file {0}."
+msgid "{0} function takes two and only two arguments."
msgstr ""
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:240
+#: org/postgresql/jdbc/EscapedFunctions.java:288
+#: org/postgresql/jdbc/EscapedFunctions.java:326
+#: org/postgresql/jdbc/EscapedFunctions.java:446
+#: org/postgresql/jdbc/EscapedFunctions.java:461
+#: org/postgresql/jdbc/EscapedFunctions.java:476
+#: org/postgresql/jdbc/EscapedFunctions.java:491
+#: org/postgresql/jdbc/EscapedFunctions.java:506
+#: org/postgresql/jdbc/EscapedFunctions.java:521
+#: org/postgresql/jdbc/EscapedFunctions.java:536
+#: org/postgresql/jdbc/EscapedFunctions.java:551
+#: org/postgresql/jdbc/EscapedFunctions.java:566
+#: org/postgresql/jdbc/EscapedFunctions.java:581
+#: org/postgresql/jdbc/EscapedFunctions.java:596
+#: org/postgresql/jdbc/EscapedFunctions.java:611
+#: org/postgresql/jdbc/EscapedFunctions.java:775
#, java-format
-msgid "Could not read SSL key file {0}."
+msgid "{0} function takes one and only one argument."
msgstr ""
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:243
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:162
+#: org/postgresql/jdbc/EscapedFunctions.java:310
+#: org/postgresql/jdbc/EscapedFunctions.java:391
#, java-format
-msgid "Could not find a java cryptographic algorithm: {0}."
+msgid "{0} function takes two or three arguments."
msgstr ""
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:90
+#: org/postgresql/jdbc/EscapedFunctions.java:416
+#: org/postgresql/jdbc/EscapedFunctions.java:431
+#: org/postgresql/jdbc/EscapedFunctions.java:734
+#: org/postgresql/jdbc/EscapedFunctions.java:764
#, java-format
-msgid "The password callback class provided {0} could not be instantiated."
+msgid "{0} function doesn''t take any argument."
msgstr ""
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:123
+#: org/postgresql/jdbc/EscapedFunctions.java:627
+#: org/postgresql/jdbc/EscapedFunctions.java:680
#, java-format
-msgid "Could not open SSL root certificate file {0}."
+msgid "{0} function takes three and only three arguments."
msgstr ""
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:139
-#, java-format
-msgid "Could not read SSL root certificate file {0}."
-msgstr ""
+#: org/postgresql/jdbc/EscapedFunctions.java:640
+#: org/postgresql/jdbc/EscapedFunctions.java:661
+#: org/postgresql/jdbc/EscapedFunctions.java:664
+#: org/postgresql/jdbc/EscapedFunctions.java:697
+#: org/postgresql/jdbc/EscapedFunctions.java:710
+#: org/postgresql/jdbc/EscapedFunctions.java:713
+#, fuzzy, java-format
+msgid "Interval {0} not yet implemented"
+msgstr "Este método aún no ha sido implementado."
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:143
+#: org/postgresql/PGProperty.java:535 org/postgresql/PGProperty.java:555
#, java-format
-msgid "Loading the SSL root certificate {0} into a TrustManager failed."
+msgid "{0} parameter value must be an integer but was: {1}"
msgstr ""
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:156
-msgid "Could not initialize SSL context."
+#: org/postgresql/largeobject/LargeObjectManager.java:144
+msgid "Failed to initialize LargeObject API"
msgstr ""
-#: org/postgresql/ssl/MakeSSL.java:52
-#, java-format
-msgid "The SSLSocketFactory class provided {0} could not be instantiated."
+#: org/postgresql/largeobject/LargeObjectManager.java:262
+#: org/postgresql/largeobject/LargeObjectManager.java:305
+msgid "Large Objects may not be used in auto-commit mode."
msgstr ""
-#: org/postgresql/ssl/MakeSSL.java:67
+#: org/postgresql/copy/PGCopyInputStream.java:51
#, java-format
-msgid "SSL error: {0}"
+msgid "Copying from database failed: {0}"
msgstr ""
-#: org/postgresql/ssl/MakeSSL.java:78
-#, java-format
-msgid "The HostnameVerifier class provided {0} could not be instantiated."
+#: org/postgresql/copy/PGCopyInputStream.java:67
+#: org/postgresql/copy/PGCopyOutputStream.java:94
+msgid "This copy stream is closed."
msgstr ""
-#: org/postgresql/ssl/MakeSSL.java:84
-#, java-format
-msgid "The hostname {0} could not be verified by hostnameverifier {1}."
+#: org/postgresql/copy/PGCopyInputStream.java:110
+msgid "Read from copy failed."
msgstr ""
-#: org/postgresql/ssl/MakeSSL.java:93
+#: org/postgresql/copy/CopyManager.java:53
#, java-format
-msgid "The hostname {0} could not be verified."
-msgstr ""
-
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:167
-msgid "The sslfactoryarg property may not be empty."
-msgstr ""
-
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:183
-msgid ""
-"The environment variable containing the server's SSL certificate must not be "
-"empty."
-msgstr ""
-
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:191
-msgid ""
-"The system property containing the server's SSL certificate must not be "
-"empty."
-msgstr ""
-
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:198
-msgid ""
-"The sslfactoryarg property must start with the prefix file:, classpath:, "
-"env:, sys:, or -----BEGIN CERTIFICATE-----."
-msgstr ""
-
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:210
-#, fuzzy
-msgid "An error occurred reading the certificate"
-msgstr "Ha ocorrido un error mientras se establecía la conexión SSL."
-
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:243
-msgid "No X509TrustManager found"
-msgstr ""
-
-#: org/postgresql/util/PGInterval.java:155
-msgid "Conversion of interval failed"
-msgstr ""
-
-#: org/postgresql/util/PGmoney.java:65
-msgid "Conversion of money failed."
+msgid "Requested CopyIn but got {0}"
msgstr ""
-#: org/postgresql/util/ServerErrorMessage.java:165
+#: org/postgresql/copy/CopyManager.java:64
#, java-format
-msgid "Detail: {0}"
+msgid "Requested CopyOut but got {0}"
msgstr ""
-#: org/postgresql/util/ServerErrorMessage.java:170
+#: org/postgresql/copy/CopyManager.java:75
#, java-format
-msgid "Hint: {0}"
+msgid "Requested CopyDual but got {0}"
msgstr ""
-#: org/postgresql/util/ServerErrorMessage.java:174
+#: org/postgresql/copy/PGCopyOutputStream.java:71
#, java-format
-msgid "Position: {0}"
+msgid "Cannot write to copy a byte of value {0}"
msgstr ""
-#: org/postgresql/util/ServerErrorMessage.java:178
+#: org/postgresql/fastpath/Fastpath.java:80
#, java-format
-msgid "Where: {0}"
+msgid "Fastpath call {0} - No result was returned and we expected a numeric."
msgstr ""
-#: org/postgresql/util/ServerErrorMessage.java:184
+#: org/postgresql/fastpath/Fastpath.java:157
#, java-format
-msgid "Internal Query: {0}"
+msgid "Fastpath call {0} - No result was returned and we expected an integer."
msgstr ""
-#: org/postgresql/util/ServerErrorMessage.java:188
+#: org/postgresql/fastpath/Fastpath.java:165
#, java-format
-msgid "Internal Position: {0}"
+msgid ""
+"Fastpath call {0} - No result was returned or wrong size while expecting an "
+"integer."
msgstr ""
-#: org/postgresql/util/ServerErrorMessage.java:195
-#, java-format
-msgid "Location: File: {0}, Routine: {1}, Line: {2}"
-msgstr ""
+#: org/postgresql/fastpath/Fastpath.java:182
+#, fuzzy, java-format
+msgid "Fastpath call {0} - No result was returned and we expected a long."
+msgstr "Se retornó un resultado cuando no se esperaba ninguno."
-#: org/postgresql/util/ServerErrorMessage.java:200
+#: org/postgresql/fastpath/Fastpath.java:190
#, java-format
-msgid "Server SQLState: {0}"
-msgstr "SQLState del servidor: {0}."
-
-#: org/postgresql/xa/PGXAConnection.java:148
msgid ""
-"Transaction control methods setAutoCommit(true), commit, rollback and "
-"setSavePoint not allowed while an XA transaction is active."
-msgstr ""
-
-#: org/postgresql/xa/PGXAConnection.java:196
-#: org/postgresql/xa/PGXAConnection.java:265
-msgid "Invalid flags"
+"Fastpath call {0} - No result was returned or wrong size while expecting a "
+"long."
msgstr ""
-#: org/postgresql/xa/PGXAConnection.java:200
-#: org/postgresql/xa/PGXAConnection.java:269
-#: org/postgresql/xa/PGXAConnection.java:437
-msgid "xid must not be null"
+#: org/postgresql/fastpath/Fastpath.java:302
+#, java-format
+msgid "The fastpath function {0} is unknown."
msgstr ""
-#: org/postgresql/xa/PGXAConnection.java:204
-msgid "Connection is busy with another transaction"
-msgstr ""
+#~ msgid ""
+#~ "Connection refused. Check that the hostname and port are correct and that "
+#~ "the postmaster is accepting TCP/IP connections."
+#~ msgstr ""
+#~ "Conexión rechazada. Verifique que el nombre del Host y el puerto sean "
+#~ "correctos y que postmaster este aceptando conexiones TCP/IP."
-#: org/postgresql/xa/PGXAConnection.java:213
-#: org/postgresql/xa/PGXAConnection.java:279
#, fuzzy
-msgid "suspend/resume not implemented"
-msgstr "Este método aún no ha sido implementado."
-
-#: org/postgresql/xa/PGXAConnection.java:219
-#: org/postgresql/xa/PGXAConnection.java:224
-#: org/postgresql/xa/PGXAConnection.java:228
-msgid "Transaction interleaving not implemented"
-msgstr ""
-
-#: org/postgresql/xa/PGXAConnection.java:239
-msgid "Error disabling autocommit"
-msgstr ""
-
-#: org/postgresql/xa/PGXAConnection.java:273
-msgid "tried to call end without corresponding start call"
-msgstr ""
-
-#: org/postgresql/xa/PGXAConnection.java:305
-msgid ""
-"Not implemented: Prepare must be issued using the same connection that "
-"started the transaction"
-msgstr ""
-
-#: org/postgresql/xa/PGXAConnection.java:309
-msgid "Prepare called before end"
-msgstr ""
-
-#: org/postgresql/xa/PGXAConnection.java:317
-msgid "Server versions prior to 8.1 do not support two-phase commit."
-msgstr ""
-
-#: org/postgresql/xa/PGXAConnection.java:334
-msgid "Error preparing transaction"
-msgstr ""
-
-#: org/postgresql/xa/PGXAConnection.java:349
-msgid "Invalid flag"
-msgstr ""
-
-#: org/postgresql/xa/PGXAConnection.java:384
-msgid "Error during recover"
-msgstr ""
+#~ msgid "The connection url is invalid."
+#~ msgstr "El intento de conexión falló."
-#: org/postgresql/xa/PGXAConnection.java:423
-#: org/postgresql/xa/PGXAConnection.java:426
-msgid "Error rolling back prepared transaction"
-msgstr ""
-
-#: org/postgresql/xa/PGXAConnection.java:464
-msgid ""
-"Not implemented: one-phase commit must be issued using the same connection "
-"that was used to start it"
-msgstr ""
-
-#: org/postgresql/xa/PGXAConnection.java:468
-msgid "commit called before end"
-msgstr ""
+#~ msgid "Connection rejected: {0}."
+#~ msgstr "Conexión rechazada: {0}."
-#: org/postgresql/xa/PGXAConnection.java:478
-msgid "Error during one-phase commit"
-msgstr ""
-
-#: org/postgresql/xa/PGXAConnection.java:497
-msgid ""
-"Not implemented: 2nd phase commit must be issued using an idle connection"
-msgstr ""
-
-#: org/postgresql/xa/PGXAConnection.java:513
-msgid "Error committing prepared transaction"
-msgstr ""
-
-#: org/postgresql/xa/PGXAConnection.java:529
-msgid "Heuristic commit/rollback not supported"
-msgstr ""
+#~ msgid "Backend start-up failed: {0}."
+#~ msgstr "Falló el arranque del Backend: {0}. "
#~ msgid "The class {0} does not implement org.postgresql.util.PGobject."
#~ msgstr "La clase {0} no implementa org.postgresql.util.PGobject."
diff --git a/pgjdbc/src/main/java/org/postgresql/translation/fr.po b/pgjdbc/src/main/java/org/postgresql/translation/fr.po
index 2ee9e4b..09e0c32 100644
--- a/pgjdbc/src/main/java/org/postgresql/translation/fr.po
+++ b/pgjdbc/src/main/java/org/postgresql/translation/fr.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: head-fr\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-01-07 13:37+0300\n"
+"POT-Creation-Date: 2018-03-10 23:24+0300\n"
"PO-Revision-Date: 2007-07-27 12:27+0200\n"
"Last-Translator: \n"
"Language-Team: <en at li.org>\n"
@@ -19,404 +19,392 @@ msgstr ""
"X-Generator: KBabel 1.11.4\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
-#: org/postgresql/copy/CopyManager.java:57
-#, java-format
-msgid "Requested CopyIn but got {0}"
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:164
+msgid "The sslfactoryarg property may not be empty."
msgstr ""
-#: org/postgresql/copy/CopyManager.java:69
-#, java-format
-msgid "Requested CopyOut but got {0}"
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:180
+msgid ""
+"The environment variable containing the server's SSL certificate must not be "
+"empty."
msgstr ""
-#: org/postgresql/copy/PGCopyInputStream.java:54
-#, java-format
-msgid "Copying from database failed: {0}"
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:188
+msgid ""
+"The system property containing the server's SSL certificate must not be "
+"empty."
+msgstr ""
+
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:195
+msgid ""
+"The sslfactoryarg property must start with the prefix file:, classpath:, "
+"env:, sys:, or -----BEGIN CERTIFICATE-----."
msgstr ""
-#: org/postgresql/copy/PGCopyInputStream.java:70
-#: org/postgresql/copy/PGCopyOutputStream.java:97
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:207
#, fuzzy
-msgid "This copy stream is closed."
-msgstr "Ce ResultSet est ferm�."
+msgid "An error occurred reading the certificate"
+msgstr ""
+"Une erreur s''est produite pendant l''�tablissement de la connexion SSL."
-#: org/postgresql/copy/PGCopyInputStream.java:113
-msgid "Read from copy failed."
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:240
+msgid "No X509TrustManager found"
msgstr ""
-#: org/postgresql/copy/PGCopyOutputStream.java:74
-#, java-format
-msgid "Cannot write to copy a byte of value {0}"
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:133
+msgid ""
+"Could not find a java cryptographic algorithm: X.509 CertificateFactory not "
+"available."
msgstr ""
-#: org/postgresql/core/ConnectionFactory.java:74
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:143
#, java-format
-msgid "A connection could not be made using the requested protocol {0}."
+msgid "Could not open SSL certificate file {0}."
msgstr ""
-"Aucune connexion n''a pu �tre �tablie en utilisant le protocole demand� {0}. "
-#: org/postgresql/core/Oid.java:114
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:148
#, java-format
-msgid "oid type {0} not known and not a number"
+msgid "Loading the SSL certificate {0} into a KeyManager failed."
msgstr ""
-#: org/postgresql/core/Parser.java:616
-#, java-format
-msgid "Malformed function or procedure escape syntax at offset {0}."
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:205
+msgid "Enter SSL password: "
msgstr ""
-"Syntaxe de fonction ou d''�chappement de proc�dure malform�e � l''indice {0}."
-#: org/postgresql/core/PGStream.java:497
-#, java-format
-msgid "Premature end of input stream, expected {0} bytes, but only read {1}."
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:212
+msgid "Could not read password for SSL key file, console is not available."
msgstr ""
-"Fin pr�matur�e du flux en entr�e, {0} octets attendus, mais seulement {1} "
-"lus."
-#: org/postgresql/core/PGStream.java:538
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:217
#, java-format
-msgid "Expected an EOF from server, got: {0}"
-msgstr "Attendait une fin de fichier du serveur, re�u: {0}"
-
-#: org/postgresql/core/SetupQueryRunner.java:90
-msgid "An unexpected result was returned by a query."
-msgstr "Un r�sultat inattendu a �t� retourn� par une requ�te."
+msgid "Could not read password for SSL key file by callbackhandler {0}."
+msgstr ""
-#: org/postgresql/core/UTF8Encoding.java:31
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:236
#, java-format
-msgid ""
-"Illegal UTF-8 sequence: byte {0} of {1} byte sequence is not 10xxxxxx: {2}"
+msgid "Could not decrypt SSL key file {0}."
msgstr ""
-"S�quence UTF-8 ill�gale: l''octet {0} de la s�quence d''octet {1} n''est pas "
-"10xxxxxx: {2}"
-#: org/postgresql/core/UTF8Encoding.java:69
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:250
#, java-format
-msgid "Illegal UTF-8 sequence: {0} bytes used to encode a {1} byte value: {2}"
+msgid "Could not read SSL key file {0}."
msgstr ""
-"S�quence UTF-8 ill�gale: {0} octets utilis� pour encoder une valeur � {1} "
-"octets: {2}"
-#: org/postgresql/core/UTF8Encoding.java:104
-#: org/postgresql/core/UTF8Encoding.java:131
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:253
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:176
#, java-format
-msgid "Illegal UTF-8 sequence: initial byte is {0}: {1}"
-msgstr "S�quence UTF-8 ill�gale: le premier octet est {0}: {1}"
+msgid "Could not find a java cryptographic algorithm: {0}."
+msgstr ""
-#: org/postgresql/core/UTF8Encoding.java:137
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:99
+#, fuzzy, java-format
+msgid "The password callback class provided {0} could not be instantiated."
+msgstr "La classe SSLSocketFactory fournie {0} n''a pas pu �tre instanci�e."
+
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:132
#, java-format
-msgid "Illegal UTF-8 sequence: final value is out of range: {0}"
+msgid "Could not open SSL root certificate file {0}."
msgstr ""
-"S�quence UTF-8 ill�gale: la valeur finale est en dehors des limites: {0}"
-#: org/postgresql/core/UTF8Encoding.java:153
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:147
#, java-format
-msgid "Illegal UTF-8 sequence: final value is a surrogate value: {0}"
+msgid "Could not read SSL root certificate file {0}."
msgstr ""
-"S�quence UTF-8 ill�gale: la valeur finale est une valeur de remplacement: {0}"
-#: org/postgresql/core/Utils.java:119 org/postgresql/core/Utils.java:136
-msgid "Zero bytes may not occur in string parameters."
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:151
+#, java-format
+msgid "Loading the SSL root certificate {0} into a TrustManager failed."
msgstr ""
-"Z�ro octets ne devrait pas se produire dans les param�tres de type cha�ne de "
-"caract�res."
-#: org/postgresql/core/Utils.java:146 org/postgresql/core/Utils.java:217
-msgid "No IOException expected from StringBuffer or StringBuilder"
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:170
+msgid "Could not initialize SSL context."
msgstr ""
-#: org/postgresql/core/Utils.java:206
-msgid "Zero bytes may not occur in identifiers."
-msgstr "Des octects � 0 ne devraient pas appara�tre dans les identifiants."
+#: org/postgresql/ssl/MakeSSL.java:52
+#, java-format
+msgid "The SSLSocketFactory class provided {0} could not be instantiated."
+msgstr "La classe SSLSocketFactory fournie {0} n''a pas pu �tre instanci�e."
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:72
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:87
-#, fuzzy, java-format
-msgid "Invalid sslmode value: {0}"
-msgstr "Longueur de flux invalide {0}."
+#: org/postgresql/ssl/MakeSSL.java:67
+#, java-format
+msgid "SSL error: {0}"
+msgstr ""
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:87
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:111
+#: org/postgresql/ssl/MakeSSL.java:78
#, fuzzy, java-format
-msgid "Invalid targetServerType value: {0}"
-msgstr "Longueur de flux invalide {0}."
+msgid "The HostnameVerifier class provided {0} could not be instantiated."
+msgstr "La classe SSLSocketFactory fournie {0} n''a pas pu �tre instanci�e."
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:152
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:228
+#: org/postgresql/ssl/MakeSSL.java:84
#, java-format
-msgid "Could not find a server with specified targetServerType: {0}"
+msgid "The hostname {0} could not be verified by hostnameverifier {1}."
msgstr ""
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:172
-msgid ""
-"Connection refused. Check that the hostname and port are correct and that "
-"the postmaster is accepting TCP/IP connections."
+#: org/postgresql/ssl/MakeSSL.java:93
+#, java-format
+msgid "The hostname {0} could not be verified."
msgstr ""
-"Connexion refus�e. V�rifiez que le nom de machine et le port sont corrects "
-"et que postmaster accepte les connexions TCP/IP."
-
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:181
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:262
-msgid "The connection attempt failed."
-msgstr "La tentative de connexion a �chou�."
-
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:192
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:273
-#, fuzzy
-msgid "The connection url is invalid."
-msgstr "La tentative de connexion a �chou�."
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:218
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:233
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:324
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:339
-msgid "The server does not support SSL."
-msgstr "Le serveur ne supporte pas SSL."
+#: org/postgresql/gss/GssAction.java:126
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2550
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2581
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2585
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2640
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2650
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2659
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:655
+msgid "Protocol error. Session setup failed."
+msgstr "Erreur de protocole. Ouverture de la session en �chec."
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:249
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:355
-msgid "An error occurred while setting up the SSL connection."
+#: org/postgresql/gss/GssAction.java:137 org/postgresql/gss/MakeGSS.java:66
+#: org/postgresql/gss/MakeGSS.java:74
+msgid "GSS Authentication failed"
msgstr ""
-"Une erreur s''est produite pendant l''�tablissement de la connexion SSL."
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:300
+#: org/postgresql/core/Parser.java:933
#, java-format
-msgid "Connection rejected: {0}."
-msgstr "Connexion rejet�e�: {0}."
+msgid "Malformed function or procedure escape syntax at offset {0}."
+msgstr ""
+"Syntaxe de fonction ou d''�chappement de proc�dure malform�e � l''indice {0}."
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:321
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:349
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:375
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:456
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:486
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:515
-msgid ""
-"The server requested password-based authentication, but no password was "
-"provided."
+#: org/postgresql/core/SocketFactoryFactory.java:41
+#, fuzzy, java-format
+msgid "The SocketFactory class provided {0} could not be instantiated."
+msgstr "La classe SSLSocketFactory fournie {0} n''a pas pu �tre instanci�e."
+
+#: org/postgresql/core/Utils.java:93 org/postgresql/core/Utils.java:110
+msgid "Zero bytes may not occur in string parameters."
msgstr ""
-"Le serveur a demand� une authentification par mots de passe, mais aucun mot "
-"de passe n''a �t� fourni."
+"Z�ro octets ne devrait pas se produire dans les param�tres de type cha�ne de "
+"caract�res."
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:405
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:625
-#, java-format
-msgid ""
-"The authentication type {0} is not supported. Check that you have configured "
-"the pg_hba.conf file to include the client''s IP address or subnet, and that "
-"it is using an authentication scheme supported by the driver."
+#: org/postgresql/core/Utils.java:120 org/postgresql/core/Utils.java:170
+msgid "No IOException expected from StringBuffer or StringBuilder"
msgstr ""
-"Le type d''authentification {0} n''est pas support�. V�rifiez que vous avez "
-"configur� le fichier pg_hba.conf pour inclure l''adresse IP du client ou le "
-"sous-r�seau et qu''il utilise un sch�ma d''authentification support� par le "
-"pilote."
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:412
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:455
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:632
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:688
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:744
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:754
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:763
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:774
-#: org/postgresql/gss/GssAction.java:130
-msgid "Protocol error. Session setup failed."
-msgstr "Erreur de protocole. Ouverture de la session en �chec."
+#: org/postgresql/core/Utils.java:159
+msgid "Zero bytes may not occur in identifiers."
+msgstr "Des octects � 0 ne devraient pas appara�tre dans les identifiants."
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:443
-#, java-format
-msgid "Backend start-up failed: {0}."
-msgstr "D�marrage du serveur en �chec�: {0}."
-
-#: org/postgresql/core/v2/FastpathParameterList.java:63
-#: org/postgresql/core/v2/FastpathParameterList.java:89
-#: org/postgresql/core/v2/FastpathParameterList.java:100
-#: org/postgresql/core/v2/FastpathParameterList.java:111
-#: org/postgresql/core/v2/SimpleParameterList.java:70
-#: org/postgresql/core/v2/SimpleParameterList.java:94
-#: org/postgresql/core/v2/SimpleParameterList.java:105
-#: org/postgresql/core/v2/SimpleParameterList.java:116
-#: org/postgresql/core/v2/SimpleParameterList.java:127
-#: org/postgresql/core/v3/CompositeParameterList.java:36
-#: org/postgresql/core/v3/SimpleParameterList.java:53
-#: org/postgresql/core/v3/SimpleParameterList.java:64
-#: org/postgresql/jdbc/PgResultSet.java:2715
-#: org/postgresql/jdbc/PgResultSetMetaData.java:472
+#: org/postgresql/core/UTF8Encoding.java:28
#, java-format
-msgid "The column index is out of range: {0}, number of columns: {1}."
+msgid ""
+"Illegal UTF-8 sequence: byte {0} of {1} byte sequence is not 10xxxxxx: {2}"
msgstr ""
-"L''indice de la colonne est hors limite�: {0}, nombre de colonnes�: {1}."
+"S�quence UTF-8 ill�gale: l''octet {0} de la s�quence d''octet {1} n''est pas "
+"10xxxxxx: {2}"
-#: org/postgresql/core/v2/FastpathParameterList.java:164
-#: org/postgresql/core/v2/SimpleParameterList.java:191
-#: org/postgresql/core/v3/SimpleParameterList.java:225
+#: org/postgresql/core/UTF8Encoding.java:66
#, java-format
-msgid "No value specified for parameter {0}."
-msgstr "Pas de valeur sp�cifi�e pour le param�tre {0}."
+msgid "Illegal UTF-8 sequence: {0} bytes used to encode a {1} byte value: {2}"
+msgstr ""
+"S�quence UTF-8 ill�gale: {0} octets utilis� pour encoder une valeur � {1} "
+"octets: {2}"
-#: org/postgresql/core/v2/QueryExecutorImpl.java:87
-#: org/postgresql/core/v2/QueryExecutorImpl.java:347
-#: org/postgresql/core/v3/QueryExecutorImpl.java:404
-#: org/postgresql/core/v3/QueryExecutorImpl.java:465
+#: org/postgresql/core/UTF8Encoding.java:102
+#: org/postgresql/core/UTF8Encoding.java:129
#, java-format
-msgid "Expected command status BEGIN, got {0}."
-msgstr "Attendait le statut de commande BEGIN, obtenu {0}."
+msgid "Illegal UTF-8 sequence: initial byte is {0}: {1}"
+msgstr "S�quence UTF-8 ill�gale: le premier octet est {0}: {1}"
-#: org/postgresql/core/v2/QueryExecutorImpl.java:92
-#: org/postgresql/core/v3/QueryExecutorImpl.java:470
-#: org/postgresql/jdbc/PgResultSet.java:1731
+#: org/postgresql/core/UTF8Encoding.java:135
#, java-format
-msgid "Unexpected command status: {0}."
-msgstr "Statut de commande inattendu�: {0}."
-
-#: org/postgresql/core/v2/QueryExecutorImpl.java:127
-#: org/postgresql/core/v2/QueryExecutorImpl.java:136
-#: org/postgresql/core/v2/QueryExecutorImpl.java:185
-#: org/postgresql/core/v2/QueryExecutorImpl.java:376
-#: org/postgresql/core/v3/QueryExecutorImpl.java:226
-#: org/postgresql/core/v3/QueryExecutorImpl.java:364
-#: org/postgresql/core/v3/QueryExecutorImpl.java:441
-#: org/postgresql/core/v3/QueryExecutorImpl.java:505
-#: org/postgresql/core/v3/QueryExecutorImpl.java:587
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2211
-#: org/postgresql/util/StreamWrapper.java:133
-msgid "An I/O error occurred while sending to the backend."
-msgstr "Une erreur d''entr�e/sortie a eu lieu lors d''envoi vers le serveur."
+msgid "Illegal UTF-8 sequence: final value is out of range: {0}"
+msgstr ""
+"S�quence UTF-8 ill�gale: la valeur finale est en dehors des limites: {0}"
-#: org/postgresql/core/v2/QueryExecutorImpl.java:180
-#: org/postgresql/core/v2/QueryExecutorImpl.java:235
-#: org/postgresql/core/v2/QueryExecutorImpl.java:249
-#: org/postgresql/core/v3/QueryExecutorImpl.java:582
-#: org/postgresql/core/v3/QueryExecutorImpl.java:642
+#: org/postgresql/core/UTF8Encoding.java:151
#, java-format
-msgid "Unknown Response Type {0}."
-msgstr "Type de r�ponse inconnu {0}."
+msgid "Illegal UTF-8 sequence: final value is a surrogate value: {0}"
+msgstr ""
+"S�quence UTF-8 ill�gale: la valeur finale est une valeur de remplacement: {0}"
-#: org/postgresql/core/v2/QueryExecutorImpl.java:453
-#: org/postgresql/core/v2/QueryExecutorImpl.java:503
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1962
-msgid "Ran out of memory retrieving query results."
-msgstr "Ai manqu� de m�moire en r�cup�rant les r�sultats de la requ�te."
+#: org/postgresql/core/SetupQueryRunner.java:64
+msgid "An unexpected result was returned by a query."
+msgstr "Un r�sultat inattendu a �t� retourn� par une requ�te."
-#: org/postgresql/core/v2/QueryExecutorImpl.java:640
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2328
+#: org/postgresql/core/PGStream.java:486
#, java-format
-msgid "Unable to interpret the update count in command completion tag: {0}."
-msgstr ""
-"Incapable d''interpr�ter le nombre de mise � jour dans la balise de "
-"compl�tion de commande�: {0}."
-
-#: org/postgresql/core/v2/QueryExecutorImpl.java:654
-msgid "Copy not implemented for protocol version 2"
+msgid "Premature end of input stream, expected {0} bytes, but only read {1}."
msgstr ""
+"Fin pr�matur�e du flux en entr�e, {0} octets attendus, mais seulement {1} "
+"lus."
-#: org/postgresql/core/v2/SocketFactoryFactory.java:36
-#, fuzzy, java-format
-msgid "The SocketFactory class provided {0} could not be instantiated."
-msgstr "La classe SSLSocketFactory fournie {0} n''a pas pu �tre instanci�e."
+#: org/postgresql/core/PGStream.java:528
+#, java-format
+msgid "Expected an EOF from server, got: {0}"
+msgstr "Attendait une fin de fichier du serveur, re�u: {0}"
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:253
-#, fuzzy, java-format
-msgid ""
-"Connection to {0} refused. Check that the hostname and port are correct and "
-"that the postmaster is accepting TCP/IP connections."
+#: org/postgresql/core/v3/CopyOperationImpl.java:54
+msgid "CommandComplete expected COPY but got: "
msgstr ""
-"Connexion refus�e. V�rifiez que le nom de machine et le port sont corrects "
-"et que postmaster accepte les connexions TCP/IP."
-#: org/postgresql/core/v3/CopyOperationImpl.java:57
-msgid "CommandComplete expected COPY but got: "
+#: org/postgresql/core/v3/CopyInImpl.java:47
+msgid "CopyIn copy direction can't receive data"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:83
+#: org/postgresql/core/v3/QueryExecutorImpl.java:161
msgid "Tried to obtain lock while already holding it"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:98
+#: org/postgresql/core/v3/QueryExecutorImpl.java:177
msgid "Tried to break lock on database connection"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:115
+#: org/postgresql/core/v3/QueryExecutorImpl.java:195
#, fuzzy
msgid "Interrupted while waiting to obtain lock on database connection"
msgstr "Interrompu pendant l''�tablissement de la connexion."
-#: org/postgresql/core/v3/QueryExecutorImpl.java:220
+#: org/postgresql/core/v3/QueryExecutorImpl.java:327
msgid "Unable to bind parameter values for statement."
msgstr "Incapable de lier les valeurs des param�tres pour la commande."
-#: org/postgresql/core/v3/QueryExecutorImpl.java:689
+#: org/postgresql/core/v3/QueryExecutorImpl.java:333
+#: org/postgresql/core/v3/QueryExecutorImpl.java:485
+#: org/postgresql/core/v3/QueryExecutorImpl.java:559
+#: org/postgresql/core/v3/QueryExecutorImpl.java:602
+#: org/postgresql/core/v3/QueryExecutorImpl.java:729
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2372
+#: org/postgresql/util/StreamWrapper.java:130
+msgid "An I/O error occurred while sending to the backend."
+msgstr "Une erreur d''entr�e/sortie a eu lieu lors d''envoi vers le serveur."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:534
+#: org/postgresql/core/v3/QueryExecutorImpl.java:576
+#, java-format
+msgid "Expected command status BEGIN, got {0}."
+msgstr "Attendait le statut de commande BEGIN, obtenu {0}."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:581
+#: org/postgresql/jdbc/PgResultSet.java:1778
+#, java-format
+msgid "Unexpected command status: {0}."
+msgstr "Statut de commande inattendu�: {0}."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:687
+#, fuzzy
+msgid "An error occurred while trying to get the socket timeout."
+msgstr "Une erreur d''entr�e/sortie a eu lieu lors d''envoi vers le serveur."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:722
+#: org/postgresql/core/v3/QueryExecutorImpl.java:798
+#, java-format
+msgid "Unknown Response Type {0}."
+msgstr "Type de r�ponse inconnu {0}."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:745
+#, fuzzy
+msgid "An error occurred while trying to reset the socket timeout."
+msgstr "Une erreur d''entr�e/sortie a eu lieu lors d''envoi vers le serveur."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:843
msgid "Database connection failed when starting copy"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:724
+#: org/postgresql/core/v3/QueryExecutorImpl.java:878
msgid "Tried to cancel an inactive copy operation"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:765
+#: org/postgresql/core/v3/QueryExecutorImpl.java:917
msgid "Database connection failed when canceling copy operation"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:781
+#: org/postgresql/core/v3/QueryExecutorImpl.java:933
msgid "Missing expected error response to copy cancel request"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:785
+#: org/postgresql/core/v3/QueryExecutorImpl.java:937
#, java-format
msgid "Got {0} error responses to single copy cancel request"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:800
+#: org/postgresql/core/v3/QueryExecutorImpl.java:952
msgid "Tried to end inactive copy"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:815
+#: org/postgresql/core/v3/QueryExecutorImpl.java:967
msgid "Database connection failed when ending copy"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:833
-#: org/postgresql/core/v3/QueryExecutorImpl.java:855
+#: org/postgresql/core/v3/QueryExecutorImpl.java:985
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1005
msgid "Tried to write to an inactive copy operation"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:848
-#: org/postgresql/core/v3/QueryExecutorImpl.java:863
+#: org/postgresql/core/v3/QueryExecutorImpl.java:998
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1013
msgid "Database connection failed when writing to copy"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:877
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1028
msgid "Tried to read from inactive copy"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:884
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1035
msgid "Database connection failed when reading from copy"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:956
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1101
#, java-format
msgid "Received CommandComplete ''{0}'' without an active copy operation"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:983
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1126
#, java-format
msgid "Got CopyInResponse from server during an active {0}"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:999
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1140
#, java-format
msgid "Got CopyOutResponse from server during an active {0}"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1017
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1154
+#, java-format
+msgid "Got CopyBothResponse from server during an active {0}"
+msgstr ""
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1170
msgid "Got CopyData without an active copy operation"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1021
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1174
#, fuzzy, java-format
msgid "Unexpected copydata from server for {0}"
msgstr "Attendait une fin de fichier du serveur, re�u: {0}"
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1061
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2037
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1234
+#, java-format
+msgid "Unexpected packet type during copy: {0}"
+msgstr ""
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1524
+#, java-format
+msgid ""
+"Bind message length {0} too long. This can be caused by very large or "
+"incorrect length specifications on InputStream parameters."
+msgstr ""
+"La longueur du message de liaison {0} est trop grande. Cela peut �tre caus� "
+"par des sp�cification de longueur tr�s grandes ou incorrectes pour les "
+"param�tres de type InputStream."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2145
+msgid "Ran out of memory retrieving query results."
+msgstr "Ai manqu� de m�moire en r�cup�rant les r�sultats de la requ�te."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2313
+msgid "The driver currently does not support COPY operations."
+msgstr "Le pilote ne supporte pas actuellement les op�rations COPY."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2487
+#, fuzzy, java-format
+msgid "Unable to parse the count in command completion tag: {0}."
+msgstr ""
+"Incapable d''interpr�ter le nombre de mise � jour dans la balise de "
+"compl�tion de commande�: {0}."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2603
#, fuzzy, java-format
msgid ""
"The server''s client_encoding parameter was changed to {0}. The JDBC driver "
@@ -426,8 +414,7 @@ msgstr ""
"JDBC n�cessite l''affectation de la valeur UNICODE � client_encoding pour un "
"fonctionnement correct."
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1069
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2045
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2611
#, java-format
msgid ""
"The server''s DateStyle parameter was changed to {0}. The JDBC driver "
@@ -436,8 +423,7 @@ msgstr ""
"Le param�tre DateStyle du serveur a �t� chang� pour {0}. Le pilote JDBC "
"n�cessite que DateStyle commence par ISO pour un fonctionnement correct."
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1083
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2059
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2624
#, java-format
msgid ""
"The server''s standard_conforming_strings parameter was reported as {0}. The "
@@ -446,64 +432,200 @@ msgstr ""
"Le param�tre serveur standard_conforming_strings a pour valeur {0}. Le "
"driver JDBC attend on ou off."
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1122
+#: org/postgresql/core/v3/SimpleParameterList.java:54
+#: org/postgresql/core/v3/SimpleParameterList.java:65
+#: org/postgresql/core/v3/CompositeParameterList.java:33
+#: org/postgresql/jdbc/PgResultSetMetaData.java:493
+#: org/postgresql/jdbc/PgResultSet.java:2751
#, java-format
-msgid "Unexpected packet type during copy: {0}"
+msgid "The column index is out of range: {0}, number of columns: {1}."
msgstr ""
+"L''indice de la colonne est hors limite�: {0}, nombre de colonnes�: {1}."
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1393
+#: org/postgresql/core/v3/SimpleParameterList.java:257
#, java-format
-msgid ""
-"Bind message length {0} too long. This can be caused by very large or "
-"incorrect length specifications on InputStream parameters."
+msgid "No value specified for parameter {0}."
+msgstr "Pas de valeur sp�cifi�e pour le param�tre {0}."
+
+#: org/postgresql/core/v3/SimpleParameterList.java:431
+#, fuzzy, java-format
+msgid "Added parameters index out of range: {0}, number of columns: {1}."
msgstr ""
-"La longueur du message de liaison {0} est trop grande. Cela peut �tre caus� "
-"par des sp�cification de longueur tr�s grandes ou incorrectes pour les "
-"param�tres de type InputStream."
+"L''indice du param�tre est hors limites�: {0}, nombre de param�tres�: {1}."
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2131
-msgid "The driver currently does not support COPY operations."
-msgstr "Le pilote ne supporte pas actuellement les op�rations COPY."
+#: org/postgresql/core/v3/replication/V3ReplicationProtocol.java:133
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:257
+msgid "The connection attempt failed."
+msgstr "La tentative de connexion a �chou�."
-#: org/postgresql/Driver.java:234
-msgid "Error loading default settings from driverconfig.properties"
+#: org/postgresql/core/v3/replication/V3PGReplicationStream.java:144
+#, java-format
+msgid "Unexpected packet type during replication: {0}"
msgstr ""
-"Erreur de chargement des valeurs par d�faut depuis driverconfig.properties"
-#: org/postgresql/Driver.java:247
-msgid "Properties for the driver contains a non-string value for the key "
+#: org/postgresql/core/v3/replication/V3PGReplicationStream.java:269
+#, fuzzy
+msgid "This replication stream has been closed."
+msgstr "La connexion a �t� ferm�e."
+
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:109
+#, fuzzy, java-format
+msgid "Invalid sslmode value: {0}"
+msgstr "Longueur de flux invalide {0}."
+
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:124
+#, fuzzy, java-format
+msgid "Invalid targetServerType value: {0}"
+msgstr "Longueur de flux invalide {0}."
+
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:246
+#, fuzzy, java-format
+msgid ""
+"Connection to {0} refused. Check that the hostname and port are correct and "
+"that the postmaster is accepting TCP/IP connections."
+msgstr ""
+"Connexion refus�e. V�rifiez que le nom de machine et le port sont corrects "
+"et que postmaster accepte les connexions TCP/IP."
+
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:272
+#, java-format
+msgid "Could not find a server with specified targetServerType: {0}"
+msgstr ""
+
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:366
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:379
+msgid "The server does not support SSL."
+msgstr "Le serveur ne supporte pas SSL."
+
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:393
+msgid "An error occurred while setting up the SSL connection."
msgstr ""
+"Une erreur s''est produite pendant l''�tablissement de la connexion SSL."
-#: org/postgresql/Driver.java:290
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:494
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:521
msgid ""
-"Your security policy has prevented the connection from being attempted. You "
-"probably need to grant the connect java.net.SocketPermission to the database "
-"server host and port that you wish to connect to."
+"The server requested password-based authentication, but no password was "
+"provided."
msgstr ""
+"Le serveur a demand� une authentification par mots de passe, mais aucun mot "
+"de passe n''a �t� fourni."
-#: org/postgresql/Driver.java:296 org/postgresql/Driver.java:362
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:624
msgid ""
-"Something unusual has occurred to cause the driver to fail. Please report "
-"this exception."
+"SCRAM authentication is not supported by this driver. You need JDK >= 8 and "
+"pgjdbc >= 42.2.0 (not \".jre\" vesions)"
msgstr ""
-"Quelque chose d''inhabituel a provoqu� l''�chec du pilote. Veuillez faire un "
-"rapport sur cette erreur."
-#: org/postgresql/Driver.java:370
-msgid "Connection attempt timed out."
-msgstr "La tentative de connexion a �chou� dans le d�lai imparti."
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:648
+#, java-format
+msgid ""
+"The authentication type {0} is not supported. Check that you have configured "
+"the pg_hba.conf file to include the client''s IP address or subnet, and that "
+"it is using an authentication scheme supported by the driver."
+msgstr ""
+"Le type d''authentification {0} n''est pas support�. V�rifiez que vous avez "
+"configur� le fichier pg_hba.conf pour inclure l''adresse IP du client ou le "
+"sous-r�seau et qu''il utilise un sch�ma d''authentification support� par le "
+"pilote."
-#: org/postgresql/Driver.java:383
-msgid "Interrupted while attempting to connect."
-msgstr "Interrompu pendant l''�tablissement de la connexion."
+#: org/postgresql/core/ConnectionFactory.java:57
+#, java-format
+msgid "A connection could not be made using the requested protocol {0}."
+msgstr ""
+"Aucune connexion n''a pu �tre �tablie en utilisant le protocole demand� {0}. "
-#: org/postgresql/Driver.java:645
+#: org/postgresql/core/Oid.java:116
#, java-format
-msgid "Method {0} is not yet implemented."
-msgstr "La fonction {0} n''est pas encore impl�ment�e."
+msgid "oid type {0} not known and not a number"
+msgstr ""
+
+#: org/postgresql/util/HStoreConverter.java:43
+#: org/postgresql/util/HStoreConverter.java:74
+#: org/postgresql/jdbc/PgArray.java:210
+#: org/postgresql/jdbc/PgResultSet.java:1924
+msgid ""
+"Invalid character data was found. This is most likely caused by stored data "
+"containing characters that are invalid for the character set the database "
+"was created in. The most common example of this is storing 8bit data in a "
+"SQL_ASCII database."
+msgstr ""
+"Des donn�es de caract�res invalides ont �t� trouv�es. C''est probablement "
+"caus� par le stockage de caract�res invalides pour le jeu de caract�res de "
+"cr�ation de la base. L''exemple le plus courant est le stockage de donn�es "
+"8bit dans une base SQL_ASCII."
+
+#: org/postgresql/util/PGmoney.java:62
+msgid "Conversion of money failed."
+msgstr "La conversion de money a �chou�."
+
+#: org/postgresql/util/StreamWrapper.java:56
+#: org/postgresql/jdbc/PgPreparedStatement.java:1449
+msgid "Object is too large to send over the protocol."
+msgstr ""
+
+#: org/postgresql/util/PGInterval.java:152
+msgid "Conversion of interval failed"
+msgstr "La conversion de l''intervalle a �chou�"
+
+#: org/postgresql/util/ServerErrorMessage.java:45
+#, java-format
+msgid ""
+" (pgjdbc: autodetected server-encoding to be {0}, if the message is not "
+"readable, please check database logs and/or host, port, dbname, user, "
+"password, pg_hba.conf)"
+msgstr ""
+
+#: org/postgresql/util/ServerErrorMessage.java:176
+#, java-format
+msgid "Detail: {0}"
+msgstr "D�tail�: {0}"
+
+#: org/postgresql/util/ServerErrorMessage.java:181
+#, java-format
+msgid "Hint: {0}"
+msgstr "Indice�: {0}"
+
+#: org/postgresql/util/ServerErrorMessage.java:185
+#, java-format
+msgid "Position: {0}"
+msgstr "Position�: {0}"
+
+#: org/postgresql/util/ServerErrorMessage.java:189
+#, java-format
+msgid "Where: {0}"
+msgstr "O��: {0}"
+
+#: org/postgresql/util/ServerErrorMessage.java:195
+#, java-format
+msgid "Internal Query: {0}"
+msgstr "Requ�te interne: {0}"
+
+#: org/postgresql/util/ServerErrorMessage.java:199
+#, java-format
+msgid "Internal Position: {0}"
+msgstr "Position interne�: {0}"
-#: org/postgresql/ds/common/BaseDataSource.java:1037
-#: org/postgresql/ds/common/BaseDataSource.java:1047
+#: org/postgresql/util/ServerErrorMessage.java:206
+#, java-format
+msgid "Location: File: {0}, Routine: {1}, Line: {2}"
+msgstr "Localisation�: Fichier�: {0}, Routine�: {1}, Ligne�: {2}"
+
+#: org/postgresql/util/ServerErrorMessage.java:211
+#, java-format
+msgid "Server SQLState: {0}"
+msgstr "SQLState serveur�: {0}"
+
+#: org/postgresql/ds/PGPoolingDataSource.java:269
+msgid "Failed to setup DataSource."
+msgstr ""
+
+#: org/postgresql/ds/PGPoolingDataSource.java:371
+msgid "DataSource has been closed."
+msgstr "DataSource a �t� ferm�e."
+
+#: org/postgresql/ds/common/BaseDataSource.java:1132
+#: org/postgresql/ds/common/BaseDataSource.java:1142
#, fuzzy, java-format
msgid "Unsupported property name: {0}"
msgstr "Valeur de type non support�e�: {0}"
@@ -512,7 +634,7 @@ msgstr "Valeur de type non support
msgid "This PooledConnection has already been closed."
msgstr "Cette PooledConnection a d�j� �t� ferm�e."
-#: org/postgresql/ds/PGPooledConnection.java:313
+#: org/postgresql/ds/PGPooledConnection.java:314
msgid ""
"Connection has been closed automatically because a new connection was opened "
"for the same PooledConnection or the PooledConnection has been closed."
@@ -520,411 +642,516 @@ msgstr ""
"La connexion a �t� ferm�e automatiquement car une nouvelle connexion a �t� "
"ouverte pour la m�me PooledConnection ou la PooledConnection a �t� ferm�e."
-#: org/postgresql/ds/PGPooledConnection.java:314
+#: org/postgresql/ds/PGPooledConnection.java:315
msgid "Connection has been closed."
msgstr "La connexion a �t� ferm�e."
-#: org/postgresql/ds/PGPooledConnection.java:418
+#: org/postgresql/ds/PGPooledConnection.java:420
msgid "Statement has been closed."
msgstr "Statement a �t� ferm�."
-#: org/postgresql/ds/PGPoolingDataSource.java:269
-msgid "Failed to setup DataSource."
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:68
+msgid "No SCRAM mechanism(s) advertised by the server"
msgstr ""
-#: org/postgresql/ds/PGPoolingDataSource.java:371
-msgid "DataSource has been closed."
-msgstr "DataSource a �t� ferm�e."
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:81
+msgid "Invalid or unsupported by client SCRAM mechanisms"
+msgstr ""
-#: org/postgresql/fastpath/Fastpath.java:82
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:117
#, fuzzy, java-format
-msgid "Fastpath call {0} - No result was returned and we expected a numeric."
-msgstr ""
-"Appel Fastpath {0} - Aucun r�sultat n''a �t� retourn� et nous attendions un "
-"entier."
+msgid "Invalid server-first-message: {0}"
+msgstr "Longueur de flux invalide {0}."
-#: org/postgresql/fastpath/Fastpath.java:165
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:147
+#, fuzzy, java-format
+msgid "Invalid server-final-message: {0}"
+msgstr "Longueur de flux invalide {0}."
+
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:153
#, java-format
-msgid "Fastpath call {0} - No result was returned and we expected an integer."
+msgid "SCRAM authentication failed, server returned error: {0}"
msgstr ""
-"Appel Fastpath {0} - Aucun r�sultat n''a �t� retourn� et nous attendions un "
-"entier."
-#: org/postgresql/fastpath/Fastpath.java:174
-#, fuzzy, java-format
-msgid ""
-"Fastpath call {0} - No result was returned or wrong size while expecting an "
-"integer."
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:160
+msgid "Invalid server SCRAM signature"
msgstr ""
-"Appel Fastpath {0} - Aucun r�sultat n''a �t� retourn� et nous attendions un "
-"entier."
-#: org/postgresql/fastpath/Fastpath.java:191
+#: org/postgresql/osgi/PGDataSourceFactory.java:82
#, fuzzy, java-format
-msgid "Fastpath call {0} - No result was returned and we expected a long."
+msgid "Unsupported properties: {0}"
+msgstr "Valeur de type non support�e�: {0}"
+
+#: org/postgresql/Driver.java:214
+msgid "Error loading default settings from driverconfig.properties"
msgstr ""
-"Appel Fastpath {0} - Aucun r�sultat n''a �t� retourn� et nous attendions un "
-"entier."
+"Erreur de chargement des valeurs par d�faut depuis driverconfig.properties"
-#: org/postgresql/fastpath/Fastpath.java:200
-#, fuzzy, java-format
+#: org/postgresql/Driver.java:226
+msgid "Properties for the driver contains a non-string value for the key "
+msgstr ""
+
+#: org/postgresql/Driver.java:270
msgid ""
-"Fastpath call {0} - No result was returned or wrong size while expecting a "
-"long."
+"Your security policy has prevented the connection from being attempted. You "
+"probably need to grant the connect java.net.SocketPermission to the database "
+"server host and port that you wish to connect to."
msgstr ""
-"Appel Fastpath {0} - Aucun r�sultat n''a �t� retourn� et nous attendions un "
-"entier."
-#: org/postgresql/fastpath/Fastpath.java:312
+#: org/postgresql/Driver.java:276 org/postgresql/Driver.java:408
+msgid ""
+"Something unusual has occurred to cause the driver to fail. Please report "
+"this exception."
+msgstr ""
+"Quelque chose d''inhabituel a provoqu� l''�chec du pilote. Veuillez faire un "
+"rapport sur cette erreur."
+
+#: org/postgresql/Driver.java:416
+msgid "Connection attempt timed out."
+msgstr "La tentative de connexion a �chou� dans le d�lai imparti."
+
+#: org/postgresql/Driver.java:429
+msgid "Interrupted while attempting to connect."
+msgstr "Interrompu pendant l''�tablissement de la connexion."
+
+#: org/postgresql/Driver.java:682
#, java-format
-msgid "The fastpath function {0} is unknown."
-msgstr "La fonction fastpath {0} est inconnue."
+msgid "Method {0} is not yet implemented."
+msgstr "La fonction {0} n''est pas encore impl�ment�e."
-#: org/postgresql/geometric/PGbox.java:79
-#: org/postgresql/geometric/PGcircle.java:76
-#: org/postgresql/geometric/PGcircle.java:84
-#: org/postgresql/geometric/PGline.java:109
-#: org/postgresql/geometric/PGline.java:118
-#: org/postgresql/geometric/PGlseg.java:72
-#: org/postgresql/geometric/PGpoint.java:78
+#: org/postgresql/geometric/PGlseg.java:70
+#: org/postgresql/geometric/PGline.java:107
+#: org/postgresql/geometric/PGline.java:116
+#: org/postgresql/geometric/PGcircle.java:74
+#: org/postgresql/geometric/PGcircle.java:82
+#: org/postgresql/geometric/PGpoint.java:76
+#: org/postgresql/geometric/PGbox.java:77
#, java-format
msgid "Conversion to type {0} failed: {1}."
msgstr "La conversion vers le type {0} a �chou�: {1}."
-#: org/postgresql/geometric/PGpath.java:73
+#: org/postgresql/geometric/PGpath.java:70
#, java-format
msgid "Cannot tell if path is open or closed: {0}."
msgstr "Impossible de dire si path est ferm� ou ouvert�: {0}."
-#: org/postgresql/gss/GssAction.java:141 org/postgresql/gss/MakeGSS.java:69
-#: org/postgresql/gss/MakeGSS.java:77
-msgid "GSS Authentication failed"
-msgstr ""
-
-#: org/postgresql/jdbc/AbstractBlobClob.java:89
+#: org/postgresql/xa/PGXAConnection.java:128
msgid ""
-"Truncation of large objects is only implemented in 8.3 and later servers."
-msgstr ""
-"Le troncage des large objects n''est impl�ment� que dans les serveurs 8.3 et "
-"sup�rieurs."
-
-#: org/postgresql/jdbc/AbstractBlobClob.java:94
-msgid "Cannot truncate LOB to a negative length."
+"Transaction control methods setAutoCommit(true), commit, rollback and "
+"setSavePoint not allowed while an XA transaction is active."
msgstr ""
-#: org/postgresql/jdbc/AbstractBlobClob.java:101
-#: org/postgresql/jdbc/AbstractBlobClob.java:245
-#, java-format
-msgid "PostgreSQL LOBs can only index to: {0}"
-msgstr "Les LOB PostgreSQL peuvent seulement s''indicer �: {0}"
-
-#: org/postgresql/jdbc/AbstractBlobClob.java:241
-msgid "LOB positioning offsets start at 1."
-msgstr "Les d�calages de position des LOB commencent � 1."
+#: org/postgresql/xa/PGXAConnection.java:177
+#: org/postgresql/xa/PGXAConnection.java:253
+#: org/postgresql/xa/PGXAConnection.java:347
+#, fuzzy, java-format
+msgid "Invalid flags {0}"
+msgstr "Drapeaux invalides"
-#: org/postgresql/jdbc/AbstractBlobClob.java:257
-msgid "free() was called on this LOB previously"
-msgstr "free() a �t� appel�e auparavant sur ce LOB"
+#: org/postgresql/xa/PGXAConnection.java:181
+#: org/postgresql/xa/PGXAConnection.java:257
+#: org/postgresql/xa/PGXAConnection.java:449
+msgid "xid must not be null"
+msgstr "xid ne doit pas �tre nul"
-#: org/postgresql/jdbc/BatchResultHandler.java:41
-#: org/postgresql/jdbc/PgConnection.java:474
-#: org/postgresql/jdbc/PgPreparedStatement.java:138
-#: org/postgresql/jdbc/PgStatement.java:299
-msgid "A result was returned when none was expected."
-msgstr "Un r�sultat a �t� retourn� alors qu''aucun n''�tait attendu."
+#: org/postgresql/xa/PGXAConnection.java:185
+msgid "Connection is busy with another transaction"
+msgstr "La connection est occup�e avec une autre transaction"
-#: org/postgresql/jdbc/BatchResultHandler.java:59
-msgid "Too many update results were returned."
-msgstr "Trop de r�sultats de mise � jour ont �t� retourn�s."
+#: org/postgresql/xa/PGXAConnection.java:194
+#: org/postgresql/xa/PGXAConnection.java:267
+msgid "suspend/resume not implemented"
+msgstr "suspend/resume pas impl�ment�"
-#: org/postgresql/jdbc/BatchResultHandler.java:88
+#: org/postgresql/xa/PGXAConnection.java:202
+#: org/postgresql/xa/PGXAConnection.java:209
+#: org/postgresql/xa/PGXAConnection.java:213
#, java-format
msgid ""
-"Batch entry {0} {1} was aborted. Call getNextException to see the cause."
+"Invalid protocol state requested. Attempted transaction interleaving is not "
+"supported. xid={0}, currentXid={1}, state={2}, flags={3}"
msgstr ""
-"L''�l�ment du batch {0} {1} a �t� annul�. Appeler getNextException pour en "
-"conna�tre la cause."
-#: org/postgresql/jdbc/EscapedFunctions.java:243
-#, java-format
-msgid "{0} function takes four and only four argument."
-msgstr "La fonction {0} n''accepte que quatre et seulement quatre arguments."
+#: org/postgresql/xa/PGXAConnection.java:224
+msgid "Error disabling autocommit"
+msgstr "Erreur en d�sactivant autocommit"
-#: org/postgresql/jdbc/EscapedFunctions.java:273
-#: org/postgresql/jdbc/EscapedFunctions.java:347
-#: org/postgresql/jdbc/EscapedFunctions.java:752
-#: org/postgresql/jdbc/EscapedFunctions.java:790
-#, java-format
-msgid "{0} function takes two and only two arguments."
-msgstr "La fonction {0} n''accepte que deux et seulement deux arguments."
+#: org/postgresql/xa/PGXAConnection.java:261
+#, fuzzy, java-format
+msgid ""
+"tried to call end without corresponding start call. state={0}, start "
+"xid={1}, currentXid={2}, preparedXid={3}"
+msgstr "tentative d''appel de fin sans l''appel start correspondant"
-#: org/postgresql/jdbc/EscapedFunctions.java:291
-#: org/postgresql/jdbc/EscapedFunctions.java:329
-#: org/postgresql/jdbc/EscapedFunctions.java:449
-#: org/postgresql/jdbc/EscapedFunctions.java:464
-#: org/postgresql/jdbc/EscapedFunctions.java:479
-#: org/postgresql/jdbc/EscapedFunctions.java:494
-#: org/postgresql/jdbc/EscapedFunctions.java:509
-#: org/postgresql/jdbc/EscapedFunctions.java:524
-#: org/postgresql/jdbc/EscapedFunctions.java:539
-#: org/postgresql/jdbc/EscapedFunctions.java:554
-#: org/postgresql/jdbc/EscapedFunctions.java:569
-#: org/postgresql/jdbc/EscapedFunctions.java:584
-#: org/postgresql/jdbc/EscapedFunctions.java:599
-#: org/postgresql/jdbc/EscapedFunctions.java:614
-#: org/postgresql/jdbc/EscapedFunctions.java:778
+#: org/postgresql/xa/PGXAConnection.java:297
#, java-format
-msgid "{0} function takes one and only one argument."
-msgstr "La fonction {0} n''accepte qu''un et un seul argument."
+msgid ""
+"Preparing already prepared transaction, the prepared xid {0}, prepare xid={1}"
+msgstr ""
-#: org/postgresql/jdbc/EscapedFunctions.java:313
-#: org/postgresql/jdbc/EscapedFunctions.java:394
+#: org/postgresql/xa/PGXAConnection.java:300
#, java-format
-msgid "{0} function takes two or three arguments."
-msgstr "La fonction {0} n''accepte que deux ou trois arguments."
+msgid "Current connection does not have an associated xid. prepare xid={0}"
+msgstr ""
-#: org/postgresql/jdbc/EscapedFunctions.java:419
-#: org/postgresql/jdbc/EscapedFunctions.java:434
-#: org/postgresql/jdbc/EscapedFunctions.java:737
-#: org/postgresql/jdbc/EscapedFunctions.java:767
-#, java-format
-msgid "{0} function doesn''t take any argument."
-msgstr "La fonction {0} n''accepte aucun argument."
+#: org/postgresql/xa/PGXAConnection.java:307
+#, fuzzy, java-format
+msgid ""
+"Not implemented: Prepare must be issued using the same connection that "
+"started the transaction. currentXid={0}, prepare xid={1}"
+msgstr ""
+"Pas impl�ment�: Prepare doit �tre envoy� sur la m�me connection qui a "
+"d�marr� la transaction"
-#: org/postgresql/jdbc/EscapedFunctions.java:630
-#: org/postgresql/jdbc/EscapedFunctions.java:683
-#, java-format
-msgid "{0} function takes three and only three arguments."
-msgstr "La fonction {0} n''accepte que trois et seulement trois arguments."
+#: org/postgresql/xa/PGXAConnection.java:311
+#, fuzzy, java-format
+msgid "Prepare called before end. prepare xid={0}, state={1}"
+msgstr "Pr�paration appel�e avant la fin"
-#: org/postgresql/jdbc/EscapedFunctions.java:643
-#: org/postgresql/jdbc/EscapedFunctions.java:664
-#: org/postgresql/jdbc/EscapedFunctions.java:667
-#: org/postgresql/jdbc/EscapedFunctions.java:700
-#: org/postgresql/jdbc/EscapedFunctions.java:713
-#: org/postgresql/jdbc/EscapedFunctions.java:716
-#, java-format
-msgid "Interval {0} not yet implemented"
-msgstr "L''interval {0} n''est pas encore impl�ment�"
+#: org/postgresql/xa/PGXAConnection.java:331
+#, fuzzy, java-format
+msgid "Error preparing transaction. prepare xid={0}"
+msgstr "Erreur en pr�parant la transaction"
-#: org/postgresql/jdbc/PgArray.java:166 org/postgresql/jdbc/PgArray.java:822
-#, java-format
-msgid "The array index is out of range: {0}"
-msgstr "L''indice du tableau est hors limites�: {0}"
+#: org/postgresql/xa/PGXAConnection.java:382
+msgid "Error during recover"
+msgstr "Erreur durant la restauration"
+
+#: org/postgresql/xa/PGXAConnection.java:438
+#, fuzzy, java-format
+msgid ""
+"Error rolling back prepared transaction. rollback xid={0}, preparedXid={1}, "
+"currentXid={2}"
+msgstr "Erreur en annulant une transaction pr�par�e"
-#: org/postgresql/jdbc/PgArray.java:183 org/postgresql/jdbc/PgArray.java:839
+#: org/postgresql/xa/PGXAConnection.java:471
#, java-format
-msgid "The array index is out of range: {0}, number of elements: {1}."
-msgstr "L''indice du tableau est hors limites�: {0}, nombre d''�l�ments�: {1}."
+msgid ""
+"One-phase commit called for xid {0} but connection was prepared with xid {1}"
+msgstr ""
-#: org/postgresql/jdbc/PgArray.java:215
-#: org/postgresql/jdbc/PgResultSet.java:1885
-#: org/postgresql/util/HStoreConverter.java:38
-#: org/postgresql/util/HStoreConverter.java:69
+#: org/postgresql/xa/PGXAConnection.java:479
msgid ""
-"Invalid character data was found. This is most likely caused by stored data "
-"containing characters that are invalid for the character set the database "
-"was created in. The most common example of this is storing 8bit data in a "
-"SQL_ASCII database."
+"Not implemented: one-phase commit must be issued using the same connection "
+"that was used to start it"
msgstr ""
-"Des donn�es de caract�res invalides ont �t� trouv�es. C''est probablement "
-"caus� par le stockage de caract�res invalides pour le jeu de caract�res de "
-"cr�ation de la base. L''exemple le plus courant est le stockage de donn�es "
-"8bit dans une base SQL_ASCII."
+"Pas impl�ment�: le commit � une phase doit avoir lieu en utilisant la m�me "
+"connection que celle o� il a commenc�"
-#: org/postgresql/jdbc/PgCallableStatement.java:90
-#: org/postgresql/jdbc/PgCallableStatement.java:96
-msgid "A CallableStatement was executed with nothing returned."
-msgstr "Un CallableStatement a �t� ex�cut� mais n''a rien retourn�."
+#: org/postgresql/xa/PGXAConnection.java:483
+#, java-format
+msgid "One-phase commit with unknown xid. commit xid={0}, currentXid={1}"
+msgstr ""
-#: org/postgresql/jdbc/PgCallableStatement.java:107
+#: org/postgresql/xa/PGXAConnection.java:487
+#, fuzzy, java-format
+msgid "commit called before end. commit xid={0}, state={1}"
+msgstr "Commit appel� avant la fin"
+
+#: org/postgresql/xa/PGXAConnection.java:498
+#, fuzzy, java-format
+msgid "Error during one-phase commit. commit xid={0}"
+msgstr "Erreur pendant le commit � une phase"
+
+#: org/postgresql/xa/PGXAConnection.java:517
#, fuzzy
-msgid "A CallableStatement was executed with an invalid number of parameters"
+msgid ""
+"Not implemented: 2nd phase commit must be issued using an idle connection. "
+"commit xid={0}, currentXid={1}, state={2], transactionState={3}"
msgstr ""
-"Un CallableStatement a �t� ex�cut� avec un nombre de param�tres incorrect"
+"Pas impl�ment�: le commit � deux phase doit �tre envoy� sur une connection "
+"inutilis�e"
-#: org/postgresql/jdbc/PgCallableStatement.java:139
-#, java-format
+#: org/postgresql/xa/PGXAConnection.java:550
+#, fuzzy, java-format
msgid ""
-"A CallableStatement function was executed and the out parameter {0} was of "
-"type {1} however type {2} was registered."
+"Error committing prepared transaction. commit xid={0}, preparedXid={1}, "
+"currentXid={2}"
+msgstr "Erreur en annulant une transaction pr�par�e"
+
+#: org/postgresql/xa/PGXAConnection.java:567
+#, fuzzy, java-format
+msgid "Heuristic commit/rollback not supported. forget xid={0}"
+msgstr "Heuristic commit/rollback non support�"
+
+#: org/postgresql/jdbc/PgSQLXML.java:147
+msgid "Unable to decode xml data."
msgstr ""
-"Une fonction CallableStatement a �t� ex�cut�e et le param�tre en sortie {0} "
-"�tait du type {1} alors que le type {2} �tait pr�vu."
-#: org/postgresql/jdbc/PgCallableStatement.java:195
-msgid ""
-"This statement does not declare an OUT parameter. Use '{' ?= call ... '}' "
-"to declare one."
+#: org/postgresql/jdbc/PgSQLXML.java:150
+#, java-format
+msgid "Unknown XML Source class: {0}"
msgstr ""
-"Cette requ�te ne d�clare pas de param�tre OUT. Utilisez '{' ?= call ... '}' "
-"pour en d�clarer un."
-#: org/postgresql/jdbc/PgCallableStatement.java:239
-msgid "wasNull cannot be call before fetching a result."
-msgstr "wasNull ne peut pas �tre appel� avant la r�cup�ration d''un r�sultat."
+#: org/postgresql/jdbc/PgSQLXML.java:193
+#, fuzzy
+msgid "Unable to create SAXResult for SQLXML."
+msgstr "�chec � la cr�ation de l''objet pour�: {0}."
-#: org/postgresql/jdbc/PgCallableStatement.java:377
-#: org/postgresql/jdbc/PgCallableStatement.java:396
-#, java-format
+#: org/postgresql/jdbc/PgSQLXML.java:208
+msgid "Unable to create StAXResult for SQLXML"
+msgstr ""
+
+#: org/postgresql/jdbc/PgSQLXML.java:213
+#, fuzzy, java-format
+msgid "Unknown XML Result class: {0}"
+msgstr "Param�tre holdability du ResultSet inconnu�: {0}."
+
+#: org/postgresql/jdbc/PgSQLXML.java:225
+#, fuzzy
+msgid "This SQLXML object has already been freed."
+msgstr "Cette PooledConnection a d�j� �t� ferm�e."
+
+#: org/postgresql/jdbc/PgSQLXML.java:234
msgid ""
-"Parameter of type {0} was registered, but call to get{1} (sqltype={2}) was "
-"made."
+"This SQLXML object has not been initialized, so you cannot retrieve data "
+"from it."
+msgstr ""
+
+#: org/postgresql/jdbc/PgSQLXML.java:247
+#, java-format
+msgid "Failed to convert binary xml data to encoding: {0}."
+msgstr ""
+
+#: org/postgresql/jdbc/PgSQLXML.java:273
+msgid "Unable to convert DOMResult SQLXML data to a string."
msgstr ""
-"Un param�tre de type {0} a �t� enregistr�, mais un appel � get{1} "
-"(sqltype={2}) a �t� fait."
-#: org/postgresql/jdbc/PgCallableStatement.java:417
+#: org/postgresql/jdbc/PgSQLXML.java:287
msgid ""
-"A CallableStatement was declared, but no call to registerOutParameter(1, "
-"<some type>) was made."
+"This SQLXML object has already been initialized, so you cannot manipulate it "
+"further."
msgstr ""
-"Un CallableStatement a �t� d�clar�, mais aucun appel � "
-"registerOutParameter(1, <un type>) n''a �t� fait."
-#: org/postgresql/jdbc/PgCallableStatement.java:423
-msgid "No function outputs were registered."
-msgstr "Aucune fonction outputs n''a �t� enregistr�e."
+#: org/postgresql/jdbc/PSQLSavepoint.java:37
+#: org/postgresql/jdbc/PSQLSavepoint.java:51
+#: org/postgresql/jdbc/PSQLSavepoint.java:69
+msgid "Cannot reference a savepoint after it has been released."
+msgstr "Impossible de r�f�rencer un savepoint apr�s qu''il ait �t� lib�r�."
+
+#: org/postgresql/jdbc/PSQLSavepoint.java:42
+msgid "Cannot retrieve the id of a named savepoint."
+msgstr "Impossible de retrouver l''identifiant d''un savepoint nomm�."
+
+#: org/postgresql/jdbc/PSQLSavepoint.java:56
+msgid "Cannot retrieve the name of an unnamed savepoint."
+msgstr "Impossible de retrouver le nom d''un savepoint sans nom."
+
+#: org/postgresql/jdbc/PgArray.java:157 org/postgresql/jdbc/PgArray.java:844
+#, java-format
+msgid "The array index is out of range: {0}"
+msgstr "L''indice du tableau est hors limites�: {0}"
+
+#: org/postgresql/jdbc/PgArray.java:178 org/postgresql/jdbc/PgArray.java:861
+#, java-format
+msgid "The array index is out of range: {0}, number of elements: {1}."
+msgstr "L''indice du tableau est hors limites�: {0}, nombre d''�l�ments�: {1}."
+
+#: org/postgresql/jdbc/PgParameterMetaData.java:83
+#, java-format
+msgid "The parameter index is out of range: {0}, number of parameters: {1}."
+msgstr ""
+"L''indice du param�tre est hors limites�: {0}, nombre de param�tres�: {1}."
+
+#: org/postgresql/jdbc/BatchResultHandler.java:92
+msgid "Too many update results were returned."
+msgstr "Trop de r�sultats de mise � jour ont �t� retourn�s."
-#: org/postgresql/jdbc/PgCallableStatement.java:429
+#: org/postgresql/jdbc/BatchResultHandler.java:146
+#, fuzzy, java-format
msgid ""
-"Results cannot be retrieved from a CallableStatement before it is executed."
+"Batch entry {0} {1} was aborted: {2} Call getNextException to see other "
+"errors in the batch."
msgstr ""
-"Les r�sultats ne peuvent �tre r�cup�r�s � partir d''un CallableStatement "
-"avant qu''il ne soit ex�cut�."
+"L''�l�ment du batch {0} {1} a �t� annul�. Appeler getNextException pour en "
+"conna�tre la cause."
-#: org/postgresql/jdbc/PgConnection.java:312
+#: org/postgresql/jdbc/PgConnection.java:272
#, java-format
msgid "Unsupported value for stringtype parameter: {0}"
msgstr ""
"Valeur non support�e pour les param�tre de type cha�ne de caract�res�: {0}"
-#: org/postgresql/jdbc/PgConnection.java:457
-#: org/postgresql/jdbc/PgPreparedStatement.java:115
-#: org/postgresql/jdbc/PgStatement.java:282
-#: org/postgresql/jdbc/TypeInfoCache.java:230
-#: org/postgresql/jdbc/TypeInfoCache.java:370
-#: org/postgresql/jdbc/TypeInfoCache.java:412
+#: org/postgresql/jdbc/PgConnection.java:424
+#: org/postgresql/jdbc/PgStatement.java:225
+#: org/postgresql/jdbc/TypeInfoCache.java:226
+#: org/postgresql/jdbc/TypeInfoCache.java:371
+#: org/postgresql/jdbc/TypeInfoCache.java:411
+#: org/postgresql/jdbc/TypeInfoCache.java:484
#: org/postgresql/jdbc/TypeInfoCache.java:489
-#: org/postgresql/jdbc/TypeInfoCache.java:494
-#: org/postgresql/jdbc/TypeInfoCache.java:535
-#: org/postgresql/jdbc/TypeInfoCache.java:540
+#: org/postgresql/jdbc/TypeInfoCache.java:526
+#: org/postgresql/jdbc/TypeInfoCache.java:531
+#: org/postgresql/jdbc/PgPreparedStatement.java:119
msgid "No results were returned by the query."
msgstr "Aucun r�sultat retourn� par la requ�te."
-#: org/postgresql/jdbc/PgConnection.java:578
+#: org/postgresql/jdbc/PgConnection.java:441
+#: org/postgresql/jdbc/PgStatement.java:254
+msgid "A result was returned when none was expected."
+msgstr "Un r�sultat a �t� retourn� alors qu''aucun n''�tait attendu."
+
+#: org/postgresql/jdbc/PgConnection.java:545
msgid "Custom type maps are not supported."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:620
+#: org/postgresql/jdbc/PgConnection.java:587
#, java-format
msgid "Failed to create object for: {0}."
msgstr "�chec � la cr�ation de l''objet pour�: {0}."
-#: org/postgresql/jdbc/PgConnection.java:672
+#: org/postgresql/jdbc/PgConnection.java:641
#, java-format
msgid "Unable to load the class {0} responsible for the datatype {1}"
msgstr "Incapable de charger la classe {0} responsable du type de donn�es {1}"
-#: org/postgresql/jdbc/PgConnection.java:724
+#: org/postgresql/jdbc/PgConnection.java:693
msgid ""
"Cannot change transaction read-only property in the middle of a transaction."
msgstr ""
"Impossible de changer la propri�t� read-only d''une transaction au milieu "
"d''une transaction."
-#: org/postgresql/jdbc/PgConnection.java:775
+#: org/postgresql/jdbc/PgConnection.java:756
msgid "Cannot commit when autoCommit is enabled."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:786
-#: org/postgresql/jdbc/PgConnection.java:1358
-#: org/postgresql/jdbc/PgConnection.java:1395
+#: org/postgresql/jdbc/PgConnection.java:767
+#: org/postgresql/jdbc/PgConnection.java:1384
+#: org/postgresql/jdbc/PgConnection.java:1428
#, fuzzy
msgid "This connection has been closed."
msgstr "La connexion a �t� ferm�e."
-#: org/postgresql/jdbc/PgConnection.java:796
+#: org/postgresql/jdbc/PgConnection.java:777
msgid "Cannot rollback when autoCommit is enabled."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:870
+#: org/postgresql/jdbc/PgConnection.java:827
msgid ""
"Cannot change transaction isolation level in the middle of a transaction."
msgstr ""
"Impossible de changer le niveau d''isolation des transactions au milieu "
"d''une transaction."
-#: org/postgresql/jdbc/PgConnection.java:876
+#: org/postgresql/jdbc/PgConnection.java:833
#, java-format
msgid "Transaction isolation level {0} not supported."
msgstr "Le niveau d''isolation de transaction {0} n''est pas support�."
-#: org/postgresql/jdbc/PgConnection.java:921
+#: org/postgresql/jdbc/PgConnection.java:878
msgid "Finalizing a Connection that was never closed:"
msgstr "Destruction d''une connection qui n''a jamais �t� ferm�e:"
-#: org/postgresql/jdbc/PgConnection.java:1009
+#: org/postgresql/jdbc/PgConnection.java:945
msgid "Unable to translate data into the desired encoding."
msgstr "Impossible de traduire les donn�es dans l''encodage d�sir�."
-#: org/postgresql/jdbc/PgConnection.java:1081
-#: org/postgresql/jdbc/PgResultSet.java:1782
-#: org/postgresql/jdbc/PgStatement.java:1053
+#: org/postgresql/jdbc/PgConnection.java:1008
+#: org/postgresql/jdbc/PgStatement.java:903
+#: org/postgresql/jdbc/PgResultSet.java:1817
msgid "Fetch size must be a value greater to or equal to 0."
msgstr "Fetch size doit �tre une valeur sup�rieur ou �gal � 0."
-#: org/postgresql/jdbc/PgConnection.java:1311
+#: org/postgresql/jdbc/PgConnection.java:1289
+#: org/postgresql/jdbc/PgConnection.java:1330
#, java-format
msgid "Unable to find server array type for provided name {0}."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:1327
+#: org/postgresql/jdbc/PgConnection.java:1312
+#, fuzzy, java-format
+msgid "Invalid elements {0}"
+msgstr "Longueur de flux invalide {0}."
+
+#: org/postgresql/jdbc/PgConnection.java:1348
#, fuzzy, java-format
msgid "Invalid timeout ({0}<0)."
msgstr "Longueur de flux invalide {0}."
-#: org/postgresql/jdbc/PgConnection.java:1340
+#: org/postgresql/jdbc/PgConnection.java:1372
msgid "Validating connection."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:1375
+#: org/postgresql/jdbc/PgConnection.java:1405
#, fuzzy, java-format
msgid "Failed to set ClientInfo property: {0}"
msgstr "�chec � la cr�ation de l''objet pour�: {0}."
-#: org/postgresql/jdbc/PgConnection.java:1383
+#: org/postgresql/jdbc/PgConnection.java:1415
#, fuzzy
msgid "ClientInfo property not supported."
msgstr "Le renvoi des cl�s automatiquement g�n�r�es n''est pas support�."
-#: org/postgresql/jdbc/PgConnection.java:1408
+#: org/postgresql/jdbc/PgConnection.java:1441
msgid "One ore more ClientInfo failed."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:1517
+#: org/postgresql/jdbc/PgConnection.java:1540
+#, fuzzy
+msgid "Network timeout must be a value greater than or equal to 0."
+msgstr "Query timeout doit �tre une valeur sup�rieure ou �gale � 0."
+
+#: org/postgresql/jdbc/PgConnection.java:1552
+msgid "Unable to set network timeout."
+msgstr ""
+
+#: org/postgresql/jdbc/PgConnection.java:1563
+msgid "Unable to get network timeout."
+msgstr ""
+
+#: org/postgresql/jdbc/PgConnection.java:1580
#, java-format
msgid "Unknown ResultSet holdability setting: {0}."
msgstr "Param�tre holdability du ResultSet inconnu�: {0}."
-#: org/postgresql/jdbc/PgConnection.java:1531
-#: org/postgresql/jdbc/PgConnection.java:1554
-#: org/postgresql/jdbc/PgConnection.java:1576
-#: org/postgresql/jdbc/PgConnection.java:1587
-msgid "Server versions prior to 8.0 do not support savepoints."
-msgstr ""
-"Les serveurs de version ant�rieure � 8.0 ne supportent pas les savepoints."
-
-#: org/postgresql/jdbc/PgConnection.java:1535
-#: org/postgresql/jdbc/PgConnection.java:1558
+#: org/postgresql/jdbc/PgConnection.java:1598
+#: org/postgresql/jdbc/PgConnection.java:1619
msgid "Cannot establish a savepoint in auto-commit mode."
msgstr "Impossible d''�tablir un savepoint en mode auto-commit."
-#: org/postgresql/jdbc/PgConnection.java:1635
+#: org/postgresql/jdbc/PgConnection.java:1685
msgid "Returning autogenerated keys is not supported."
msgstr "Le renvoi des cl�s automatiquement g�n�r�es n''est pas support�."
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:78
+#: org/postgresql/jdbc/PgStatement.java:235
+msgid "Multiple ResultSets were returned by the query."
+msgstr "Plusieurs ResultSets ont �t� retourn�s par la requ�te."
+
+#: org/postgresql/jdbc/PgStatement.java:316
+msgid "Can''t use executeWithFlags(int) on a Statement."
+msgstr ""
+
+#: org/postgresql/jdbc/PgStatement.java:509
+msgid "Maximum number of rows must be a value grater than or equal to 0."
+msgstr ""
+"Le nombre maximum de lignes doit �tre une valeur sup�rieure ou �gale � 0."
+
+#: org/postgresql/jdbc/PgStatement.java:550
+msgid "Query timeout must be a value greater than or equals to 0."
+msgstr "Query timeout doit �tre une valeur sup�rieure ou �gale � 0."
+
+#: org/postgresql/jdbc/PgStatement.java:590
+msgid "The maximum field size must be a value greater than or equal to 0."
+msgstr ""
+"La taille maximum des champs doit �tre une valeur sup�rieure ou �gale � 0."
+
+#: org/postgresql/jdbc/PgStatement.java:689
+msgid "This statement has been closed."
+msgstr "Ce statement a �t� ferm�."
+
+#: org/postgresql/jdbc/PgStatement.java:895
+#: org/postgresql/jdbc/PgResultSet.java:878
+#, java-format
+msgid "Invalid fetch direction constant: {0}."
+msgstr "Constante de direction pour la r�cup�ration invalide�: {0}."
+
+#: org/postgresql/jdbc/PgStatement.java:1145
+#: org/postgresql/jdbc/PgStatement.java:1173
+#, fuzzy
+msgid "Returning autogenerated keys by column index is not supported."
+msgstr "Le renvoi des cl�s automatiquement g�n�r�es n''est pas support�."
+
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:66
msgid ""
"Unable to determine a value for MaxIndexKeys due to missing system catalog "
"data."
@@ -932,120 +1159,137 @@ msgstr ""
"Incapable de d�terminer la valeur de MaxIndexKeys en raison de donn�es "
"manquante dans lecatalogue syst�me."
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:100
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:89
msgid "Unable to find name datatype in the system catalogs."
msgstr ""
"Incapable de trouver le type de donn�e name dans les catalogues syst�mes."
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1117
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1028
msgid "proname"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1117
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1028
msgid "oid"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1119
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1714
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1030
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1481
msgid "typtype"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1122
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1033
msgid "proargtypes"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1732
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1499
msgid "adsrc"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1872
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1963
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1512
+msgid "attidentity"
+msgstr ""
+
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1608
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1684
msgid "rolname"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1873
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1964
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1609
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1685
msgid "relacl"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1878
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1615
msgid "attacl"
msgstr ""
-#: org/postgresql/jdbc/PgParameterMetaData.java:86
-#, java-format
-msgid "The parameter index is out of range: {0}, number of parameters: {1}."
+#: org/postgresql/jdbc/AbstractBlobClob.java:78
+msgid ""
+"Truncation of large objects is only implemented in 8.3 and later servers."
msgstr ""
-"L''indice du param�tre est hors limites�: {0}, nombre de param�tres�: {1}."
+"Le troncage des large objects n''est impl�ment� que dans les serveurs 8.3 et "
+"sup�rieurs."
+
+#: org/postgresql/jdbc/AbstractBlobClob.java:83
+msgid "Cannot truncate LOB to a negative length."
+msgstr ""
+
+#: org/postgresql/jdbc/AbstractBlobClob.java:90
+#: org/postgresql/jdbc/AbstractBlobClob.java:234
+#, java-format
+msgid "PostgreSQL LOBs can only index to: {0}"
+msgstr "Les LOB PostgreSQL peuvent seulement s''indicer �: {0}"
+
+#: org/postgresql/jdbc/AbstractBlobClob.java:230
+msgid "LOB positioning offsets start at 1."
+msgstr "Les d�calages de position des LOB commencent � 1."
+
+#: org/postgresql/jdbc/AbstractBlobClob.java:246
+msgid "free() was called on this LOB previously"
+msgstr "free() a �t� appel�e auparavant sur ce LOB"
-#: org/postgresql/jdbc/PgPreparedStatement.java:102
-#: org/postgresql/jdbc/PgPreparedStatement.java:128
-#: org/postgresql/jdbc/PgPreparedStatement.java:150
-#: org/postgresql/jdbc/PgPreparedStatement.java:1108
+#: org/postgresql/jdbc/PgPreparedStatement.java:106
+#: org/postgresql/jdbc/PgPreparedStatement.java:127
+#: org/postgresql/jdbc/PgPreparedStatement.java:139
+#: org/postgresql/jdbc/PgPreparedStatement.java:1035
msgid ""
"Can''t use query methods that take a query string on a PreparedStatement."
msgstr ""
"Impossible d''utiliser les fonctions de requ�te qui utilisent une cha�ne de "
"caract�res sur un PreparedStatement."
-#: org/postgresql/jdbc/PgPreparedStatement.java:119
-#: org/postgresql/jdbc/PgStatement.java:286
-msgid "Multiple ResultSets were returned by the query."
-msgstr "Plusieurs ResultSets ont �t� retourn�s par la requ�te."
-
-#: org/postgresql/jdbc/PgPreparedStatement.java:270
+#: org/postgresql/jdbc/PgPreparedStatement.java:249
msgid "Unknown Types value."
msgstr "Valeur de Types inconnue."
-#: org/postgresql/jdbc/PgPreparedStatement.java:417
-#: org/postgresql/jdbc/PgPreparedStatement.java:486
-#: org/postgresql/jdbc/PgPreparedStatement.java:1251
-#: org/postgresql/jdbc/PgPreparedStatement.java:1583
+#: org/postgresql/jdbc/PgPreparedStatement.java:382
+#: org/postgresql/jdbc/PgPreparedStatement.java:439
+#: org/postgresql/jdbc/PgPreparedStatement.java:1191
+#: org/postgresql/jdbc/PgPreparedStatement.java:1490
#, java-format
msgid "Invalid stream length {0}."
msgstr "Longueur de flux invalide {0}."
-#: org/postgresql/jdbc/PgPreparedStatement.java:447
+#: org/postgresql/jdbc/PgPreparedStatement.java:411
#, java-format
msgid "The JVM claims not to support the {0} encoding."
msgstr "La JVM pr�tend ne pas supporter l''encodage {0}."
-#: org/postgresql/jdbc/PgPreparedStatement.java:450
-#: org/postgresql/jdbc/PgPreparedStatement.java:519
-#: org/postgresql/jdbc/PgResultSet.java:1075
-#: org/postgresql/jdbc/PgResultSet.java:1109
+#: org/postgresql/jdbc/PgPreparedStatement.java:414
+#: org/postgresql/jdbc/PgResultSet.java:1122
+#: org/postgresql/jdbc/PgResultSet.java:1156
msgid "Provided InputStream failed."
msgstr "L''InputStream fourni a �chou�."
-#: org/postgresql/jdbc/PgPreparedStatement.java:536
-#: org/postgresql/jdbc/PgPreparedStatement.java:1170
+#: org/postgresql/jdbc/PgPreparedStatement.java:460
+#: org/postgresql/jdbc/PgPreparedStatement.java:1096
#, java-format
msgid "Unknown type {0}."
msgstr "Type inconnu�: {0}."
-#: org/postgresql/jdbc/PgPreparedStatement.java:553
+#: org/postgresql/jdbc/PgPreparedStatement.java:477
msgid "No hstore extension installed."
msgstr ""
-#: org/postgresql/jdbc/PgPreparedStatement.java:683
-#: org/postgresql/jdbc/PgPreparedStatement.java:705
-#: org/postgresql/jdbc/PgPreparedStatement.java:715
-#: org/postgresql/jdbc/PgPreparedStatement.java:725
+#: org/postgresql/jdbc/PgPreparedStatement.java:619
+#: org/postgresql/jdbc/PgPreparedStatement.java:642
+#: org/postgresql/jdbc/PgPreparedStatement.java:652
+#: org/postgresql/jdbc/PgPreparedStatement.java:664
#, java-format
msgid "Cannot cast an instance of {0} to type {1}"
msgstr "Impossible de convertir une instance de {0} vers le type {1}"
-#: org/postgresql/jdbc/PgPreparedStatement.java:741
+#: org/postgresql/jdbc/PgPreparedStatement.java:682
#, java-format
msgid "Unsupported Types value: {0}"
msgstr "Valeur de type non support�e�: {0}"
-#: org/postgresql/jdbc/PgPreparedStatement.java:970
+#: org/postgresql/jdbc/PgPreparedStatement.java:894
#, java-format
msgid "Cannot convert an instance of {0} to type {1}"
msgstr "Impossible de convertir une instance de type {0} vers le type {1}"
-#: org/postgresql/jdbc/PgPreparedStatement.java:1040
+#: org/postgresql/jdbc/PgPreparedStatement.java:968
#, java-format
msgid ""
"Can''t infer the SQL type to use for an instance of {0}. Use setObject() "
@@ -1055,23 +1299,22 @@ msgstr ""
"Utilisez setObject() avec une valeur de type explicite pour sp�cifier le "
"type � utiliser."
-#: org/postgresql/jdbc/PgPreparedStatement.java:1207
-#: org/postgresql/jdbc/PgPreparedStatement.java:1303
-#: org/postgresql/jdbc/PgPreparedStatement.java:1340
+#: org/postgresql/jdbc/PgPreparedStatement.java:1133
+#: org/postgresql/jdbc/PgPreparedStatement.java:1233
msgid "Unexpected error writing large object to database."
msgstr "Erreur inattendue pendant l''�criture de large object dans la base."
-#: org/postgresql/jdbc/PgPreparedStatement.java:1278
-#: org/postgresql/jdbc/PgResultSet.java:1163
+#: org/postgresql/jdbc/PgPreparedStatement.java:1178
+#: org/postgresql/jdbc/PgResultSet.java:1210
msgid "Provided Reader failed."
msgstr "Le Reader fourni a �chou�."
-#: org/postgresql/jdbc/PgPreparedStatement.java:1542
-#: org/postgresql/util/StreamWrapper.java:59
-msgid "Object is too large to send over the protocol."
+#: org/postgresql/jdbc/BooleanTypeUtil.java:99
+#, java-format
+msgid "Cannot cast to boolean: \"{0}\""
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:285
+#: org/postgresql/jdbc/PgResultSet.java:280
msgid ""
"Operation requires a scrollable ResultSet, but this ResultSet is "
"FORWARD_ONLY."
@@ -1079,45 +1322,35 @@ msgstr ""
"L''op�ration n�cessite un scrollable ResultSet, mais ce ResultSet est "
"FORWARD_ONLY."
-#: org/postgresql/jdbc/PgResultSet.java:456
-msgid "Unexpected error while decoding character data from a large object."
-msgstr ""
-"Erreur inattendue pendant le d�codage des donn�es caract�res pour un large "
-"object."
-
-#: org/postgresql/jdbc/PgResultSet.java:507
-#: org/postgresql/jdbc/PgResultSet.java:537
-#: org/postgresql/jdbc/PgResultSet.java:570
-#: org/postgresql/jdbc/PgResultSet.java:2964
+#: org/postgresql/jdbc/PgResultSet.java:492
+#: org/postgresql/jdbc/PgResultSet.java:532
+#: org/postgresql/jdbc/PgResultSet.java:556
+#: org/postgresql/jdbc/PgResultSet.java:594
+#: org/postgresql/jdbc/PgResultSet.java:624
#: org/postgresql/jdbc/PgResultSet.java:3008
+#: org/postgresql/jdbc/PgResultSet.java:3052
#, fuzzy, java-format
msgid "Cannot convert the column of type {0} to requested type {1}."
msgstr "Impossible de convertir une instance de type {0} vers le type {1}"
-#: org/postgresql/jdbc/PgResultSet.java:789
-#: org/postgresql/jdbc/PgResultSet.java:810
-#: org/postgresql/jdbc/PgResultSet.java:1797
+#: org/postgresql/jdbc/PgResultSet.java:838
+#: org/postgresql/jdbc/PgResultSet.java:859
+#: org/postgresql/jdbc/PgResultSet.java:1832
msgid "Can''t use relative move methods while on the insert row."
msgstr ""
"Impossible d''utiliser les fonctions de d�placement relatif pendant "
"l''insertion d''une ligne."
-#: org/postgresql/jdbc/PgResultSet.java:829
-#: org/postgresql/jdbc/PgStatement.java:1045
-#, java-format
-msgid "Invalid fetch direction constant: {0}."
-msgstr "Constante de direction pour la r�cup�ration invalide�: {0}."
-
-#: org/postgresql/jdbc/PgResultSet.java:840
+#: org/postgresql/jdbc/PgResultSet.java:889
msgid "Cannot call cancelRowUpdates() when on the insert row."
msgstr ""
"Impossible d''appeler cancelRowUpdates() pendant l''insertion d''une ligne."
-#: org/postgresql/jdbc/PgResultSet.java:856
+#: org/postgresql/jdbc/PgResultSet.java:905
msgid "Cannot call deleteRow() when on the insert row."
msgstr "Impossible d''appeler deleteRow() pendant l''insertion d''une ligne."
-#: org/postgresql/jdbc/PgResultSet.java:863
+#: org/postgresql/jdbc/PgResultSet.java:912
msgid ""
"Currently positioned before the start of the ResultSet. You cannot call "
"deleteRow() here."
@@ -1125,7 +1358,7 @@ msgstr ""
"Actuellement positionn� avant le d�but du ResultSet. Vous ne pouvez pas "
"appeler deleteRow() ici."
-#: org/postgresql/jdbc/PgResultSet.java:869
+#: org/postgresql/jdbc/PgResultSet.java:918
msgid ""
"Currently positioned after the end of the ResultSet. You cannot call "
"deleteRow() here."
@@ -1133,38 +1366,38 @@ msgstr ""
"Actuellement positionn� apr�s la fin du ResultSet. Vous ne pouvez pas "
"appeler deleteRow() ici."
-#: org/postgresql/jdbc/PgResultSet.java:873
+#: org/postgresql/jdbc/PgResultSet.java:922
msgid "There are no rows in this ResultSet."
msgstr "Il n''y pas pas de lignes dans ce ResultSet."
-#: org/postgresql/jdbc/PgResultSet.java:914
+#: org/postgresql/jdbc/PgResultSet.java:963
msgid "Not on the insert row."
msgstr "Pas sur la ligne en insertion."
-#: org/postgresql/jdbc/PgResultSet.java:916
+#: org/postgresql/jdbc/PgResultSet.java:965
msgid "You must specify at least one column value to insert a row."
msgstr ""
"Vous devez sp�cifier au moins une valeur de colonne pour ins�rer une ligne."
-#: org/postgresql/jdbc/PgResultSet.java:1072
-#: org/postgresql/jdbc/PgResultSet.java:1706
-#: org/postgresql/jdbc/PgResultSet.java:2377
-#: org/postgresql/jdbc/PgResultSet.java:2402
+#: org/postgresql/jdbc/PgResultSet.java:1119
+#: org/postgresql/jdbc/PgResultSet.java:1754
+#: org/postgresql/jdbc/PgResultSet.java:2416
+#: org/postgresql/jdbc/PgResultSet.java:2437
#, java-format
msgid "The JVM claims not to support the encoding: {0}"
msgstr "La JVM pr�tend ne pas supporter l''encodage: {0}"
-#: org/postgresql/jdbc/PgResultSet.java:1214
+#: org/postgresql/jdbc/PgResultSet.java:1261
msgid "Can''t refresh the insert row."
msgstr "Impossible de rafra�chir la ligne ins�r�e."
-#: org/postgresql/jdbc/PgResultSet.java:1280
+#: org/postgresql/jdbc/PgResultSet.java:1328
msgid "Cannot call updateRow() when on the insert row."
msgstr ""
"Impossible d''appeler updateRow() tant que l''on est sur la ligne ins�r�e."
-#: org/postgresql/jdbc/PgResultSet.java:1287
-#: org/postgresql/jdbc/PgResultSet.java:3025
+#: org/postgresql/jdbc/PgResultSet.java:1335
+#: org/postgresql/jdbc/PgResultSet.java:3069
msgid ""
"Cannot update the ResultSet because it is either before the start or after "
"the end of the results."
@@ -1172,40 +1405,40 @@ msgstr ""
"Impossible de mettre � jour le ResultSet car c''est soit avant le d�but ou "
"apr�s la fin des r�sultats."
-#: org/postgresql/jdbc/PgResultSet.java:1486
+#: org/postgresql/jdbc/PgResultSet.java:1535
msgid "ResultSets with concurrency CONCUR_READ_ONLY cannot be updated."
msgstr ""
"Les ResultSets avec la concurrence CONCUR_READ_ONLY ne peuvent �tre mis � "
"jour."
-#: org/postgresql/jdbc/PgResultSet.java:1555
+#: org/postgresql/jdbc/PgResultSet.java:1603
#, java-format
msgid "No primary key found for table {0}."
msgstr "Pas de cl� primaire trouv�e pour la table {0}."
-#: org/postgresql/jdbc/PgResultSet.java:1941
-#: org/postgresql/jdbc/PgResultSet.java:1946
-#: org/postgresql/jdbc/PgResultSet.java:1986
-#: org/postgresql/jdbc/PgResultSet.java:1992
-#: org/postgresql/jdbc/PgResultSet.java:2790
-#: org/postgresql/jdbc/PgResultSet.java:2796
-#: org/postgresql/jdbc/PgResultSet.java:2820
-#: org/postgresql/jdbc/PgResultSet.java:2825
-#: org/postgresql/jdbc/PgResultSet.java:2841
-#: org/postgresql/jdbc/PgResultSet.java:2862
-#: org/postgresql/jdbc/PgResultSet.java:2873
-#: org/postgresql/jdbc/PgResultSet.java:2886
-#: org/postgresql/jdbc/PgResultSet.java:3013
+#: org/postgresql/jdbc/PgResultSet.java:2011
+#: org/postgresql/jdbc/PgResultSet.java:2016
+#: org/postgresql/jdbc/PgResultSet.java:2803
+#: org/postgresql/jdbc/PgResultSet.java:2809
+#: org/postgresql/jdbc/PgResultSet.java:2834
+#: org/postgresql/jdbc/PgResultSet.java:2840
+#: org/postgresql/jdbc/PgResultSet.java:2864
+#: org/postgresql/jdbc/PgResultSet.java:2869
+#: org/postgresql/jdbc/PgResultSet.java:2885
+#: org/postgresql/jdbc/PgResultSet.java:2906
+#: org/postgresql/jdbc/PgResultSet.java:2917
+#: org/postgresql/jdbc/PgResultSet.java:2930
+#: org/postgresql/jdbc/PgResultSet.java:3057
#, java-format
msgid "Bad value for type {0} : {1}"
msgstr "Mauvaise valeur pour le type {0}�: {1}"
-#: org/postgresql/jdbc/PgResultSet.java:2564
+#: org/postgresql/jdbc/PgResultSet.java:2589
#, java-format
msgid "The column name {0} was not found in this ResultSet."
msgstr "Le nom de colonne {0} n''a pas �t� trouv� dans ce ResultSet."
-#: org/postgresql/jdbc/PgResultSet.java:2689
+#: org/postgresql/jdbc/PgResultSet.java:2725
msgid ""
"ResultSet is not updateable. The query that generated this result set must "
"select only one table, and must select all primary keys from that table. See "
@@ -1216,436 +1449,331 @@ msgstr ""
"primaires de cette table. Voir la sp�cification de l''API JDBC 2.1, section "
"5.6 pour plus de d�tails."
-#: org/postgresql/jdbc/PgResultSet.java:2701
+#: org/postgresql/jdbc/PgResultSet.java:2737
msgid "This ResultSet is closed."
msgstr "Ce ResultSet est ferm�."
-#: org/postgresql/jdbc/PgResultSet.java:2732
+#: org/postgresql/jdbc/PgResultSet.java:2768
msgid "ResultSet not positioned properly, perhaps you need to call next."
msgstr ""
"Le ResultSet n''est pas positionn� correctement, vous devez peut-�tre "
"appeler next()."
-#: org/postgresql/jdbc/PgResultSet.java:3045
+#: org/postgresql/jdbc/PgResultSet.java:3089
#, fuzzy
msgid "Invalid UUID data."
msgstr "Drapeau invalide"
-#: org/postgresql/jdbc/PgSQLXML.java:150
-msgid "Unable to decode xml data."
-msgstr ""
-
-#: org/postgresql/jdbc/PgSQLXML.java:153
-#, java-format
-msgid "Unknown XML Source class: {0}"
-msgstr ""
-
-#: org/postgresql/jdbc/PgSQLXML.java:196
-#, fuzzy
-msgid "Unable to create SAXResult for SQLXML."
-msgstr "�chec � la cr�ation de l''objet pour�: {0}."
+#: org/postgresql/jdbc/PgResultSet.java:3178
+#: org/postgresql/jdbc/PgResultSet.java:3185
+#: org/postgresql/jdbc/PgResultSet.java:3196
+#: org/postgresql/jdbc/PgResultSet.java:3207
+#: org/postgresql/jdbc/PgResultSet.java:3218
+#: org/postgresql/jdbc/PgResultSet.java:3229
+#: org/postgresql/jdbc/PgResultSet.java:3240
+#: org/postgresql/jdbc/PgResultSet.java:3251
+#: org/postgresql/jdbc/PgResultSet.java:3262
+#: org/postgresql/jdbc/PgResultSet.java:3269
+#: org/postgresql/jdbc/PgResultSet.java:3276
+#: org/postgresql/jdbc/PgResultSet.java:3287
+#: org/postgresql/jdbc/PgResultSet.java:3304
+#: org/postgresql/jdbc/PgResultSet.java:3311
+#: org/postgresql/jdbc/PgResultSet.java:3318
+#: org/postgresql/jdbc/PgResultSet.java:3329
+#: org/postgresql/jdbc/PgResultSet.java:3336
+#: org/postgresql/jdbc/PgResultSet.java:3343
+#: org/postgresql/jdbc/PgResultSet.java:3381
+#: org/postgresql/jdbc/PgResultSet.java:3388
+#: org/postgresql/jdbc/PgResultSet.java:3395
+#: org/postgresql/jdbc/PgResultSet.java:3415
+#: org/postgresql/jdbc/PgResultSet.java:3428
+#, fuzzy, java-format
+msgid "conversion to {0} from {1} not supported"
+msgstr "Le niveau d''isolation de transaction {0} n''est pas support�."
-#: org/postgresql/jdbc/PgSQLXML.java:211
-msgid "Unable to create StAXResult for SQLXML"
-msgstr ""
+#: org/postgresql/jdbc/TimestampUtils.java:355
+#: org/postgresql/jdbc/TimestampUtils.java:423
+#, fuzzy, java-format
+msgid "Bad value for type timestamp/date/time: {1}"
+msgstr "Mauvaise valeur pour le type {0}�: {1}"
-#: org/postgresql/jdbc/PgSQLXML.java:216
+#: org/postgresql/jdbc/TimestampUtils.java:858
+#: org/postgresql/jdbc/TimestampUtils.java:915
+#: org/postgresql/jdbc/TimestampUtils.java:961
+#: org/postgresql/jdbc/TimestampUtils.java:1010
#, fuzzy, java-format
-msgid "Unknown XML Result class: {0}"
-msgstr "Param�tre holdability du ResultSet inconnu�: {0}."
+msgid "Unsupported binary encoding of {0}."
+msgstr "Valeur de type non support�e�: {0}"
-#: org/postgresql/jdbc/PgSQLXML.java:228
-#, fuzzy
-msgid "This SQLXML object has already been freed."
-msgstr "Cette PooledConnection a d�j� �t� ferm�e."
+#: org/postgresql/jdbc/PgCallableStatement.java:86
+#: org/postgresql/jdbc/PgCallableStatement.java:96
+msgid "A CallableStatement was executed with nothing returned."
+msgstr "Un CallableStatement a �t� ex�cut� mais n''a rien retourn�."
-#: org/postgresql/jdbc/PgSQLXML.java:237
-msgid ""
-"This SQLXML object has not been initialized, so you cannot retrieve data "
-"from it."
+#: org/postgresql/jdbc/PgCallableStatement.java:107
+#, fuzzy
+msgid "A CallableStatement was executed with an invalid number of parameters"
msgstr ""
+"Un CallableStatement a �t� ex�cut� avec un nombre de param�tres incorrect"
-#: org/postgresql/jdbc/PgSQLXML.java:250
+#: org/postgresql/jdbc/PgCallableStatement.java:145
#, java-format
-msgid "Failed to convert binary xml data to encoding: {0}."
-msgstr ""
-
-#: org/postgresql/jdbc/PgSQLXML.java:276
-msgid "Unable to convert DOMResult SQLXML data to a string."
-msgstr ""
-
-#: org/postgresql/jdbc/PgSQLXML.java:290
msgid ""
-"This SQLXML object has already been initialized, so you cannot manipulate it "
-"further."
-msgstr ""
-
-#: org/postgresql/jdbc/PgStatement.java:325
-msgid "Can''t use executeWithFlags(int) on a Statement."
+"A CallableStatement function was executed and the out parameter {0} was of "
+"type {1} however type {2} was registered."
msgstr ""
+"Une fonction CallableStatement a �t� ex�cut�e et le param�tre en sortie {0} "
+"�tait du type {1} alors que le type {2} �tait pr�vu."
-#: org/postgresql/jdbc/PgStatement.java:484
-msgid "Maximum number of rows must be a value grater than or equal to 0."
+#: org/postgresql/jdbc/PgCallableStatement.java:202
+msgid ""
+"This statement does not declare an OUT parameter. Use '{' ?= call ... '}' "
+"to declare one."
msgstr ""
-"Le nombre maximum de lignes doit �tre une valeur sup�rieure ou �gale � 0."
+"Cette requ�te ne d�clare pas de param�tre OUT. Utilisez '{' ?= call ... '}' "
+"pour en d�clarer un."
-#: org/postgresql/jdbc/PgStatement.java:525
-msgid "Query timeout must be a value greater than or equals to 0."
-msgstr "Query timeout doit �tre une valeur sup�rieure ou �gale � 0."
+#: org/postgresql/jdbc/PgCallableStatement.java:246
+msgid "wasNull cannot be call before fetching a result."
+msgstr "wasNull ne peut pas �tre appel� avant la r�cup�ration d''un r�sultat."
-#: org/postgresql/jdbc/PgStatement.java:561
-msgid "The maximum field size must be a value greater than or equal to 0."
+#: org/postgresql/jdbc/PgCallableStatement.java:384
+#: org/postgresql/jdbc/PgCallableStatement.java:403
+#, java-format
+msgid ""
+"Parameter of type {0} was registered, but call to get{1} (sqltype={2}) was "
+"made."
msgstr ""
-"La taille maximum des champs doit �tre une valeur sup�rieure ou �gale � 0."
-
-#: org/postgresql/jdbc/PgStatement.java:871
-msgid "This statement has been closed."
-msgstr "Ce statement a �t� ferm�."
+"Un param�tre de type {0} a �t� enregistr�, mais un appel � get{1} "
+"(sqltype={2}) a �t� fait."
-#: org/postgresql/jdbc/PgStatement.java:1148
-#, fuzzy
+#: org/postgresql/jdbc/PgCallableStatement.java:424
msgid ""
-"Returning autogenerated keys is only supported for 8.2 and later servers."
-msgstr "Le renvoi des cl�s automatiquement g�n�r�es n''est pas support�."
-
-#: org/postgresql/jdbc/PgStatement.java:1326
-#: org/postgresql/jdbc/PgStatement.java:1357
-#, fuzzy
-msgid "Returning autogenerated keys by column index is not supported."
-msgstr "Le renvoi des cl�s automatiquement g�n�r�es n''est pas support�."
-
-#: org/postgresql/jdbc/PSQLSavepoint.java:40
-#: org/postgresql/jdbc/PSQLSavepoint.java:54
-#: org/postgresql/jdbc/PSQLSavepoint.java:72
-msgid "Cannot reference a savepoint after it has been released."
-msgstr "Impossible de r�f�rencer un savepoint apr�s qu''il ait �t� lib�r�."
-
-#: org/postgresql/jdbc/PSQLSavepoint.java:45
-msgid "Cannot retrieve the id of a named savepoint."
-msgstr "Impossible de retrouver l''identifiant d''un savepoint nomm�."
-
-#: org/postgresql/jdbc/PSQLSavepoint.java:59
-msgid "Cannot retrieve the name of an unnamed savepoint."
-msgstr "Impossible de retrouver le nom d''un savepoint sans nom."
+"A CallableStatement was declared, but no call to registerOutParameter(1, "
+"<some type>) was made."
+msgstr ""
+"Un CallableStatement a �t� d�clar�, mais aucun appel � "
+"registerOutParameter(1, <un type>) n''a �t� fait."
-#: org/postgresql/jdbc/TimestampUtils.java:298
-#, fuzzy, java-format
-msgid "Bad value for type timestamp/date/time: {1}"
-msgstr "Mauvaise valeur pour le type {0}�: {1}"
+#: org/postgresql/jdbc/PgCallableStatement.java:430
+msgid "No function outputs were registered."
+msgstr "Aucune fonction outputs n''a �t� enregistr�e."
-#: org/postgresql/jdbc/TimestampUtils.java:359
+#: org/postgresql/jdbc/PgCallableStatement.java:436
msgid ""
-"Infinite value found for timestamp/date. This cannot be represented as time."
+"Results cannot be retrieved from a CallableStatement before it is executed."
msgstr ""
-"Valeur infinie trouv�e pour une date/timestamp. Cette valeur ne peut �tre "
-"repr�sent� comme une valeur temporelle."
-
-#: org/postgresql/jdbc/TimestampUtils.java:674
-#: org/postgresql/jdbc/TimestampUtils.java:710
-#: org/postgresql/jdbc/TimestampUtils.java:757
-#, fuzzy, java-format
-msgid "Unsupported binary encoding of {0}."
-msgstr "Valeur de type non support�e�: {0}"
-
-#: org/postgresql/largeobject/LargeObjectManager.java:147
-msgid "Failed to initialize LargeObject API"
-msgstr "�chec � l''initialisation de l''API LargeObject"
-
-#: org/postgresql/largeobject/LargeObjectManager.java:265
-#: org/postgresql/largeobject/LargeObjectManager.java:308
-msgid "Large Objects may not be used in auto-commit mode."
-msgstr "Les Large Objects ne devraient pas �tre utilis�s en mode auto-commit."
+"Les r�sultats ne peuvent �tre r�cup�r�s � partir d''un CallableStatement "
+"avant qu''il ne soit ex�cut�."
-#: org/postgresql/osgi/PGDataSourceFactory.java:85
+#: org/postgresql/jdbc/PgCallableStatement.java:703
#, fuzzy, java-format
-msgid "Unsupported properties: {0}"
+msgid "Unsupported type conversion to {1}."
msgstr "Valeur de type non support�e�: {0}"
-#: org/postgresql/PGProperty.java:450 org/postgresql/PGProperty.java:470
+#: org/postgresql/jdbc/EscapedFunctions.java:240
#, java-format
-msgid "{0} parameter value must be an integer but was: {1}"
-msgstr ""
-
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:125
-msgid ""
-"Could not find a java cryptographic algorithm: X.509 CertificateFactory not "
-"available."
-msgstr ""
+msgid "{0} function takes four and only four argument."
+msgstr "La fonction {0} n''accepte que quatre et seulement quatre arguments."
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:135
+#: org/postgresql/jdbc/EscapedFunctions.java:270
+#: org/postgresql/jdbc/EscapedFunctions.java:344
+#: org/postgresql/jdbc/EscapedFunctions.java:749
+#: org/postgresql/jdbc/EscapedFunctions.java:787
#, java-format
-msgid "Could not open SSL certificate file {0}."
-msgstr ""
+msgid "{0} function takes two and only two arguments."
+msgstr "La fonction {0} n''accepte que deux et seulement deux arguments."
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:140
+#: org/postgresql/jdbc/EscapedFunctions.java:288
+#: org/postgresql/jdbc/EscapedFunctions.java:326
+#: org/postgresql/jdbc/EscapedFunctions.java:446
+#: org/postgresql/jdbc/EscapedFunctions.java:461
+#: org/postgresql/jdbc/EscapedFunctions.java:476
+#: org/postgresql/jdbc/EscapedFunctions.java:491
+#: org/postgresql/jdbc/EscapedFunctions.java:506
+#: org/postgresql/jdbc/EscapedFunctions.java:521
+#: org/postgresql/jdbc/EscapedFunctions.java:536
+#: org/postgresql/jdbc/EscapedFunctions.java:551
+#: org/postgresql/jdbc/EscapedFunctions.java:566
+#: org/postgresql/jdbc/EscapedFunctions.java:581
+#: org/postgresql/jdbc/EscapedFunctions.java:596
+#: org/postgresql/jdbc/EscapedFunctions.java:611
+#: org/postgresql/jdbc/EscapedFunctions.java:775
#, java-format
-msgid "Loading the SSL certificate {0} into a KeyManager failed."
-msgstr ""
-
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:195
-msgid "Enter SSL password: "
-msgstr ""
+msgid "{0} function takes one and only one argument."
+msgstr "La fonction {0} n''accepte qu''un et un seul argument."
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:202
-msgid "Could not read password for SSL key file, console is not available."
-msgstr ""
+#: org/postgresql/jdbc/EscapedFunctions.java:310
+#: org/postgresql/jdbc/EscapedFunctions.java:391
+#, java-format
+msgid "{0} function takes two or three arguments."
+msgstr "La fonction {0} n''accepte que deux ou trois arguments."
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:207
+#: org/postgresql/jdbc/EscapedFunctions.java:416
+#: org/postgresql/jdbc/EscapedFunctions.java:431
+#: org/postgresql/jdbc/EscapedFunctions.java:734
+#: org/postgresql/jdbc/EscapedFunctions.java:764
#, java-format
-msgid "Could not read password for SSL key file by callbackhandler {0}."
-msgstr ""
+msgid "{0} function doesn''t take any argument."
+msgstr "La fonction {0} n''accepte aucun argument."
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:226
+#: org/postgresql/jdbc/EscapedFunctions.java:627
+#: org/postgresql/jdbc/EscapedFunctions.java:680
#, java-format
-msgid "Could not decrypt SSL key file {0}."
-msgstr ""
+msgid "{0} function takes three and only three arguments."
+msgstr "La fonction {0} n''accepte que trois et seulement trois arguments."
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:240
+#: org/postgresql/jdbc/EscapedFunctions.java:640
+#: org/postgresql/jdbc/EscapedFunctions.java:661
+#: org/postgresql/jdbc/EscapedFunctions.java:664
+#: org/postgresql/jdbc/EscapedFunctions.java:697
+#: org/postgresql/jdbc/EscapedFunctions.java:710
+#: org/postgresql/jdbc/EscapedFunctions.java:713
#, java-format
-msgid "Could not read SSL key file {0}."
-msgstr ""
+msgid "Interval {0} not yet implemented"
+msgstr "L''interval {0} n''est pas encore impl�ment�"
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:243
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:162
+#: org/postgresql/PGProperty.java:535 org/postgresql/PGProperty.java:555
#, java-format
-msgid "Could not find a java cryptographic algorithm: {0}."
+msgid "{0} parameter value must be an integer but was: {1}"
msgstr ""
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:90
-#, fuzzy, java-format
-msgid "The password callback class provided {0} could not be instantiated."
-msgstr "La classe SSLSocketFactory fournie {0} n''a pas pu �tre instanci�e."
+#: org/postgresql/largeobject/LargeObjectManager.java:144
+msgid "Failed to initialize LargeObject API"
+msgstr "�chec � l''initialisation de l''API LargeObject"
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:123
-#, java-format
-msgid "Could not open SSL root certificate file {0}."
-msgstr ""
+#: org/postgresql/largeobject/LargeObjectManager.java:262
+#: org/postgresql/largeobject/LargeObjectManager.java:305
+msgid "Large Objects may not be used in auto-commit mode."
+msgstr "Les Large Objects ne devraient pas �tre utilis�s en mode auto-commit."
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:139
+#: org/postgresql/copy/PGCopyInputStream.java:51
#, java-format
-msgid "Could not read SSL root certificate file {0}."
+msgid "Copying from database failed: {0}"
msgstr ""
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:143
-#, java-format
-msgid "Loading the SSL root certificate {0} into a TrustManager failed."
-msgstr ""
+#: org/postgresql/copy/PGCopyInputStream.java:67
+#: org/postgresql/copy/PGCopyOutputStream.java:94
+#, fuzzy
+msgid "This copy stream is closed."
+msgstr "Ce ResultSet est ferm�."
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:156
-msgid "Could not initialize SSL context."
+#: org/postgresql/copy/PGCopyInputStream.java:110
+msgid "Read from copy failed."
msgstr ""
-#: org/postgresql/ssl/MakeSSL.java:52
-#, java-format
-msgid "The SSLSocketFactory class provided {0} could not be instantiated."
-msgstr "La classe SSLSocketFactory fournie {0} n''a pas pu �tre instanci�e."
-
-#: org/postgresql/ssl/MakeSSL.java:67
+#: org/postgresql/copy/CopyManager.java:53
#, java-format
-msgid "SSL error: {0}"
+msgid "Requested CopyIn but got {0}"
msgstr ""
-#: org/postgresql/ssl/MakeSSL.java:78
-#, fuzzy, java-format
-msgid "The HostnameVerifier class provided {0} could not be instantiated."
-msgstr "La classe SSLSocketFactory fournie {0} n''a pas pu �tre instanci�e."
-
-#: org/postgresql/ssl/MakeSSL.java:84
+#: org/postgresql/copy/CopyManager.java:64
#, java-format
-msgid "The hostname {0} could not be verified by hostnameverifier {1}."
+msgid "Requested CopyOut but got {0}"
msgstr ""
-#: org/postgresql/ssl/MakeSSL.java:93
+#: org/postgresql/copy/CopyManager.java:75
#, java-format
-msgid "The hostname {0} could not be verified."
+msgid "Requested CopyDual but got {0}"
msgstr ""
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:167
-msgid "The sslfactoryarg property may not be empty."
+#: org/postgresql/copy/PGCopyOutputStream.java:71
+#, java-format
+msgid "Cannot write to copy a byte of value {0}"
msgstr ""
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:183
-msgid ""
-"The environment variable containing the server's SSL certificate must not be "
-"empty."
+#: org/postgresql/fastpath/Fastpath.java:80
+#, fuzzy, java-format
+msgid "Fastpath call {0} - No result was returned and we expected a numeric."
msgstr ""
+"Appel Fastpath {0} - Aucun r�sultat n''a �t� retourn� et nous attendions un "
+"entier."
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:191
-msgid ""
-"The system property containing the server's SSL certificate must not be "
-"empty."
+#: org/postgresql/fastpath/Fastpath.java:157
+#, java-format
+msgid "Fastpath call {0} - No result was returned and we expected an integer."
msgstr ""
+"Appel Fastpath {0} - Aucun r�sultat n''a �t� retourn� et nous attendions un "
+"entier."
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:198
+#: org/postgresql/fastpath/Fastpath.java:165
+#, fuzzy, java-format
msgid ""
-"The sslfactoryarg property must start with the prefix file:, classpath:, "
-"env:, sys:, or -----BEGIN CERTIFICATE-----."
-msgstr ""
-
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:210
-#, fuzzy
-msgid "An error occurred reading the certificate"
-msgstr ""
-"Une erreur s''est produite pendant l''�tablissement de la connexion SSL."
-
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:243
-msgid "No X509TrustManager found"
+"Fastpath call {0} - No result was returned or wrong size while expecting an "
+"integer."
msgstr ""
+"Appel Fastpath {0} - Aucun r�sultat n''a �t� retourn� et nous attendions un "
+"entier."
-#: org/postgresql/util/PGInterval.java:155
-msgid "Conversion of interval failed"
-msgstr "La conversion de l''intervalle a �chou�"
-
-#: org/postgresql/util/PGmoney.java:65
-msgid "Conversion of money failed."
-msgstr "La conversion de money a �chou�."
-
-#: org/postgresql/util/ServerErrorMessage.java:165
-#, java-format
-msgid "Detail: {0}"
-msgstr "D�tail�: {0}"
-
-#: org/postgresql/util/ServerErrorMessage.java:170
-#, java-format
-msgid "Hint: {0}"
-msgstr "Indice�: {0}"
-
-#: org/postgresql/util/ServerErrorMessage.java:174
-#, java-format
-msgid "Position: {0}"
-msgstr "Position�: {0}"
-
-#: org/postgresql/util/ServerErrorMessage.java:178
-#, java-format
-msgid "Where: {0}"
-msgstr "O��: {0}"
-
-#: org/postgresql/util/ServerErrorMessage.java:184
-#, java-format
-msgid "Internal Query: {0}"
-msgstr "Requ�te interne: {0}"
-
-#: org/postgresql/util/ServerErrorMessage.java:188
-#, java-format
-msgid "Internal Position: {0}"
-msgstr "Position interne�: {0}"
-
-#: org/postgresql/util/ServerErrorMessage.java:195
-#, java-format
-msgid "Location: File: {0}, Routine: {1}, Line: {2}"
-msgstr "Localisation�: Fichier�: {0}, Routine�: {1}, Ligne�: {2}"
-
-#: org/postgresql/util/ServerErrorMessage.java:200
-#, java-format
-msgid "Server SQLState: {0}"
-msgstr "SQLState serveur�: {0}"
-
-#: org/postgresql/xa/PGXAConnection.java:148
-msgid ""
-"Transaction control methods setAutoCommit(true), commit, rollback and "
-"setSavePoint not allowed while an XA transaction is active."
+#: org/postgresql/fastpath/Fastpath.java:182
+#, fuzzy, java-format
+msgid "Fastpath call {0} - No result was returned and we expected a long."
msgstr ""
+"Appel Fastpath {0} - Aucun r�sultat n''a �t� retourn� et nous attendions un "
+"entier."
-#: org/postgresql/xa/PGXAConnection.java:196
-#: org/postgresql/xa/PGXAConnection.java:265
-msgid "Invalid flags"
-msgstr "Drapeaux invalides"
-
-#: org/postgresql/xa/PGXAConnection.java:200
-#: org/postgresql/xa/PGXAConnection.java:269
-#: org/postgresql/xa/PGXAConnection.java:437
-msgid "xid must not be null"
-msgstr "xid ne doit pas �tre nul"
-
-#: org/postgresql/xa/PGXAConnection.java:204
-msgid "Connection is busy with another transaction"
-msgstr "La connection est occup�e avec une autre transaction"
-
-#: org/postgresql/xa/PGXAConnection.java:213
-#: org/postgresql/xa/PGXAConnection.java:279
-msgid "suspend/resume not implemented"
-msgstr "suspend/resume pas impl�ment�"
-
-#: org/postgresql/xa/PGXAConnection.java:219
-#: org/postgresql/xa/PGXAConnection.java:224
-#: org/postgresql/xa/PGXAConnection.java:228
-msgid "Transaction interleaving not implemented"
-msgstr "L''entrelacement des transactions n''est pas impl�ment�"
-
-#: org/postgresql/xa/PGXAConnection.java:239
-msgid "Error disabling autocommit"
-msgstr "Erreur en d�sactivant autocommit"
-
-#: org/postgresql/xa/PGXAConnection.java:273
-msgid "tried to call end without corresponding start call"
-msgstr "tentative d''appel de fin sans l''appel start correspondant"
-
-#: org/postgresql/xa/PGXAConnection.java:305
+#: org/postgresql/fastpath/Fastpath.java:190
+#, fuzzy, java-format
msgid ""
-"Not implemented: Prepare must be issued using the same connection that "
-"started the transaction"
+"Fastpath call {0} - No result was returned or wrong size while expecting a "
+"long."
msgstr ""
-"Pas impl�ment�: Prepare doit �tre envoy� sur la m�me connection qui a "
-"d�marr� la transaction"
+"Appel Fastpath {0} - Aucun r�sultat n''a �t� retourn� et nous attendions un "
+"entier."
-#: org/postgresql/xa/PGXAConnection.java:309
-msgid "Prepare called before end"
-msgstr "Pr�paration appel�e avant la fin"
+#: org/postgresql/fastpath/Fastpath.java:302
+#, java-format
+msgid "The fastpath function {0} is unknown."
+msgstr "La fonction fastpath {0} est inconnue."
-#: org/postgresql/xa/PGXAConnection.java:317
-msgid "Server versions prior to 8.1 do not support two-phase commit."
-msgstr ""
-"Les serveurs de versions ant�rieures � 8.1 ne supportent pas le commit � "
-"deux phases."
+#~ msgid ""
+#~ "Connection refused. Check that the hostname and port are correct and that "
+#~ "the postmaster is accepting TCP/IP connections."
+#~ msgstr ""
+#~ "Connexion refus�e. V�rifiez que le nom de machine et le port sont "
+#~ "corrects et que postmaster accepte les connexions TCP/IP."
-#: org/postgresql/xa/PGXAConnection.java:334
-msgid "Error preparing transaction"
-msgstr "Erreur en pr�parant la transaction"
+#, fuzzy
+#~ msgid "The connection url is invalid."
+#~ msgstr "La tentative de connexion a �chou�."
-#: org/postgresql/xa/PGXAConnection.java:349
-msgid "Invalid flag"
-msgstr "Drapeau invalide"
+#~ msgid "Connection rejected: {0}."
+#~ msgstr "Connexion rejet�e�: {0}."
-#: org/postgresql/xa/PGXAConnection.java:384
-msgid "Error during recover"
-msgstr "Erreur durant la restauration"
+#~ msgid "Backend start-up failed: {0}."
+#~ msgstr "D�marrage du serveur en �chec�: {0}."
-#: org/postgresql/xa/PGXAConnection.java:423
-#: org/postgresql/xa/PGXAConnection.java:426
-msgid "Error rolling back prepared transaction"
-msgstr "Erreur en annulant une transaction pr�par�e"
+#~ msgid "Server versions prior to 8.0 do not support savepoints."
+#~ msgstr ""
+#~ "Les serveurs de version ant�rieure � 8.0 ne supportent pas les savepoints."
-#: org/postgresql/xa/PGXAConnection.java:464
-msgid ""
-"Not implemented: one-phase commit must be issued using the same connection "
-"that was used to start it"
-msgstr ""
-"Pas impl�ment�: le commit � une phase doit avoir lieu en utilisant la m�me "
-"connection que celle o� il a commenc�"
+#~ msgid "Unexpected error while decoding character data from a large object."
+#~ msgstr ""
+#~ "Erreur inattendue pendant le d�codage des donn�es caract�res pour un "
+#~ "large object."
-#: org/postgresql/xa/PGXAConnection.java:468
-msgid "commit called before end"
-msgstr "Commit appel� avant la fin"
+#, fuzzy
+#~ msgid ""
+#~ "Returning autogenerated keys is only supported for 8.2 and later servers."
+#~ msgstr "Le renvoi des cl�s automatiquement g�n�r�es n''est pas support�."
-#: org/postgresql/xa/PGXAConnection.java:478
-msgid "Error during one-phase commit"
-msgstr "Erreur pendant le commit � une phase"
+#~ msgid ""
+#~ "Infinite value found for timestamp/date. This cannot be represented as "
+#~ "time."
+#~ msgstr ""
+#~ "Valeur infinie trouv�e pour une date/timestamp. Cette valeur ne peut �tre "
+#~ "repr�sent� comme une valeur temporelle."
-#: org/postgresql/xa/PGXAConnection.java:497
-msgid ""
-"Not implemented: 2nd phase commit must be issued using an idle connection"
-msgstr ""
-"Pas impl�ment�: le commit � deux phase doit �tre envoy� sur une connection "
-"inutilis�e"
+#~ msgid "Transaction interleaving not implemented"
+#~ msgstr "L''entrelacement des transactions n''est pas impl�ment�"
-#: org/postgresql/xa/PGXAConnection.java:513
-#, fuzzy
-msgid "Error committing prepared transaction"
-msgstr "Erreur en annulant une transaction pr�par�e"
+#~ msgid "Server versions prior to 8.1 do not support two-phase commit."
+#~ msgstr ""
+#~ "Les serveurs de versions ant�rieures � 8.1 ne supportent pas le commit � "
+#~ "deux phases."
-#: org/postgresql/xa/PGXAConnection.java:529
-msgid "Heuristic commit/rollback not supported"
-msgstr "Heuristic commit/rollback non support�"
+#~ msgid "Invalid flag"
+#~ msgstr "Drapeau invalide"
#~ msgid "The class {0} does not implement org.postgresql.util.PGobject."
#~ msgstr "La classe {0} n''impl�mente pas org.postgresql.util.PGobject."
diff --git a/pgjdbc/src/main/java/org/postgresql/translation/it.po b/pgjdbc/src/main/java/org/postgresql/translation/it.po
index 6435572..520dec8 100644
--- a/pgjdbc/src/main/java/org/postgresql/translation/it.po
+++ b/pgjdbc/src/main/java/org/postgresql/translation/it.po
@@ -9,7 +9,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PostgreSQL JDBC Driver 8.2\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-01-07 13:37+0300\n"
+"POT-Creation-Date: 2018-03-10 23:24+0300\n"
"PO-Revision-Date: 2006-06-23 17:25+0200\n"
"Last-Translator: Giuseppe Sacco <eppesuig at debian.org>\n"
"Language-Team: Italian <tp at lists.linux.it>\n"
@@ -18,431 +18,417 @@ msgstr ""
"Content-Type: text/plain; charset=ISO-8859-1\n"
"Content-Transfer-Encoding: 8bit\n"
-#: org/postgresql/copy/CopyManager.java:57
-#, java-format
-msgid "Requested CopyIn but got {0}"
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:164
+msgid "The sslfactoryarg property may not be empty."
msgstr ""
-#: org/postgresql/copy/CopyManager.java:69
-#, java-format
-msgid "Requested CopyOut but got {0}"
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:180
+msgid ""
+"The environment variable containing the server's SSL certificate must not be "
+"empty."
msgstr ""
-#: org/postgresql/copy/PGCopyInputStream.java:54
-#, fuzzy, java-format
-msgid "Copying from database failed: {0}"
-msgstr "Fallita la conversione di un ``box'': {0}."
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:188
+msgid ""
+"The system property containing the server's SSL certificate must not be "
+"empty."
+msgstr ""
+
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:195
+msgid ""
+"The sslfactoryarg property must start with the prefix file:, classpath:, "
+"env:, sys:, or -----BEGIN CERTIFICATE-----."
+msgstr ""
-#: org/postgresql/copy/PGCopyInputStream.java:70
-#: org/postgresql/copy/PGCopyOutputStream.java:97
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:207
#, fuzzy
-msgid "This copy stream is closed."
-msgstr "Questo �ResultSet� � chiuso."
+msgid "An error occurred reading the certificate"
+msgstr "Si � verificato un errore impostando la connessione SSL."
-#: org/postgresql/copy/PGCopyInputStream.java:113
-msgid "Read from copy failed."
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:240
+msgid "No X509TrustManager found"
msgstr ""
-#: org/postgresql/copy/PGCopyOutputStream.java:74
-#, java-format
-msgid "Cannot write to copy a byte of value {0}"
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:133
+msgid ""
+"Could not find a java cryptographic algorithm: X.509 CertificateFactory not "
+"available."
msgstr ""
-#: org/postgresql/core/ConnectionFactory.java:74
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:143
#, java-format
-msgid "A connection could not be made using the requested protocol {0}."
+msgid "Could not open SSL certificate file {0}."
msgstr ""
-"Non � stato possibile attivare la connessione utilizzando il protocollo "
-"richiesto {0}."
-#: org/postgresql/core/Oid.java:114
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:148
#, java-format
-msgid "oid type {0} not known and not a number"
+msgid "Loading the SSL certificate {0} into a KeyManager failed."
msgstr ""
-#: org/postgresql/core/Parser.java:616
-#, java-format
-msgid "Malformed function or procedure escape syntax at offset {0}."
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:205
+msgid "Enter SSL password: "
msgstr ""
-"Sequenza di escape definita erroneamente nella funzione o procedura "
-"all''offset {0}."
-#: org/postgresql/core/PGStream.java:497
-#, java-format
-msgid "Premature end of input stream, expected {0} bytes, but only read {1}."
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:212
+msgid "Could not read password for SSL key file, console is not available."
msgstr ""
-"Il flusso di input � stato interrotto, sono arrivati {1} byte al posto dei "
-"{0} attesi."
-#: org/postgresql/core/PGStream.java:538
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:217
#, java-format
-msgid "Expected an EOF from server, got: {0}"
-msgstr "Ricevuto dal server �{0}� mentre era atteso un EOF"
-
-#: org/postgresql/core/SetupQueryRunner.java:90
-msgid "An unexpected result was returned by a query."
-msgstr "Un risultato inaspettato � stato ricevuto dalla query."
+msgid "Could not read password for SSL key file by callbackhandler {0}."
+msgstr ""
-#: org/postgresql/core/UTF8Encoding.java:31
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:236
#, java-format
-msgid ""
-"Illegal UTF-8 sequence: byte {0} of {1} byte sequence is not 10xxxxxx: {2}"
+msgid "Could not decrypt SSL key file {0}."
msgstr ""
-"Sequenza UTF-8 illegale: il byte {0} di una sequenza di {1} byte non � "
-"10xxxxxx: {2}"
-#: org/postgresql/core/UTF8Encoding.java:69
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:250
#, java-format
-msgid "Illegal UTF-8 sequence: {0} bytes used to encode a {1} byte value: {2}"
+msgid "Could not read SSL key file {0}."
msgstr ""
-"Sequenza UTF-8 illegale: {0} byte utilizzati per codificare un valore di {1} "
-"byte: {2}"
-#: org/postgresql/core/UTF8Encoding.java:104
-#: org/postgresql/core/UTF8Encoding.java:131
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:253
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:176
#, java-format
-msgid "Illegal UTF-8 sequence: initial byte is {0}: {1}"
-msgstr "Sequenza UTF-8 illegale: il byte iniziale � {0}: {1}"
+msgid "Could not find a java cryptographic algorithm: {0}."
+msgstr ""
+
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:99
+#, fuzzy, java-format
+msgid "The password callback class provided {0} could not be instantiated."
+msgstr ""
+"La classe �SSLSocketFactory� specificata, �{0}�, non pu� essere istanziata."
-#: org/postgresql/core/UTF8Encoding.java:137
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:132
#, java-format
-msgid "Illegal UTF-8 sequence: final value is out of range: {0}"
+msgid "Could not open SSL root certificate file {0}."
msgstr ""
-"Sequenza UTF-8 illegale: il valore finale � fuori dall''intervallo permesso: "
-"{0}"
-#: org/postgresql/core/UTF8Encoding.java:153
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:147
#, java-format
-msgid "Illegal UTF-8 sequence: final value is a surrogate value: {0}"
-msgstr "Sequenza UTF-8 illegale: il valore � finale � un surrogato: {0}"
+msgid "Could not read SSL root certificate file {0}."
+msgstr ""
-#: org/postgresql/core/Utils.java:119 org/postgresql/core/Utils.java:136
-msgid "Zero bytes may not occur in string parameters."
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:151
+#, java-format
+msgid "Loading the SSL root certificate {0} into a TrustManager failed."
msgstr ""
-"Byte con valore zero non possono essere contenuti nei parametri stringa."
-#: org/postgresql/core/Utils.java:146 org/postgresql/core/Utils.java:217
-msgid "No IOException expected from StringBuffer or StringBuilder"
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:170
+msgid "Could not initialize SSL context."
msgstr ""
-#: org/postgresql/core/Utils.java:206
-#, fuzzy
-msgid "Zero bytes may not occur in identifiers."
+#: org/postgresql/ssl/MakeSSL.java:52
+#, java-format
+msgid "The SSLSocketFactory class provided {0} could not be instantiated."
msgstr ""
-"Byte con valore zero non possono essere contenuti nei parametri stringa."
+"La classe �SSLSocketFactory� specificata, �{0}�, non pu� essere istanziata."
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:72
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:87
-#, fuzzy, java-format
-msgid "Invalid sslmode value: {0}"
-msgstr "La dimensione specificata, {0}, per lo �stream� non � valida."
+#: org/postgresql/ssl/MakeSSL.java:67
+#, java-format
+msgid "SSL error: {0}"
+msgstr ""
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:87
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:111
+#: org/postgresql/ssl/MakeSSL.java:78
#, fuzzy, java-format
-msgid "Invalid targetServerType value: {0}"
-msgstr "La dimensione specificata, {0}, per lo �stream� non � valida."
+msgid "The HostnameVerifier class provided {0} could not be instantiated."
+msgstr ""
+"La classe �SSLSocketFactory� specificata, �{0}�, non pu� essere istanziata."
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:152
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:228
+#: org/postgresql/ssl/MakeSSL.java:84
#, java-format
-msgid "Could not find a server with specified targetServerType: {0}"
+msgid "The hostname {0} could not be verified by hostnameverifier {1}."
msgstr ""
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:172
-msgid ""
-"Connection refused. Check that the hostname and port are correct and that "
-"the postmaster is accepting TCP/IP connections."
+#: org/postgresql/ssl/MakeSSL.java:93
+#, java-format
+msgid "The hostname {0} could not be verified."
msgstr ""
-"Connessione rifiutata. Controllare che il nome dell''host e la porta siano "
-"corretti, e che il server (postmaster) sia in esecuzione con l''opzione -i, "
-"che abilita le connessioni attraverso la rete TCP/IP."
-
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:181
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:262
-msgid "The connection attempt failed."
-msgstr "Il tentativo di connessione � fallito."
-
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:192
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:273
-#, fuzzy
-msgid "The connection url is invalid."
-msgstr "Il tentativo di connessione � fallito."
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:218
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:233
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:324
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:339
-msgid "The server does not support SSL."
-msgstr "Il server non supporta SSL."
+#: org/postgresql/gss/GssAction.java:126
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2550
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2581
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2585
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2640
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2650
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2659
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:655
+msgid "Protocol error. Session setup failed."
+msgstr "Errore di protocollo. Impostazione della sessione fallita."
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:249
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:355
-msgid "An error occurred while setting up the SSL connection."
-msgstr "Si � verificato un errore impostando la connessione SSL."
+#: org/postgresql/gss/GssAction.java:137 org/postgresql/gss/MakeGSS.java:66
+#: org/postgresql/gss/MakeGSS.java:74
+msgid "GSS Authentication failed"
+msgstr ""
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:300
+#: org/postgresql/core/Parser.java:933
#, java-format
-msgid "Connection rejected: {0}."
-msgstr "Connessione rifiutata: {0}."
+msgid "Malformed function or procedure escape syntax at offset {0}."
+msgstr ""
+"Sequenza di escape definita erroneamente nella funzione o procedura "
+"all''offset {0}."
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:321
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:349
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:375
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:456
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:486
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:515
-msgid ""
-"The server requested password-based authentication, but no password was "
-"provided."
+#: org/postgresql/core/SocketFactoryFactory.java:41
+#, fuzzy, java-format
+msgid "The SocketFactory class provided {0} could not be instantiated."
msgstr ""
-"Il server ha richiesto l''autenticazione con password, ma tale password non "
-"� stata fornita."
+"La classe �SSLSocketFactory� specificata, �{0}�, non pu� essere istanziata."
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:405
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:625
-#, java-format
-msgid ""
-"The authentication type {0} is not supported. Check that you have configured "
-"the pg_hba.conf file to include the client''s IP address or subnet, and that "
-"it is using an authentication scheme supported by the driver."
+#: org/postgresql/core/Utils.java:93 org/postgresql/core/Utils.java:110
+msgid "Zero bytes may not occur in string parameters."
msgstr ""
-"L''autenticazione di tipo {0} non � supportata. Verificare che nel file di "
-"configurazione pg_hba.conf sia presente l''indirizzo IP o la sottorete del "
-"client, e che lo schema di autenticazione utilizzato sia supportato dal "
-"driver."
+"Byte con valore zero non possono essere contenuti nei parametri stringa."
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:412
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:455
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:632
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:688
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:744
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:754
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:763
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:774
-#: org/postgresql/gss/GssAction.java:130
-msgid "Protocol error. Session setup failed."
-msgstr "Errore di protocollo. Impostazione della sessione fallita."
+#: org/postgresql/core/Utils.java:120 org/postgresql/core/Utils.java:170
+msgid "No IOException expected from StringBuffer or StringBuilder"
+msgstr ""
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:443
-#, java-format
-msgid "Backend start-up failed: {0}."
-msgstr "Attivazione del backend fallita: {0}."
-
-#: org/postgresql/core/v2/FastpathParameterList.java:63
-#: org/postgresql/core/v2/FastpathParameterList.java:89
-#: org/postgresql/core/v2/FastpathParameterList.java:100
-#: org/postgresql/core/v2/FastpathParameterList.java:111
-#: org/postgresql/core/v2/SimpleParameterList.java:70
-#: org/postgresql/core/v2/SimpleParameterList.java:94
-#: org/postgresql/core/v2/SimpleParameterList.java:105
-#: org/postgresql/core/v2/SimpleParameterList.java:116
-#: org/postgresql/core/v2/SimpleParameterList.java:127
-#: org/postgresql/core/v3/CompositeParameterList.java:36
-#: org/postgresql/core/v3/SimpleParameterList.java:53
-#: org/postgresql/core/v3/SimpleParameterList.java:64
-#: org/postgresql/jdbc/PgResultSet.java:2715
-#: org/postgresql/jdbc/PgResultSetMetaData.java:472
-#, java-format
-msgid "The column index is out of range: {0}, number of columns: {1}."
-msgstr "Indice di colonna, {0}, � maggiore del numero di colonne {1}."
+#: org/postgresql/core/Utils.java:159
+#, fuzzy
+msgid "Zero bytes may not occur in identifiers."
+msgstr ""
+"Byte con valore zero non possono essere contenuti nei parametri stringa."
-#: org/postgresql/core/v2/FastpathParameterList.java:164
-#: org/postgresql/core/v2/SimpleParameterList.java:191
-#: org/postgresql/core/v3/SimpleParameterList.java:225
+#: org/postgresql/core/UTF8Encoding.java:28
#, java-format
-msgid "No value specified for parameter {0}."
-msgstr "Nessun valore specificato come parametro {0}."
+msgid ""
+"Illegal UTF-8 sequence: byte {0} of {1} byte sequence is not 10xxxxxx: {2}"
+msgstr ""
+"Sequenza UTF-8 illegale: il byte {0} di una sequenza di {1} byte non � "
+"10xxxxxx: {2}"
-#: org/postgresql/core/v2/QueryExecutorImpl.java:87
-#: org/postgresql/core/v2/QueryExecutorImpl.java:347
-#: org/postgresql/core/v3/QueryExecutorImpl.java:404
-#: org/postgresql/core/v3/QueryExecutorImpl.java:465
+#: org/postgresql/core/UTF8Encoding.java:66
#, java-format
-msgid "Expected command status BEGIN, got {0}."
-msgstr "Lo stato del comando avrebbe dovuto essere BEGIN, mentre invece � {0}."
+msgid "Illegal UTF-8 sequence: {0} bytes used to encode a {1} byte value: {2}"
+msgstr ""
+"Sequenza UTF-8 illegale: {0} byte utilizzati per codificare un valore di {1} "
+"byte: {2}"
-#: org/postgresql/core/v2/QueryExecutorImpl.java:92
-#: org/postgresql/core/v3/QueryExecutorImpl.java:470
-#: org/postgresql/jdbc/PgResultSet.java:1731
+#: org/postgresql/core/UTF8Encoding.java:102
+#: org/postgresql/core/UTF8Encoding.java:129
#, java-format
-msgid "Unexpected command status: {0}."
-msgstr "Stato del comando non previsto: {0}."
+msgid "Illegal UTF-8 sequence: initial byte is {0}: {1}"
+msgstr "Sequenza UTF-8 illegale: il byte iniziale � {0}: {1}"
-#: org/postgresql/core/v2/QueryExecutorImpl.java:127
-#: org/postgresql/core/v2/QueryExecutorImpl.java:136
-#: org/postgresql/core/v2/QueryExecutorImpl.java:185
-#: org/postgresql/core/v2/QueryExecutorImpl.java:376
-#: org/postgresql/core/v3/QueryExecutorImpl.java:226
-#: org/postgresql/core/v3/QueryExecutorImpl.java:364
-#: org/postgresql/core/v3/QueryExecutorImpl.java:441
-#: org/postgresql/core/v3/QueryExecutorImpl.java:505
-#: org/postgresql/core/v3/QueryExecutorImpl.java:587
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2211
-#: org/postgresql/util/StreamWrapper.java:133
-msgid "An I/O error occurred while sending to the backend."
-msgstr "Si � verificato un errore di I/O nella spedizione di dati al server."
+#: org/postgresql/core/UTF8Encoding.java:135
+#, java-format
+msgid "Illegal UTF-8 sequence: final value is out of range: {0}"
+msgstr ""
+"Sequenza UTF-8 illegale: il valore finale � fuori dall''intervallo permesso: "
+"{0}"
-#: org/postgresql/core/v2/QueryExecutorImpl.java:180
-#: org/postgresql/core/v2/QueryExecutorImpl.java:235
-#: org/postgresql/core/v2/QueryExecutorImpl.java:249
-#: org/postgresql/core/v3/QueryExecutorImpl.java:582
-#: org/postgresql/core/v3/QueryExecutorImpl.java:642
+#: org/postgresql/core/UTF8Encoding.java:151
#, java-format
-msgid "Unknown Response Type {0}."
-msgstr "Risposta di tipo sconosciuto {0}."
+msgid "Illegal UTF-8 sequence: final value is a surrogate value: {0}"
+msgstr "Sequenza UTF-8 illegale: il valore � finale � un surrogato: {0}"
-#: org/postgresql/core/v2/QueryExecutorImpl.java:453
-#: org/postgresql/core/v2/QueryExecutorImpl.java:503
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1962
-msgid "Ran out of memory retrieving query results."
-msgstr "Fine memoria scaricando i risultati della query."
+#: org/postgresql/core/SetupQueryRunner.java:64
+msgid "An unexpected result was returned by a query."
+msgstr "Un risultato inaspettato � stato ricevuto dalla query."
-#: org/postgresql/core/v2/QueryExecutorImpl.java:640
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2328
+#: org/postgresql/core/PGStream.java:486
#, java-format
-msgid "Unable to interpret the update count in command completion tag: {0}."
-msgstr ""
-"Impossibile interpretare il numero degli aggiornamenti nel �tag� di "
-"completamento del comando: {0}."
-
-#: org/postgresql/core/v2/QueryExecutorImpl.java:654
-msgid "Copy not implemented for protocol version 2"
+msgid "Premature end of input stream, expected {0} bytes, but only read {1}."
msgstr ""
+"Il flusso di input � stato interrotto, sono arrivati {1} byte al posto dei "
+"{0} attesi."
-#: org/postgresql/core/v2/SocketFactoryFactory.java:36
-#, fuzzy, java-format
-msgid "The SocketFactory class provided {0} could not be instantiated."
-msgstr ""
-"La classe �SSLSocketFactory� specificata, �{0}�, non pu� essere istanziata."
+#: org/postgresql/core/PGStream.java:528
+#, java-format
+msgid "Expected an EOF from server, got: {0}"
+msgstr "Ricevuto dal server �{0}� mentre era atteso un EOF"
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:253
-#, fuzzy, java-format
-msgid ""
-"Connection to {0} refused. Check that the hostname and port are correct and "
-"that the postmaster is accepting TCP/IP connections."
+#: org/postgresql/core/v3/CopyOperationImpl.java:54
+msgid "CommandComplete expected COPY but got: "
msgstr ""
-"Connessione rifiutata. Controllare che il nome dell''host e la porta siano "
-"corretti, e che il server (postmaster) sia in esecuzione con l''opzione -i, "
-"che abilita le connessioni attraverso la rete TCP/IP."
-#: org/postgresql/core/v3/CopyOperationImpl.java:57
-msgid "CommandComplete expected COPY but got: "
+#: org/postgresql/core/v3/CopyInImpl.java:47
+msgid "CopyIn copy direction can't receive data"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:83
+#: org/postgresql/core/v3/QueryExecutorImpl.java:161
msgid "Tried to obtain lock while already holding it"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:98
+#: org/postgresql/core/v3/QueryExecutorImpl.java:177
msgid "Tried to break lock on database connection"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:115
+#: org/postgresql/core/v3/QueryExecutorImpl.java:195
#, fuzzy
msgid "Interrupted while waiting to obtain lock on database connection"
msgstr "Si � verificata una interruzione durante il tentativo di connessione."
-#: org/postgresql/core/v3/QueryExecutorImpl.java:220
+#: org/postgresql/core/v3/QueryExecutorImpl.java:327
msgid "Unable to bind parameter values for statement."
msgstr ""
"Impossibile fare il �bind� dei valori passati come parametri per lo "
"statement."
-#: org/postgresql/core/v3/QueryExecutorImpl.java:689
+#: org/postgresql/core/v3/QueryExecutorImpl.java:333
+#: org/postgresql/core/v3/QueryExecutorImpl.java:485
+#: org/postgresql/core/v3/QueryExecutorImpl.java:559
+#: org/postgresql/core/v3/QueryExecutorImpl.java:602
+#: org/postgresql/core/v3/QueryExecutorImpl.java:729
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2372
+#: org/postgresql/util/StreamWrapper.java:130
+msgid "An I/O error occurred while sending to the backend."
+msgstr "Si � verificato un errore di I/O nella spedizione di dati al server."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:534
+#: org/postgresql/core/v3/QueryExecutorImpl.java:576
+#, java-format
+msgid "Expected command status BEGIN, got {0}."
+msgstr "Lo stato del comando avrebbe dovuto essere BEGIN, mentre invece � {0}."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:581
+#: org/postgresql/jdbc/PgResultSet.java:1778
+#, java-format
+msgid "Unexpected command status: {0}."
+msgstr "Stato del comando non previsto: {0}."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:687
+#, fuzzy
+msgid "An error occurred while trying to get the socket timeout."
+msgstr "Si � verificato un errore di I/O nella spedizione di dati al server."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:722
+#: org/postgresql/core/v3/QueryExecutorImpl.java:798
+#, java-format
+msgid "Unknown Response Type {0}."
+msgstr "Risposta di tipo sconosciuto {0}."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:745
+#, fuzzy
+msgid "An error occurred while trying to reset the socket timeout."
+msgstr "Si � verificato un errore di I/O nella spedizione di dati al server."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:843
msgid "Database connection failed when starting copy"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:724
+#: org/postgresql/core/v3/QueryExecutorImpl.java:878
msgid "Tried to cancel an inactive copy operation"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:765
+#: org/postgresql/core/v3/QueryExecutorImpl.java:917
msgid "Database connection failed when canceling copy operation"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:781
+#: org/postgresql/core/v3/QueryExecutorImpl.java:933
msgid "Missing expected error response to copy cancel request"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:785
+#: org/postgresql/core/v3/QueryExecutorImpl.java:937
#, java-format
msgid "Got {0} error responses to single copy cancel request"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:800
+#: org/postgresql/core/v3/QueryExecutorImpl.java:952
msgid "Tried to end inactive copy"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:815
+#: org/postgresql/core/v3/QueryExecutorImpl.java:967
msgid "Database connection failed when ending copy"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:833
-#: org/postgresql/core/v3/QueryExecutorImpl.java:855
+#: org/postgresql/core/v3/QueryExecutorImpl.java:985
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1005
msgid "Tried to write to an inactive copy operation"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:848
-#: org/postgresql/core/v3/QueryExecutorImpl.java:863
+#: org/postgresql/core/v3/QueryExecutorImpl.java:998
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1013
msgid "Database connection failed when writing to copy"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:877
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1028
msgid "Tried to read from inactive copy"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:884
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1035
msgid "Database connection failed when reading from copy"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:956
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1101
#, java-format
msgid "Received CommandComplete ''{0}'' without an active copy operation"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:983
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1126
#, java-format
msgid "Got CopyInResponse from server during an active {0}"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:999
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1140
#, java-format
msgid "Got CopyOutResponse from server during an active {0}"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1017
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1154
+#, java-format
+msgid "Got CopyBothResponse from server during an active {0}"
+msgstr ""
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1170
msgid "Got CopyData without an active copy operation"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1021
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1174
#, fuzzy, java-format
msgid "Unexpected copydata from server for {0}"
msgstr "Ricevuto dal server �{0}� mentre era atteso un EOF"
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1061
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2037
-#, fuzzy, java-format
-msgid ""
-"The server''s client_encoding parameter was changed to {0}. The JDBC driver "
-"requires client_encoding to be UTF8 for correct operation."
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1234
+#, java-format
+msgid "Unexpected packet type during copy: {0}"
msgstr ""
-"Il parametro �client_encoding� del server � stato cambiato in {0}. Il driver "
-"JDBC richiede che �client_encoding� sia UNICODE per un corretto "
-"funzionamento."
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1069
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2045
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1524
#, java-format
msgid ""
-"The server''s DateStyle parameter was changed to {0}. The JDBC driver "
-"requires DateStyle to begin with ISO for correct operation."
+"Bind message length {0} too long. This can be caused by very large or "
+"incorrect length specifications on InputStream parameters."
+msgstr ""
+"Il messaggio di �bind� � troppo lungo ({0}). Questo pu� essere causato da "
+"una dimensione eccessiva o non corretta dei parametri dell''�InputStream�."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2145
+msgid "Ran out of memory retrieving query results."
+msgstr "Fine memoria scaricando i risultati della query."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2313
+msgid "The driver currently does not support COPY operations."
+msgstr "Il driver non supporta al momento l''operazione �COPY�."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2487
+#, fuzzy, java-format
+msgid "Unable to parse the count in command completion tag: {0}."
+msgstr ""
+"Impossibile interpretare il numero degli aggiornamenti nel �tag� di "
+"completamento del comando: {0}."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2603
+#, fuzzy, java-format
+msgid ""
+"The server''s client_encoding parameter was changed to {0}. The JDBC driver "
+"requires client_encoding to be UTF8 for correct operation."
+msgstr ""
+"Il parametro �client_encoding� del server � stato cambiato in {0}. Il driver "
+"JDBC richiede che �client_encoding� sia UNICODE per un corretto "
+"funzionamento."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2611
+#, java-format
+msgid ""
+"The server''s DateStyle parameter was changed to {0}. The JDBC driver "
+"requires DateStyle to begin with ISO for correct operation."
msgstr ""
"Il parametro del server �DateStyle� � stato cambiato in {0}. Il driver JDBC "
"richiede che �DateStyle� cominci con �ISO� per un corretto funzionamento."
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1083
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2059
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2624
#, fuzzy, java-format
msgid ""
"The server''s standard_conforming_strings parameter was reported as {0}. The "
@@ -452,64 +438,200 @@ msgstr ""
"JDBC richiede che �client_encoding� sia UNICODE per un corretto "
"funzionamento."
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1122
+#: org/postgresql/core/v3/SimpleParameterList.java:54
+#: org/postgresql/core/v3/SimpleParameterList.java:65
+#: org/postgresql/core/v3/CompositeParameterList.java:33
+#: org/postgresql/jdbc/PgResultSetMetaData.java:493
+#: org/postgresql/jdbc/PgResultSet.java:2751
#, java-format
-msgid "Unexpected packet type during copy: {0}"
+msgid "The column index is out of range: {0}, number of columns: {1}."
+msgstr "Indice di colonna, {0}, � maggiore del numero di colonne {1}."
+
+#: org/postgresql/core/v3/SimpleParameterList.java:257
+#, java-format
+msgid "No value specified for parameter {0}."
+msgstr "Nessun valore specificato come parametro {0}."
+
+#: org/postgresql/core/v3/SimpleParameterList.java:431
+#, fuzzy, java-format
+msgid "Added parameters index out of range: {0}, number of columns: {1}."
+msgstr "Il parametro indice � fuori intervallo: {0}, numero di elementi: {1}."
+
+#: org/postgresql/core/v3/replication/V3ReplicationProtocol.java:133
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:257
+msgid "The connection attempt failed."
+msgstr "Il tentativo di connessione � fallito."
+
+#: org/postgresql/core/v3/replication/V3PGReplicationStream.java:144
+#, java-format
+msgid "Unexpected packet type during replication: {0}"
+msgstr ""
+
+#: org/postgresql/core/v3/replication/V3PGReplicationStream.java:269
+#, fuzzy
+msgid "This replication stream has been closed."
+msgstr "Questo �Connection� � stato chiuso."
+
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:109
+#, fuzzy, java-format
+msgid "Invalid sslmode value: {0}"
+msgstr "La dimensione specificata, {0}, per lo �stream� non � valida."
+
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:124
+#, fuzzy, java-format
+msgid "Invalid targetServerType value: {0}"
+msgstr "La dimensione specificata, {0}, per lo �stream� non � valida."
+
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:246
+#, fuzzy, java-format
+msgid ""
+"Connection to {0} refused. Check that the hostname and port are correct and "
+"that the postmaster is accepting TCP/IP connections."
msgstr ""
+"Connessione rifiutata. Controllare che il nome dell''host e la porta siano "
+"corretti, e che il server (postmaster) sia in esecuzione con l''opzione -i, "
+"che abilita le connessioni attraverso la rete TCP/IP."
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1393
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:272
#, java-format
+msgid "Could not find a server with specified targetServerType: {0}"
+msgstr ""
+
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:366
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:379
+msgid "The server does not support SSL."
+msgstr "Il server non supporta SSL."
+
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:393
+msgid "An error occurred while setting up the SSL connection."
+msgstr "Si � verificato un errore impostando la connessione SSL."
+
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:494
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:521
msgid ""
-"Bind message length {0} too long. This can be caused by very large or "
-"incorrect length specifications on InputStream parameters."
+"The server requested password-based authentication, but no password was "
+"provided."
msgstr ""
-"Il messaggio di �bind� � troppo lungo ({0}). Questo pu� essere causato da "
-"una dimensione eccessiva o non corretta dei parametri dell''�InputStream�."
+"Il server ha richiesto l''autenticazione con password, ma tale password non "
+"� stata fornita."
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2131
-msgid "The driver currently does not support COPY operations."
-msgstr "Il driver non supporta al momento l''operazione �COPY�."
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:624
+msgid ""
+"SCRAM authentication is not supported by this driver. You need JDK >= 8 and "
+"pgjdbc >= 42.2.0 (not \".jre\" vesions)"
+msgstr ""
-#: org/postgresql/Driver.java:234
-msgid "Error loading default settings from driverconfig.properties"
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:648
+#, java-format
+msgid ""
+"The authentication type {0} is not supported. Check that you have configured "
+"the pg_hba.conf file to include the client''s IP address or subnet, and that "
+"it is using an authentication scheme supported by the driver."
msgstr ""
-"Si � verificato un errore caricando le impostazioni predefinite da "
-"�driverconfig.properties�."
+"L''autenticazione di tipo {0} non � supportata. Verificare che nel file di "
+"configurazione pg_hba.conf sia presente l''indirizzo IP o la sottorete del "
+"client, e che lo schema di autenticazione utilizzato sia supportato dal "
+"driver."
-#: org/postgresql/Driver.java:247
-msgid "Properties for the driver contains a non-string value for the key "
+#: org/postgresql/core/ConnectionFactory.java:57
+#, java-format
+msgid "A connection could not be made using the requested protocol {0}."
+msgstr ""
+"Non � stato possibile attivare la connessione utilizzando il protocollo "
+"richiesto {0}."
+
+#: org/postgresql/core/Oid.java:116
+#, java-format
+msgid "oid type {0} not known and not a number"
msgstr ""
-#: org/postgresql/Driver.java:290
+#: org/postgresql/util/HStoreConverter.java:43
+#: org/postgresql/util/HStoreConverter.java:74
+#: org/postgresql/jdbc/PgArray.java:210
+#: org/postgresql/jdbc/PgResultSet.java:1924
msgid ""
-"Your security policy has prevented the connection from being attempted. You "
-"probably need to grant the connect java.net.SocketPermission to the database "
-"server host and port that you wish to connect to."
+"Invalid character data was found. This is most likely caused by stored data "
+"containing characters that are invalid for the character set the database "
+"was created in. The most common example of this is storing 8bit data in a "
+"SQL_ASCII database."
msgstr ""
+"Sono stati trovati caratteri non validi tra i dati. Molto probabilmente sono "
+"stati memorizzati dei caratteri che non sono validi per la codifica dei "
+"caratteri impostata alla creazione del database. Il caso pi� diffuso � "
+"quello nel quale si memorizzano caratteri a 8bit in un database con codifica "
+"SQL_ASCII."
+
+#: org/postgresql/util/PGmoney.java:62
+msgid "Conversion of money failed."
+msgstr "Fallita la conversione di un �money�."
-#: org/postgresql/Driver.java:296 org/postgresql/Driver.java:362
+#: org/postgresql/util/StreamWrapper.java:56
+#: org/postgresql/jdbc/PgPreparedStatement.java:1449
+msgid "Object is too large to send over the protocol."
+msgstr ""
+
+#: org/postgresql/util/PGInterval.java:152
+msgid "Conversion of interval failed"
+msgstr "Fallita la conversione di un �interval�."
+
+#: org/postgresql/util/ServerErrorMessage.java:45
+#, java-format
msgid ""
-"Something unusual has occurred to cause the driver to fail. Please report "
-"this exception."
+" (pgjdbc: autodetected server-encoding to be {0}, if the message is not "
+"readable, please check database logs and/or host, port, dbname, user, "
+"password, pg_hba.conf)"
msgstr ""
-"Qualcosa di insolito si � verificato causando il fallimento del driver. Per "
-"favore riferire all''autore del driver questa eccezione."
-#: org/postgresql/Driver.java:370
-msgid "Connection attempt timed out."
-msgstr "Il tentativo di connessione � scaduto."
+#: org/postgresql/util/ServerErrorMessage.java:176
+#, java-format
+msgid "Detail: {0}"
+msgstr "Dettaglio: {0}"
-#: org/postgresql/Driver.java:383
-msgid "Interrupted while attempting to connect."
-msgstr "Si � verificata una interruzione durante il tentativo di connessione."
+#: org/postgresql/util/ServerErrorMessage.java:181
+#, java-format
+msgid "Hint: {0}"
+msgstr "Suggerimento: {0}"
-#: org/postgresql/Driver.java:645
+#: org/postgresql/util/ServerErrorMessage.java:185
#, java-format
-msgid "Method {0} is not yet implemented."
-msgstr "Il metodo �{0}� non � stato ancora implementato."
+msgid "Position: {0}"
+msgstr "Posizione: {0}"
+
+#: org/postgresql/util/ServerErrorMessage.java:189
+#, java-format
+msgid "Where: {0}"
+msgstr "Dove: {0}"
+
+#: org/postgresql/util/ServerErrorMessage.java:195
+#, java-format
+msgid "Internal Query: {0}"
+msgstr "Query interna: {0}"
+
+#: org/postgresql/util/ServerErrorMessage.java:199
+#, java-format
+msgid "Internal Position: {0}"
+msgstr "Posizione interna: {0}"
+
+#: org/postgresql/util/ServerErrorMessage.java:206
+#, java-format
+msgid "Location: File: {0}, Routine: {1}, Line: {2}"
+msgstr "Individuazione: file: \"{0}\", routine: {1}, linea: {2}"
+
+#: org/postgresql/util/ServerErrorMessage.java:211
+#, java-format
+msgid "Server SQLState: {0}"
+msgstr "SQLState del server: {0}"
+
+#: org/postgresql/ds/PGPoolingDataSource.java:269
+msgid "Failed to setup DataSource."
+msgstr ""
+
+#: org/postgresql/ds/PGPoolingDataSource.java:371
+msgid "DataSource has been closed."
+msgstr "Questo �DataSource� � stato chiuso."
-#: org/postgresql/ds/common/BaseDataSource.java:1037
-#: org/postgresql/ds/common/BaseDataSource.java:1047
+#: org/postgresql/ds/common/BaseDataSource.java:1132
+#: org/postgresql/ds/common/BaseDataSource.java:1142
#, fuzzy, java-format
msgid "Unsupported property name: {0}"
msgstr "Valore di tipo �{0}� non supportato."
@@ -518,7 +640,7 @@ msgstr "Valore di tipo
msgid "This PooledConnection has already been closed."
msgstr "Questo �PooledConnection� � stato chiuso."
-#: org/postgresql/ds/PGPooledConnection.java:313
+#: org/postgresql/ds/PGPooledConnection.java:314
msgid ""
"Connection has been closed automatically because a new connection was opened "
"for the same PooledConnection or the PooledConnection has been closed."
@@ -527,529 +649,652 @@ msgstr ""
"sostituita nello stesso �PooledConnection�, oppure il �PooledConnection� � "
"stato chiuso."
-#: org/postgresql/ds/PGPooledConnection.java:314
+#: org/postgresql/ds/PGPooledConnection.java:315
msgid "Connection has been closed."
msgstr "Questo �Connection� � stato chiuso."
-#: org/postgresql/ds/PGPooledConnection.java:418
+#: org/postgresql/ds/PGPooledConnection.java:420
msgid "Statement has been closed."
msgstr "Questo �Statement� � stato chiuso."
-#: org/postgresql/ds/PGPoolingDataSource.java:269
-msgid "Failed to setup DataSource."
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:68
+msgid "No SCRAM mechanism(s) advertised by the server"
msgstr ""
-#: org/postgresql/ds/PGPoolingDataSource.java:371
-msgid "DataSource has been closed."
-msgstr "Questo �DataSource� � stato chiuso."
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:81
+msgid "Invalid or unsupported by client SCRAM mechanisms"
+msgstr ""
-#: org/postgresql/fastpath/Fastpath.java:82
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:117
#, fuzzy, java-format
-msgid "Fastpath call {0} - No result was returned and we expected a numeric."
-msgstr ""
-"Chiamata Fastpath �{0}�: Nessun risultato restituito mentre ci si aspettava "
-"un intero."
+msgid "Invalid server-first-message: {0}"
+msgstr "La dimensione specificata, {0}, per lo �stream� non � valida."
-#: org/postgresql/fastpath/Fastpath.java:165
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:147
+#, fuzzy, java-format
+msgid "Invalid server-final-message: {0}"
+msgstr "La dimensione specificata, {0}, per lo �stream� non � valida."
+
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:153
#, java-format
-msgid "Fastpath call {0} - No result was returned and we expected an integer."
+msgid "SCRAM authentication failed, server returned error: {0}"
msgstr ""
-"Chiamata Fastpath �{0}�: Nessun risultato restituito mentre ci si aspettava "
-"un intero."
-#: org/postgresql/fastpath/Fastpath.java:174
-#, fuzzy, java-format
-msgid ""
-"Fastpath call {0} - No result was returned or wrong size while expecting an "
-"integer."
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:160
+msgid "Invalid server SCRAM signature"
msgstr ""
-"Chiamata Fastpath �{0}�: Nessun risultato restituito mentre ci si aspettava "
-"un intero."
-#: org/postgresql/fastpath/Fastpath.java:191
+#: org/postgresql/osgi/PGDataSourceFactory.java:82
#, fuzzy, java-format
-msgid "Fastpath call {0} - No result was returned and we expected a long."
+msgid "Unsupported properties: {0}"
+msgstr "Valore di tipo �{0}� non supportato."
+
+#: org/postgresql/Driver.java:214
+msgid "Error loading default settings from driverconfig.properties"
msgstr ""
-"Chiamata Fastpath �{0}�: Nessun risultato restituito mentre ci si aspettava "
-"un intero."
+"Si � verificato un errore caricando le impostazioni predefinite da "
+"�driverconfig.properties�."
-#: org/postgresql/fastpath/Fastpath.java:200
-#, fuzzy, java-format
+#: org/postgresql/Driver.java:226
+msgid "Properties for the driver contains a non-string value for the key "
+msgstr ""
+
+#: org/postgresql/Driver.java:270
msgid ""
-"Fastpath call {0} - No result was returned or wrong size while expecting a "
-"long."
+"Your security policy has prevented the connection from being attempted. You "
+"probably need to grant the connect java.net.SocketPermission to the database "
+"server host and port that you wish to connect to."
msgstr ""
-"Chiamata Fastpath �{0}�: Nessun risultato restituito mentre ci si aspettava "
-"un intero."
-#: org/postgresql/fastpath/Fastpath.java:312
+#: org/postgresql/Driver.java:276 org/postgresql/Driver.java:408
+msgid ""
+"Something unusual has occurred to cause the driver to fail. Please report "
+"this exception."
+msgstr ""
+"Qualcosa di insolito si � verificato causando il fallimento del driver. Per "
+"favore riferire all''autore del driver questa eccezione."
+
+#: org/postgresql/Driver.java:416
+msgid "Connection attempt timed out."
+msgstr "Il tentativo di connessione � scaduto."
+
+#: org/postgresql/Driver.java:429
+msgid "Interrupted while attempting to connect."
+msgstr "Si � verificata una interruzione durante il tentativo di connessione."
+
+#: org/postgresql/Driver.java:682
#, java-format
-msgid "The fastpath function {0} is unknown."
-msgstr "La funzione fastpath �{0}� � sconosciuta."
+msgid "Method {0} is not yet implemented."
+msgstr "Il metodo �{0}� non � stato ancora implementato."
-#: org/postgresql/geometric/PGbox.java:79
-#: org/postgresql/geometric/PGcircle.java:76
-#: org/postgresql/geometric/PGcircle.java:84
-#: org/postgresql/geometric/PGline.java:109
-#: org/postgresql/geometric/PGline.java:118
-#: org/postgresql/geometric/PGlseg.java:72
-#: org/postgresql/geometric/PGpoint.java:78
+#: org/postgresql/geometric/PGlseg.java:70
+#: org/postgresql/geometric/PGline.java:107
+#: org/postgresql/geometric/PGline.java:116
+#: org/postgresql/geometric/PGcircle.java:74
+#: org/postgresql/geometric/PGcircle.java:82
+#: org/postgresql/geometric/PGpoint.java:76
+#: org/postgresql/geometric/PGbox.java:77
#, java-format
msgid "Conversion to type {0} failed: {1}."
msgstr "Conversione al tipo {0} fallita: {1}."
-#: org/postgresql/geometric/PGpath.java:73
+#: org/postgresql/geometric/PGpath.java:70
#, java-format
msgid "Cannot tell if path is open or closed: {0}."
msgstr "Impossibile stabilire se il percorso � aperto o chiuso: {0}."
-#: org/postgresql/gss/GssAction.java:141 org/postgresql/gss/MakeGSS.java:69
-#: org/postgresql/gss/MakeGSS.java:77
-msgid "GSS Authentication failed"
-msgstr ""
-
-#: org/postgresql/jdbc/AbstractBlobClob.java:89
+#: org/postgresql/xa/PGXAConnection.java:128
msgid ""
-"Truncation of large objects is only implemented in 8.3 and later servers."
+"Transaction control methods setAutoCommit(true), commit, rollback and "
+"setSavePoint not allowed while an XA transaction is active."
msgstr ""
-#: org/postgresql/jdbc/AbstractBlobClob.java:94
-msgid "Cannot truncate LOB to a negative length."
-msgstr ""
+#: org/postgresql/xa/PGXAConnection.java:177
+#: org/postgresql/xa/PGXAConnection.java:253
+#: org/postgresql/xa/PGXAConnection.java:347
+#, fuzzy, java-format
+msgid "Invalid flags {0}"
+msgstr "Flag non validi"
-#: org/postgresql/jdbc/AbstractBlobClob.java:101
-#: org/postgresql/jdbc/AbstractBlobClob.java:245
-#, java-format
-msgid "PostgreSQL LOBs can only index to: {0}"
-msgstr "Il massimo valore per l''indice dei LOB di PostgreSQL � {0}. "
+#: org/postgresql/xa/PGXAConnection.java:181
+#: org/postgresql/xa/PGXAConnection.java:257
+#: org/postgresql/xa/PGXAConnection.java:449
+msgid "xid must not be null"
+msgstr "xid non pu� essere NULL"
-#: org/postgresql/jdbc/AbstractBlobClob.java:241
-msgid "LOB positioning offsets start at 1."
-msgstr "L''offset per la posizione dei LOB comincia da 1."
+#: org/postgresql/xa/PGXAConnection.java:185
+msgid "Connection is busy with another transaction"
+msgstr "La connessione � utilizzata da un''altra transazione"
-#: org/postgresql/jdbc/AbstractBlobClob.java:257
-msgid "free() was called on this LOB previously"
+#: org/postgresql/xa/PGXAConnection.java:194
+#: org/postgresql/xa/PGXAConnection.java:267
+msgid "suspend/resume not implemented"
+msgstr "�suspend�/�resume� non implementato"
+
+#: org/postgresql/xa/PGXAConnection.java:202
+#: org/postgresql/xa/PGXAConnection.java:209
+#: org/postgresql/xa/PGXAConnection.java:213
+#, java-format
+msgid ""
+"Invalid protocol state requested. Attempted transaction interleaving is not "
+"supported. xid={0}, currentXid={1}, state={2}, flags={3}"
msgstr ""
-#: org/postgresql/jdbc/BatchResultHandler.java:41
-#: org/postgresql/jdbc/PgConnection.java:474
-#: org/postgresql/jdbc/PgPreparedStatement.java:138
-#: org/postgresql/jdbc/PgStatement.java:299
-msgid "A result was returned when none was expected."
-msgstr "� stato restituito un valore nonostante non ne fosse atteso nessuno."
+#: org/postgresql/xa/PGXAConnection.java:224
+#, fuzzy
+msgid "Error disabling autocommit"
+msgstr "Errore durante il commit \"one-phase\""
-#: org/postgresql/jdbc/BatchResultHandler.java:59
-msgid "Too many update results were returned."
-msgstr "Sono stati restituiti troppi aggiornamenti."
+#: org/postgresql/xa/PGXAConnection.java:261
+#, fuzzy, java-format
+msgid ""
+"tried to call end without corresponding start call. state={0}, start "
+"xid={1}, currentXid={2}, preparedXid={3}"
+msgstr "� stata chiamata �end� senza la corrispondente chiamata a �start�"
-#: org/postgresql/jdbc/BatchResultHandler.java:88
+#: org/postgresql/xa/PGXAConnection.java:297
#, java-format
msgid ""
-"Batch entry {0} {1} was aborted. Call getNextException to see the cause."
+"Preparing already prepared transaction, the prepared xid {0}, prepare xid={1}"
msgstr ""
-"L''operazione �batch� {0} {1} � stata interrotta. Chiamare "
-"�getNextException� per scoprirne il motivo."
-#: org/postgresql/jdbc/EscapedFunctions.java:243
+#: org/postgresql/xa/PGXAConnection.java:300
#, java-format
-msgid "{0} function takes four and only four argument."
-msgstr "Il metodo �{0}� accetta quattro e solo quattro argomenti."
+msgid "Current connection does not have an associated xid. prepare xid={0}"
+msgstr ""
-#: org/postgresql/jdbc/EscapedFunctions.java:273
-#: org/postgresql/jdbc/EscapedFunctions.java:347
-#: org/postgresql/jdbc/EscapedFunctions.java:752
-#: org/postgresql/jdbc/EscapedFunctions.java:790
-#, java-format
-msgid "{0} function takes two and only two arguments."
-msgstr "Il metodo �{0}� accetta due e solo due argomenti."
+#: org/postgresql/xa/PGXAConnection.java:307
+#, fuzzy, java-format
+msgid ""
+"Not implemented: Prepare must be issued using the same connection that "
+"started the transaction. currentXid={0}, prepare xid={1}"
+msgstr ""
+"Non implementato: �Prepare� deve essere eseguito nella stessa connessione "
+"che ha iniziato la transazione."
-#: org/postgresql/jdbc/EscapedFunctions.java:291
-#: org/postgresql/jdbc/EscapedFunctions.java:329
-#: org/postgresql/jdbc/EscapedFunctions.java:449
-#: org/postgresql/jdbc/EscapedFunctions.java:464
-#: org/postgresql/jdbc/EscapedFunctions.java:479
-#: org/postgresql/jdbc/EscapedFunctions.java:494
-#: org/postgresql/jdbc/EscapedFunctions.java:509
-#: org/postgresql/jdbc/EscapedFunctions.java:524
-#: org/postgresql/jdbc/EscapedFunctions.java:539
-#: org/postgresql/jdbc/EscapedFunctions.java:554
-#: org/postgresql/jdbc/EscapedFunctions.java:569
-#: org/postgresql/jdbc/EscapedFunctions.java:584
-#: org/postgresql/jdbc/EscapedFunctions.java:599
-#: org/postgresql/jdbc/EscapedFunctions.java:614
-#: org/postgresql/jdbc/EscapedFunctions.java:778
-#, java-format
-msgid "{0} function takes one and only one argument."
-msgstr "Il metodo �{0}� accetta un ed un solo argomento."
+#: org/postgresql/xa/PGXAConnection.java:311
+#, fuzzy, java-format
+msgid "Prepare called before end. prepare xid={0}, state={1}"
+msgstr "�Prepare� invocato prima della fine"
-#: org/postgresql/jdbc/EscapedFunctions.java:313
-#: org/postgresql/jdbc/EscapedFunctions.java:394
-#, java-format
-msgid "{0} function takes two or three arguments."
-msgstr "Il metodo �{0}� accetta due o tre argomenti."
+#: org/postgresql/xa/PGXAConnection.java:331
+#, fuzzy, java-format
+msgid "Error preparing transaction. prepare xid={0}"
+msgstr "Errore nel preparare una transazione"
-#: org/postgresql/jdbc/EscapedFunctions.java:419
-#: org/postgresql/jdbc/EscapedFunctions.java:434
-#: org/postgresql/jdbc/EscapedFunctions.java:737
-#: org/postgresql/jdbc/EscapedFunctions.java:767
-#, java-format
-msgid "{0} function doesn''t take any argument."
-msgstr "Il metodo �{0}� non accetta argomenti."
+#: org/postgresql/xa/PGXAConnection.java:382
+msgid "Error during recover"
+msgstr "Errore durante il ripristino"
-#: org/postgresql/jdbc/EscapedFunctions.java:630
-#: org/postgresql/jdbc/EscapedFunctions.java:683
-#, java-format
-msgid "{0} function takes three and only three arguments."
-msgstr "Il metodo �{0}� accetta tre e solo tre argomenti."
+#: org/postgresql/xa/PGXAConnection.java:438
+#, fuzzy, java-format
+msgid ""
+"Error rolling back prepared transaction. rollback xid={0}, preparedXid={1}, "
+"currentXid={2}"
+msgstr "Errore durante il �rollback� di una transazione preparata"
-#: org/postgresql/jdbc/EscapedFunctions.java:643
-#: org/postgresql/jdbc/EscapedFunctions.java:664
-#: org/postgresql/jdbc/EscapedFunctions.java:667
-#: org/postgresql/jdbc/EscapedFunctions.java:700
-#: org/postgresql/jdbc/EscapedFunctions.java:713
-#: org/postgresql/jdbc/EscapedFunctions.java:716
+#: org/postgresql/xa/PGXAConnection.java:471
#, java-format
-msgid "Interval {0} not yet implemented"
-msgstr "L''intervallo �{0}� non � stato ancora implementato."
+msgid ""
+"One-phase commit called for xid {0} but connection was prepared with xid {1}"
+msgstr ""
-#: org/postgresql/jdbc/PgArray.java:166 org/postgresql/jdbc/PgArray.java:822
-#, java-format
-msgid "The array index is out of range: {0}"
-msgstr "Indice di colonna fuori dall''intervallo ammissibile: {0}"
+#: org/postgresql/xa/PGXAConnection.java:479
+msgid ""
+"Not implemented: one-phase commit must be issued using the same connection "
+"that was used to start it"
+msgstr ""
+"Non implementato: il commit \"one-phase\" deve essere invocato sulla stessa "
+"connessione che ha iniziato la transazione."
-#: org/postgresql/jdbc/PgArray.java:183 org/postgresql/jdbc/PgArray.java:839
+#: org/postgresql/xa/PGXAConnection.java:483
#, java-format
-msgid "The array index is out of range: {0}, number of elements: {1}."
+msgid "One-phase commit with unknown xid. commit xid={0}, currentXid={1}"
msgstr ""
-"L''indice dell''array � fuori intervallo: {0}, numero di elementi: {1}."
-#: org/postgresql/jdbc/PgArray.java:215
-#: org/postgresql/jdbc/PgResultSet.java:1885
-#: org/postgresql/util/HStoreConverter.java:38
-#: org/postgresql/util/HStoreConverter.java:69
+#: org/postgresql/xa/PGXAConnection.java:487
+#, fuzzy, java-format
+msgid "commit called before end. commit xid={0}, state={1}"
+msgstr "�Commit� � stato chiamato prima della fine"
+
+#: org/postgresql/xa/PGXAConnection.java:498
+#, fuzzy, java-format
+msgid "Error during one-phase commit. commit xid={0}"
+msgstr "Errore durante il commit \"one-phase\""
+
+#: org/postgresql/xa/PGXAConnection.java:517
+#, fuzzy
msgid ""
-"Invalid character data was found. This is most likely caused by stored data "
-"containing characters that are invalid for the character set the database "
-"was created in. The most common example of this is storing 8bit data in a "
-"SQL_ASCII database."
+"Not implemented: 2nd phase commit must be issued using an idle connection. "
+"commit xid={0}, currentXid={1}, state={2], transactionState={3}"
msgstr ""
-"Sono stati trovati caratteri non validi tra i dati. Molto probabilmente sono "
-"stati memorizzati dei caratteri che non sono validi per la codifica dei "
-"caratteri impostata alla creazione del database. Il caso pi� diffuso � "
-"quello nel quale si memorizzano caratteri a 8bit in un database con codifica "
-"SQL_ASCII."
+"Non implementato: la seconda fase del �commit� deve essere effettuata con "
+"una connessione non in uso"
-#: org/postgresql/jdbc/PgCallableStatement.java:90
-#: org/postgresql/jdbc/PgCallableStatement.java:96
-msgid "A CallableStatement was executed with nothing returned."
+#: org/postgresql/xa/PGXAConnection.java:550
+#, fuzzy, java-format
+msgid ""
+"Error committing prepared transaction. commit xid={0}, preparedXid={1}, "
+"currentXid={2}"
+msgstr "Errore durante il �rollback� di una transazione preparata"
+
+#: org/postgresql/xa/PGXAConnection.java:567
+#, fuzzy, java-format
+msgid "Heuristic commit/rollback not supported. forget xid={0}"
+msgstr "�Commit� e �rollback� euristici non sono supportati"
+
+#: org/postgresql/jdbc/PgSQLXML.java:147
+msgid "Unable to decode xml data."
msgstr ""
-"Un �CallableStatement� � stato eseguito senza produrre alcun risultato. "
-#: org/postgresql/jdbc/PgCallableStatement.java:107
+#: org/postgresql/jdbc/PgSQLXML.java:150
+#, java-format
+msgid "Unknown XML Source class: {0}"
+msgstr ""
+
+#: org/postgresql/jdbc/PgSQLXML.java:193
#, fuzzy
-msgid "A CallableStatement was executed with an invalid number of parameters"
+msgid "Unable to create SAXResult for SQLXML."
+msgstr "Fallita la creazione dell''oggetto per: {0}."
+
+#: org/postgresql/jdbc/PgSQLXML.java:208
+msgid "Unable to create StAXResult for SQLXML"
msgstr ""
-"Un �CallableStatement� � stato eseguito con un numero errato di parametri."
-#: org/postgresql/jdbc/PgCallableStatement.java:139
-#, java-format
+#: org/postgresql/jdbc/PgSQLXML.java:213
+#, fuzzy, java-format
+msgid "Unknown XML Result class: {0}"
+msgstr "Il parametro �holdability� per il �ResultSet� � sconosciuto: {0}."
+
+#: org/postgresql/jdbc/PgSQLXML.java:225
+#, fuzzy
+msgid "This SQLXML object has already been freed."
+msgstr "Questo �PooledConnection� � stato chiuso."
+
+#: org/postgresql/jdbc/PgSQLXML.java:234
msgid ""
-"A CallableStatement function was executed and the out parameter {0} was of "
-"type {1} however type {2} was registered."
+"This SQLXML object has not been initialized, so you cannot retrieve data "
+"from it."
msgstr ""
-"� stato eseguito un �CallableStatement� ma il parametro in uscita �{0}� era "
-"di tipo �{1}� al posto di �{2}�, che era stato dichiarato."
-#: org/postgresql/jdbc/PgCallableStatement.java:195
-msgid ""
-"This statement does not declare an OUT parameter. Use '{' ?= call ... '}' "
-"to declare one."
+#: org/postgresql/jdbc/PgSQLXML.java:247
+#, java-format
+msgid "Failed to convert binary xml data to encoding: {0}."
msgstr ""
-"Questo statement non dichiara il parametro in uscita. Usare �{ ?= "
-"call ... }� per farlo."
-#: org/postgresql/jdbc/PgCallableStatement.java:239
-msgid "wasNull cannot be call before fetching a result."
+#: org/postgresql/jdbc/PgSQLXML.java:273
+msgid "Unable to convert DOMResult SQLXML data to a string."
msgstr ""
-#: org/postgresql/jdbc/PgCallableStatement.java:377
-#: org/postgresql/jdbc/PgCallableStatement.java:396
-#, java-format
+#: org/postgresql/jdbc/PgSQLXML.java:287
msgid ""
-"Parameter of type {0} was registered, but call to get{1} (sqltype={2}) was "
-"made."
+"This SQLXML object has already been initialized, so you cannot manipulate it "
+"further."
msgstr ""
-"� stato definito il parametro di tipo �{0}�, ma poi � stato invocato il "
-"metodo �get{1}()� (sqltype={2})."
-#: org/postgresql/jdbc/PgCallableStatement.java:417
-msgid ""
-"A CallableStatement was declared, but no call to registerOutParameter(1, "
-"<some type>) was made."
+#: org/postgresql/jdbc/PSQLSavepoint.java:37
+#: org/postgresql/jdbc/PSQLSavepoint.java:51
+#: org/postgresql/jdbc/PSQLSavepoint.java:69
+msgid "Cannot reference a savepoint after it has been released."
msgstr ""
-"� stato definito un �CallableStatement� ma non � stato invocato il metodo "
-"�registerOutParameter(1, <tipo>)�."
+"Non � possibile utilizzare un punto di ripristino successivamente al suo "
+"rilascio."
-#: org/postgresql/jdbc/PgCallableStatement.java:423
-msgid "No function outputs were registered."
+#: org/postgresql/jdbc/PSQLSavepoint.java:42
+msgid "Cannot retrieve the id of a named savepoint."
+msgstr "Non � possibile trovare l''id del punto di ripristino indicato."
+
+#: org/postgresql/jdbc/PSQLSavepoint.java:56
+msgid "Cannot retrieve the name of an unnamed savepoint."
+msgstr "Non � possibile trovare il nome di un punto di ripristino anonimo."
+
+#: org/postgresql/jdbc/PgArray.java:157 org/postgresql/jdbc/PgArray.java:844
+#, java-format
+msgid "The array index is out of range: {0}"
+msgstr "Indice di colonna fuori dall''intervallo ammissibile: {0}"
+
+#: org/postgresql/jdbc/PgArray.java:178 org/postgresql/jdbc/PgArray.java:861
+#, java-format
+msgid "The array index is out of range: {0}, number of elements: {1}."
msgstr ""
+"L''indice dell''array � fuori intervallo: {0}, numero di elementi: {1}."
+
+#: org/postgresql/jdbc/PgParameterMetaData.java:83
+#, java-format
+msgid "The parameter index is out of range: {0}, number of parameters: {1}."
+msgstr "Il parametro indice � fuori intervallo: {0}, numero di elementi: {1}."
-#: org/postgresql/jdbc/PgCallableStatement.java:429
+#: org/postgresql/jdbc/BatchResultHandler.java:92
+msgid "Too many update results were returned."
+msgstr "Sono stati restituiti troppi aggiornamenti."
+
+#: org/postgresql/jdbc/BatchResultHandler.java:146
+#, fuzzy, java-format
msgid ""
-"Results cannot be retrieved from a CallableStatement before it is executed."
+"Batch entry {0} {1} was aborted: {2} Call getNextException to see other "
+"errors in the batch."
msgstr ""
+"L''operazione �batch� {0} {1} � stata interrotta. Chiamare "
+"�getNextException� per scoprirne il motivo."
-#: org/postgresql/jdbc/PgConnection.java:312
+#: org/postgresql/jdbc/PgConnection.java:272
#, java-format
msgid "Unsupported value for stringtype parameter: {0}"
msgstr "Il valore per il parametro di tipo string �{0}� non � supportato."
-#: org/postgresql/jdbc/PgConnection.java:457
-#: org/postgresql/jdbc/PgPreparedStatement.java:115
-#: org/postgresql/jdbc/PgStatement.java:282
-#: org/postgresql/jdbc/TypeInfoCache.java:230
-#: org/postgresql/jdbc/TypeInfoCache.java:370
-#: org/postgresql/jdbc/TypeInfoCache.java:412
+#: org/postgresql/jdbc/PgConnection.java:424
+#: org/postgresql/jdbc/PgStatement.java:225
+#: org/postgresql/jdbc/TypeInfoCache.java:226
+#: org/postgresql/jdbc/TypeInfoCache.java:371
+#: org/postgresql/jdbc/TypeInfoCache.java:411
+#: org/postgresql/jdbc/TypeInfoCache.java:484
#: org/postgresql/jdbc/TypeInfoCache.java:489
-#: org/postgresql/jdbc/TypeInfoCache.java:494
-#: org/postgresql/jdbc/TypeInfoCache.java:535
-#: org/postgresql/jdbc/TypeInfoCache.java:540
+#: org/postgresql/jdbc/TypeInfoCache.java:526
+#: org/postgresql/jdbc/TypeInfoCache.java:531
+#: org/postgresql/jdbc/PgPreparedStatement.java:119
msgid "No results were returned by the query."
msgstr "Nessun risultato � stato restituito dalla query."
-#: org/postgresql/jdbc/PgConnection.java:578
+#: org/postgresql/jdbc/PgConnection.java:441
+#: org/postgresql/jdbc/PgStatement.java:254
+msgid "A result was returned when none was expected."
+msgstr "� stato restituito un valore nonostante non ne fosse atteso nessuno."
+
+#: org/postgresql/jdbc/PgConnection.java:545
msgid "Custom type maps are not supported."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:620
+#: org/postgresql/jdbc/PgConnection.java:587
#, java-format
msgid "Failed to create object for: {0}."
msgstr "Fallita la creazione dell''oggetto per: {0}."
-#: org/postgresql/jdbc/PgConnection.java:672
+#: org/postgresql/jdbc/PgConnection.java:641
#, java-format
msgid "Unable to load the class {0} responsible for the datatype {1}"
msgstr "Non � possibile caricare la class �{0}� per gestire il tipo �{1}�."
-#: org/postgresql/jdbc/PgConnection.java:724
+#: org/postgresql/jdbc/PgConnection.java:693
msgid ""
"Cannot change transaction read-only property in the middle of a transaction."
msgstr ""
"Non � possibile modificare la propriet� �read-only� delle transazioni nel "
"mezzo di una transazione."
-#: org/postgresql/jdbc/PgConnection.java:775
+#: org/postgresql/jdbc/PgConnection.java:756
msgid "Cannot commit when autoCommit is enabled."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:786
-#: org/postgresql/jdbc/PgConnection.java:1358
-#: org/postgresql/jdbc/PgConnection.java:1395
+#: org/postgresql/jdbc/PgConnection.java:767
+#: org/postgresql/jdbc/PgConnection.java:1384
+#: org/postgresql/jdbc/PgConnection.java:1428
#, fuzzy
msgid "This connection has been closed."
msgstr "Questo �Connection� � stato chiuso."
-#: org/postgresql/jdbc/PgConnection.java:796
+#: org/postgresql/jdbc/PgConnection.java:777
msgid "Cannot rollback when autoCommit is enabled."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:870
+#: org/postgresql/jdbc/PgConnection.java:827
msgid ""
"Cannot change transaction isolation level in the middle of a transaction."
msgstr ""
"Non � possibile cambiare il livello di isolamento delle transazioni nel "
"mezzo di una transazione."
-#: org/postgresql/jdbc/PgConnection.java:876
+#: org/postgresql/jdbc/PgConnection.java:833
#, java-format
msgid "Transaction isolation level {0} not supported."
msgstr "Il livello di isolamento delle transazioni �{0}� non � supportato."
-#: org/postgresql/jdbc/PgConnection.java:921
+#: org/postgresql/jdbc/PgConnection.java:878
msgid "Finalizing a Connection that was never closed:"
msgstr "Finalizzazione di una �Connection� che non � stata chiusa."
-#: org/postgresql/jdbc/PgConnection.java:1009
+#: org/postgresql/jdbc/PgConnection.java:945
msgid "Unable to translate data into the desired encoding."
msgstr "Impossibile tradurre i dati nella codifica richiesta."
-#: org/postgresql/jdbc/PgConnection.java:1081
-#: org/postgresql/jdbc/PgResultSet.java:1782
-#: org/postgresql/jdbc/PgStatement.java:1053
+#: org/postgresql/jdbc/PgConnection.java:1008
+#: org/postgresql/jdbc/PgStatement.java:903
+#: org/postgresql/jdbc/PgResultSet.java:1817
msgid "Fetch size must be a value greater to or equal to 0."
msgstr "La dimensione dell''area di �fetch� deve essere maggiore o eguale a 0."
-#: org/postgresql/jdbc/PgConnection.java:1311
+#: org/postgresql/jdbc/PgConnection.java:1289
+#: org/postgresql/jdbc/PgConnection.java:1330
#, java-format
msgid "Unable to find server array type for provided name {0}."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:1327
+#: org/postgresql/jdbc/PgConnection.java:1312
+#, fuzzy, java-format
+msgid "Invalid elements {0}"
+msgstr "La dimensione specificata, {0}, per lo �stream� non � valida."
+
+#: org/postgresql/jdbc/PgConnection.java:1348
#, fuzzy, java-format
msgid "Invalid timeout ({0}<0)."
msgstr "La dimensione specificata, {0}, per lo �stream� non � valida."
-#: org/postgresql/jdbc/PgConnection.java:1340
+#: org/postgresql/jdbc/PgConnection.java:1372
msgid "Validating connection."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:1375
+#: org/postgresql/jdbc/PgConnection.java:1405
#, fuzzy, java-format
msgid "Failed to set ClientInfo property: {0}"
msgstr "Fallita la creazione dell''oggetto per: {0}."
-#: org/postgresql/jdbc/PgConnection.java:1383
+#: org/postgresql/jdbc/PgConnection.java:1415
#, fuzzy
msgid "ClientInfo property not supported."
msgstr "La restituzione di chiavi autogenerate non � supportata."
-#: org/postgresql/jdbc/PgConnection.java:1408
+#: org/postgresql/jdbc/PgConnection.java:1441
msgid "One ore more ClientInfo failed."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:1517
+#: org/postgresql/jdbc/PgConnection.java:1540
+#, fuzzy
+msgid "Network timeout must be a value greater than or equal to 0."
+msgstr "Il timeout relativo alle query deve essere maggiore o eguale a 0."
+
+#: org/postgresql/jdbc/PgConnection.java:1552
+msgid "Unable to set network timeout."
+msgstr ""
+
+#: org/postgresql/jdbc/PgConnection.java:1563
+msgid "Unable to get network timeout."
+msgstr ""
+
+#: org/postgresql/jdbc/PgConnection.java:1580
#, java-format
msgid "Unknown ResultSet holdability setting: {0}."
msgstr "Il parametro �holdability� per il �ResultSet� � sconosciuto: {0}."
-#: org/postgresql/jdbc/PgConnection.java:1531
-#: org/postgresql/jdbc/PgConnection.java:1554
-#: org/postgresql/jdbc/PgConnection.java:1576
-#: org/postgresql/jdbc/PgConnection.java:1587
-msgid "Server versions prior to 8.0 do not support savepoints."
-msgstr ""
-"Le versioni del server precedenti alla 8.0 non permettono i punti di "
-"ripristino."
-
-#: org/postgresql/jdbc/PgConnection.java:1535
-#: org/postgresql/jdbc/PgConnection.java:1558
+#: org/postgresql/jdbc/PgConnection.java:1598
+#: org/postgresql/jdbc/PgConnection.java:1619
msgid "Cannot establish a savepoint in auto-commit mode."
msgstr ""
"Non � possibile impostare i punti di ripristino in modalit� �auto-commit�."
-#: org/postgresql/jdbc/PgConnection.java:1635
+#: org/postgresql/jdbc/PgConnection.java:1685
msgid "Returning autogenerated keys is not supported."
msgstr "La restituzione di chiavi autogenerate non � supportata."
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:78
+#: org/postgresql/jdbc/PgStatement.java:235
+msgid "Multiple ResultSets were returned by the query."
+msgstr "La query ha restituito �ResultSet� multipli."
+
+#: org/postgresql/jdbc/PgStatement.java:316
+msgid "Can''t use executeWithFlags(int) on a Statement."
+msgstr ""
+
+#: org/postgresql/jdbc/PgStatement.java:509
+msgid "Maximum number of rows must be a value grater than or equal to 0."
+msgstr "Il numero massimo di righe deve essere maggiore o eguale a 0."
+
+#: org/postgresql/jdbc/PgStatement.java:550
+msgid "Query timeout must be a value greater than or equals to 0."
+msgstr "Il timeout relativo alle query deve essere maggiore o eguale a 0."
+
+#: org/postgresql/jdbc/PgStatement.java:590
+msgid "The maximum field size must be a value greater than or equal to 0."
+msgstr "La dimensione massima del campo deve essere maggiore o eguale a 0."
+
+#: org/postgresql/jdbc/PgStatement.java:689
+msgid "This statement has been closed."
+msgstr "Questo statement � stato chiuso."
+
+#: org/postgresql/jdbc/PgStatement.java:895
+#: org/postgresql/jdbc/PgResultSet.java:878
+#, java-format
+msgid "Invalid fetch direction constant: {0}."
+msgstr "Costante per la direzione dell''estrazione non valida: {0}."
+
+#: org/postgresql/jdbc/PgStatement.java:1145
+#: org/postgresql/jdbc/PgStatement.java:1173
+#, fuzzy
+msgid "Returning autogenerated keys by column index is not supported."
+msgstr "La restituzione di chiavi autogenerate non � supportata."
+
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:66
msgid ""
"Unable to determine a value for MaxIndexKeys due to missing system catalog "
"data."
msgstr ""
"Non � possibile trovare il valore di �MaxIndexKeys� nel catalogo si sistema."
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:100
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:89
msgid "Unable to find name datatype in the system catalogs."
msgstr "Non � possibile trovare il datatype �name� nel catalogo di sistema."
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1117
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1028
msgid "proname"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1117
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1028
msgid "oid"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1119
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1714
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1030
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1481
msgid "typtype"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1122
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1033
msgid "proargtypes"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1732
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1499
msgid "adsrc"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1872
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1963
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1512
+msgid "attidentity"
+msgstr ""
+
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1608
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1684
msgid "rolname"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1873
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1964
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1609
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1685
msgid "relacl"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1878
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1615
msgid "attacl"
msgstr ""
-#: org/postgresql/jdbc/PgParameterMetaData.java:86
+#: org/postgresql/jdbc/AbstractBlobClob.java:78
+msgid ""
+"Truncation of large objects is only implemented in 8.3 and later servers."
+msgstr ""
+
+#: org/postgresql/jdbc/AbstractBlobClob.java:83
+msgid "Cannot truncate LOB to a negative length."
+msgstr ""
+
+#: org/postgresql/jdbc/AbstractBlobClob.java:90
+#: org/postgresql/jdbc/AbstractBlobClob.java:234
#, java-format
-msgid "The parameter index is out of range: {0}, number of parameters: {1}."
-msgstr "Il parametro indice � fuori intervallo: {0}, numero di elementi: {1}."
+msgid "PostgreSQL LOBs can only index to: {0}"
+msgstr "Il massimo valore per l''indice dei LOB di PostgreSQL � {0}. "
+
+#: org/postgresql/jdbc/AbstractBlobClob.java:230
+msgid "LOB positioning offsets start at 1."
+msgstr "L''offset per la posizione dei LOB comincia da 1."
+
+#: org/postgresql/jdbc/AbstractBlobClob.java:246
+msgid "free() was called on this LOB previously"
+msgstr ""
-#: org/postgresql/jdbc/PgPreparedStatement.java:102
-#: org/postgresql/jdbc/PgPreparedStatement.java:128
-#: org/postgresql/jdbc/PgPreparedStatement.java:150
-#: org/postgresql/jdbc/PgPreparedStatement.java:1108
+#: org/postgresql/jdbc/PgPreparedStatement.java:106
+#: org/postgresql/jdbc/PgPreparedStatement.java:127
+#: org/postgresql/jdbc/PgPreparedStatement.java:139
+#: org/postgresql/jdbc/PgPreparedStatement.java:1035
msgid ""
"Can''t use query methods that take a query string on a PreparedStatement."
msgstr ""
"Non si possono utilizzare i metodi \"query\" che hanno come argomento una "
"stringa nel caso di �PreparedStatement�."
-#: org/postgresql/jdbc/PgPreparedStatement.java:119
-#: org/postgresql/jdbc/PgStatement.java:286
-msgid "Multiple ResultSets were returned by the query."
-msgstr "La query ha restituito �ResultSet� multipli."
-
-#: org/postgresql/jdbc/PgPreparedStatement.java:270
+#: org/postgresql/jdbc/PgPreparedStatement.java:249
msgid "Unknown Types value."
msgstr "Valore di tipo sconosciuto."
-#: org/postgresql/jdbc/PgPreparedStatement.java:417
-#: org/postgresql/jdbc/PgPreparedStatement.java:486
-#: org/postgresql/jdbc/PgPreparedStatement.java:1251
-#: org/postgresql/jdbc/PgPreparedStatement.java:1583
+#: org/postgresql/jdbc/PgPreparedStatement.java:382
+#: org/postgresql/jdbc/PgPreparedStatement.java:439
+#: org/postgresql/jdbc/PgPreparedStatement.java:1191
+#: org/postgresql/jdbc/PgPreparedStatement.java:1490
#, java-format
msgid "Invalid stream length {0}."
msgstr "La dimensione specificata, {0}, per lo �stream� non � valida."
-#: org/postgresql/jdbc/PgPreparedStatement.java:447
+#: org/postgresql/jdbc/PgPreparedStatement.java:411
#, java-format
msgid "The JVM claims not to support the {0} encoding."
msgstr "La JVM sostiene di non supportare la codifica {0}."
-#: org/postgresql/jdbc/PgPreparedStatement.java:450
-#: org/postgresql/jdbc/PgPreparedStatement.java:519
-#: org/postgresql/jdbc/PgResultSet.java:1075
-#: org/postgresql/jdbc/PgResultSet.java:1109
+#: org/postgresql/jdbc/PgPreparedStatement.java:414
+#: org/postgresql/jdbc/PgResultSet.java:1122
+#: org/postgresql/jdbc/PgResultSet.java:1156
msgid "Provided InputStream failed."
msgstr "L''�InputStream� fornito � fallito."
-#: org/postgresql/jdbc/PgPreparedStatement.java:536
-#: org/postgresql/jdbc/PgPreparedStatement.java:1170
+#: org/postgresql/jdbc/PgPreparedStatement.java:460
+#: org/postgresql/jdbc/PgPreparedStatement.java:1096
#, java-format
msgid "Unknown type {0}."
msgstr "Tipo sconosciuto {0}."
-#: org/postgresql/jdbc/PgPreparedStatement.java:553
+#: org/postgresql/jdbc/PgPreparedStatement.java:477
msgid "No hstore extension installed."
msgstr ""
-#: org/postgresql/jdbc/PgPreparedStatement.java:683
-#: org/postgresql/jdbc/PgPreparedStatement.java:705
-#: org/postgresql/jdbc/PgPreparedStatement.java:715
-#: org/postgresql/jdbc/PgPreparedStatement.java:725
+#: org/postgresql/jdbc/PgPreparedStatement.java:619
+#: org/postgresql/jdbc/PgPreparedStatement.java:642
+#: org/postgresql/jdbc/PgPreparedStatement.java:652
+#: org/postgresql/jdbc/PgPreparedStatement.java:664
#, java-format
msgid "Cannot cast an instance of {0} to type {1}"
msgstr "Non � possibile fare il cast di una istanza di �{0}� al tipo �{1}�."
-#: org/postgresql/jdbc/PgPreparedStatement.java:741
+#: org/postgresql/jdbc/PgPreparedStatement.java:682
#, java-format
msgid "Unsupported Types value: {0}"
msgstr "Valore di tipo �{0}� non supportato."
-#: org/postgresql/jdbc/PgPreparedStatement.java:970
+#: org/postgresql/jdbc/PgPreparedStatement.java:894
#, java-format
msgid "Cannot convert an instance of {0} to type {1}"
msgstr "Non � possibile convertire una istanza di �{0}� nel tipo �{1}�"
-#: org/postgresql/jdbc/PgPreparedStatement.java:1040
+#: org/postgresql/jdbc/PgPreparedStatement.java:968
#, java-format
msgid ""
"Can''t infer the SQL type to use for an instance of {0}. Use setObject() "
@@ -1059,23 +1304,22 @@ msgstr ""
"�{0}�. Usare �setObject()� specificando esplicitamente il tipo da usare per "
"questo valore."
-#: org/postgresql/jdbc/PgPreparedStatement.java:1207
-#: org/postgresql/jdbc/PgPreparedStatement.java:1303
-#: org/postgresql/jdbc/PgPreparedStatement.java:1340
+#: org/postgresql/jdbc/PgPreparedStatement.java:1133
+#: org/postgresql/jdbc/PgPreparedStatement.java:1233
msgid "Unexpected error writing large object to database."
msgstr "Errore inatteso inviando un �large object� al database."
-#: org/postgresql/jdbc/PgPreparedStatement.java:1278
-#: org/postgresql/jdbc/PgResultSet.java:1163
+#: org/postgresql/jdbc/PgPreparedStatement.java:1178
+#: org/postgresql/jdbc/PgResultSet.java:1210
msgid "Provided Reader failed."
msgstr "Il �Reader� fornito � fallito."
-#: org/postgresql/jdbc/PgPreparedStatement.java:1542
-#: org/postgresql/util/StreamWrapper.java:59
-msgid "Object is too large to send over the protocol."
+#: org/postgresql/jdbc/BooleanTypeUtil.java:99
+#, java-format
+msgid "Cannot cast to boolean: \"{0}\""
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:285
+#: org/postgresql/jdbc/PgResultSet.java:280
msgid ""
"Operation requires a scrollable ResultSet, but this ResultSet is "
"FORWARD_ONLY."
@@ -1083,47 +1327,37 @@ msgstr ""
"L''operazione richiete un �ResultSet� scorribile mentre questo � "
"�FORWARD_ONLY�."
-#: org/postgresql/jdbc/PgResultSet.java:456
-msgid "Unexpected error while decoding character data from a large object."
-msgstr ""
-"Errore non previsto durante la decodifica di caratteri a partire da un "
-"�large object�."
-
-#: org/postgresql/jdbc/PgResultSet.java:507
-#: org/postgresql/jdbc/PgResultSet.java:537
-#: org/postgresql/jdbc/PgResultSet.java:570
-#: org/postgresql/jdbc/PgResultSet.java:2964
+#: org/postgresql/jdbc/PgResultSet.java:492
+#: org/postgresql/jdbc/PgResultSet.java:532
+#: org/postgresql/jdbc/PgResultSet.java:556
+#: org/postgresql/jdbc/PgResultSet.java:594
+#: org/postgresql/jdbc/PgResultSet.java:624
#: org/postgresql/jdbc/PgResultSet.java:3008
+#: org/postgresql/jdbc/PgResultSet.java:3052
#, fuzzy, java-format
msgid "Cannot convert the column of type {0} to requested type {1}."
msgstr "Non � possibile convertire una istanza di �{0}� nel tipo �{1}�"
-#: org/postgresql/jdbc/PgResultSet.java:789
-#: org/postgresql/jdbc/PgResultSet.java:810
-#: org/postgresql/jdbc/PgResultSet.java:1797
+#: org/postgresql/jdbc/PgResultSet.java:838
+#: org/postgresql/jdbc/PgResultSet.java:859
+#: org/postgresql/jdbc/PgResultSet.java:1832
msgid "Can''t use relative move methods while on the insert row."
msgstr ""
"Non � possibile utilizzare gli spostamenti relativi durante l''inserimento "
"di una riga."
-#: org/postgresql/jdbc/PgResultSet.java:829
-#: org/postgresql/jdbc/PgStatement.java:1045
-#, java-format
-msgid "Invalid fetch direction constant: {0}."
-msgstr "Costante per la direzione dell''estrazione non valida: {0}."
-
-#: org/postgresql/jdbc/PgResultSet.java:840
+#: org/postgresql/jdbc/PgResultSet.java:889
msgid "Cannot call cancelRowUpdates() when on the insert row."
msgstr ""
"Non � possibile invocare �cancelRowUpdates()� durante l''inserimento di una "
"riga."
-#: org/postgresql/jdbc/PgResultSet.java:856
+#: org/postgresql/jdbc/PgResultSet.java:905
msgid "Cannot call deleteRow() when on the insert row."
msgstr ""
"Non � possibile invocare �deleteRow()� durante l''inserimento di una riga."
-#: org/postgresql/jdbc/PgResultSet.java:863
+#: org/postgresql/jdbc/PgResultSet.java:912
msgid ""
"Currently positioned before the start of the ResultSet. You cannot call "
"deleteRow() here."
@@ -1131,7 +1365,7 @@ msgstr ""
"La posizione attuale � precedente all''inizio del ResultSet. Non � possibile "
"invocare �deleteRow()� qui."
-#: org/postgresql/jdbc/PgResultSet.java:869
+#: org/postgresql/jdbc/PgResultSet.java:918
msgid ""
"Currently positioned after the end of the ResultSet. You cannot call "
"deleteRow() here."
@@ -1139,38 +1373,38 @@ msgstr ""
"La posizione attuale � successiva alla fine del ResultSet. Non � possibile "
"invocare �deleteRow()� qui."
-#: org/postgresql/jdbc/PgResultSet.java:873
+#: org/postgresql/jdbc/PgResultSet.java:922
msgid "There are no rows in this ResultSet."
msgstr "Non ci sono righe in questo �ResultSet�."
-#: org/postgresql/jdbc/PgResultSet.java:914
+#: org/postgresql/jdbc/PgResultSet.java:963
msgid "Not on the insert row."
msgstr "Non si � in una nuova riga."
-#: org/postgresql/jdbc/PgResultSet.java:916
+#: org/postgresql/jdbc/PgResultSet.java:965
msgid "You must specify at least one column value to insert a row."
msgstr ""
"Per inserire un record si deve specificare almeno il valore di una colonna."
-#: org/postgresql/jdbc/PgResultSet.java:1072
-#: org/postgresql/jdbc/PgResultSet.java:1706
-#: org/postgresql/jdbc/PgResultSet.java:2377
-#: org/postgresql/jdbc/PgResultSet.java:2402
+#: org/postgresql/jdbc/PgResultSet.java:1119
+#: org/postgresql/jdbc/PgResultSet.java:1754
+#: org/postgresql/jdbc/PgResultSet.java:2416
+#: org/postgresql/jdbc/PgResultSet.java:2437
#, java-format
msgid "The JVM claims not to support the encoding: {0}"
msgstr "La JVM sostiene di non supportare la codifica: {0}."
-#: org/postgresql/jdbc/PgResultSet.java:1214
+#: org/postgresql/jdbc/PgResultSet.java:1261
msgid "Can''t refresh the insert row."
msgstr "Non � possibile aggiornare la riga in inserimento."
-#: org/postgresql/jdbc/PgResultSet.java:1280
+#: org/postgresql/jdbc/PgResultSet.java:1328
msgid "Cannot call updateRow() when on the insert row."
msgstr ""
"Non � possibile invocare �updateRow()� durante l''inserimento di una riga."
-#: org/postgresql/jdbc/PgResultSet.java:1287
-#: org/postgresql/jdbc/PgResultSet.java:3025
+#: org/postgresql/jdbc/PgResultSet.java:1335
+#: org/postgresql/jdbc/PgResultSet.java:3069
msgid ""
"Cannot update the ResultSet because it is either before the start or after "
"the end of the results."
@@ -1178,39 +1412,39 @@ msgstr ""
"Non � possibile aggiornare il �ResultSet� perch� la posizione attuale � "
"precedente all''inizio o successiva alla file dei risultati."
-#: org/postgresql/jdbc/PgResultSet.java:1486
+#: org/postgresql/jdbc/PgResultSet.java:1535
msgid "ResultSets with concurrency CONCUR_READ_ONLY cannot be updated."
msgstr ""
"I �ResultSet� in modalit� CONCUR_READ_ONLY non possono essere aggiornati."
-#: org/postgresql/jdbc/PgResultSet.java:1555
+#: org/postgresql/jdbc/PgResultSet.java:1603
#, java-format
msgid "No primary key found for table {0}."
msgstr "Non � stata trovata la chiave primaria della tabella �{0}�."
-#: org/postgresql/jdbc/PgResultSet.java:1941
-#: org/postgresql/jdbc/PgResultSet.java:1946
-#: org/postgresql/jdbc/PgResultSet.java:1986
-#: org/postgresql/jdbc/PgResultSet.java:1992
-#: org/postgresql/jdbc/PgResultSet.java:2790
-#: org/postgresql/jdbc/PgResultSet.java:2796
-#: org/postgresql/jdbc/PgResultSet.java:2820
-#: org/postgresql/jdbc/PgResultSet.java:2825
-#: org/postgresql/jdbc/PgResultSet.java:2841
-#: org/postgresql/jdbc/PgResultSet.java:2862
-#: org/postgresql/jdbc/PgResultSet.java:2873
-#: org/postgresql/jdbc/PgResultSet.java:2886
-#: org/postgresql/jdbc/PgResultSet.java:3013
+#: org/postgresql/jdbc/PgResultSet.java:2011
+#: org/postgresql/jdbc/PgResultSet.java:2016
+#: org/postgresql/jdbc/PgResultSet.java:2803
+#: org/postgresql/jdbc/PgResultSet.java:2809
+#: org/postgresql/jdbc/PgResultSet.java:2834
+#: org/postgresql/jdbc/PgResultSet.java:2840
+#: org/postgresql/jdbc/PgResultSet.java:2864
+#: org/postgresql/jdbc/PgResultSet.java:2869
+#: org/postgresql/jdbc/PgResultSet.java:2885
+#: org/postgresql/jdbc/PgResultSet.java:2906
+#: org/postgresql/jdbc/PgResultSet.java:2917
+#: org/postgresql/jdbc/PgResultSet.java:2930
+#: org/postgresql/jdbc/PgResultSet.java:3057
#, java-format
msgid "Bad value for type {0} : {1}"
msgstr "Il valore �{1}� non � adeguato al tipo �{0}�."
-#: org/postgresql/jdbc/PgResultSet.java:2564
+#: org/postgresql/jdbc/PgResultSet.java:2589
#, java-format
msgid "The column name {0} was not found in this ResultSet."
msgstr "Colonna denominata �{0}� non � presente in questo �ResultSet�."
-#: org/postgresql/jdbc/PgResultSet.java:2689
+#: org/postgresql/jdbc/PgResultSet.java:2725
msgid ""
"ResultSet is not updateable. The query that generated this result set must "
"select only one table, and must select all primary keys from that table. See "
@@ -1221,439 +1455,332 @@ msgstr ""
"chiave primaria. Si vedano le specifiche dell''API JDBC 2.1, sezione 5.6, "
"per ulteriori dettagli."
-#: org/postgresql/jdbc/PgResultSet.java:2701
+#: org/postgresql/jdbc/PgResultSet.java:2737
msgid "This ResultSet is closed."
msgstr "Questo �ResultSet� � chiuso."
-#: org/postgresql/jdbc/PgResultSet.java:2732
+#: org/postgresql/jdbc/PgResultSet.java:2768
msgid "ResultSet not positioned properly, perhaps you need to call next."
msgstr ""
"Il �ResultSet� non � correttamente posizionato; forse � necessario invocare "
"�next()�."
-#: org/postgresql/jdbc/PgResultSet.java:3045
+#: org/postgresql/jdbc/PgResultSet.java:3089
#, fuzzy
msgid "Invalid UUID data."
msgstr "Flag non valido"
-#: org/postgresql/jdbc/PgSQLXML.java:150
-msgid "Unable to decode xml data."
-msgstr ""
+#: org/postgresql/jdbc/PgResultSet.java:3178
+#: org/postgresql/jdbc/PgResultSet.java:3185
+#: org/postgresql/jdbc/PgResultSet.java:3196
+#: org/postgresql/jdbc/PgResultSet.java:3207
+#: org/postgresql/jdbc/PgResultSet.java:3218
+#: org/postgresql/jdbc/PgResultSet.java:3229
+#: org/postgresql/jdbc/PgResultSet.java:3240
+#: org/postgresql/jdbc/PgResultSet.java:3251
+#: org/postgresql/jdbc/PgResultSet.java:3262
+#: org/postgresql/jdbc/PgResultSet.java:3269
+#: org/postgresql/jdbc/PgResultSet.java:3276
+#: org/postgresql/jdbc/PgResultSet.java:3287
+#: org/postgresql/jdbc/PgResultSet.java:3304
+#: org/postgresql/jdbc/PgResultSet.java:3311
+#: org/postgresql/jdbc/PgResultSet.java:3318
+#: org/postgresql/jdbc/PgResultSet.java:3329
+#: org/postgresql/jdbc/PgResultSet.java:3336
+#: org/postgresql/jdbc/PgResultSet.java:3343
+#: org/postgresql/jdbc/PgResultSet.java:3381
+#: org/postgresql/jdbc/PgResultSet.java:3388
+#: org/postgresql/jdbc/PgResultSet.java:3395
+#: org/postgresql/jdbc/PgResultSet.java:3415
+#: org/postgresql/jdbc/PgResultSet.java:3428
+#, fuzzy, java-format
+msgid "conversion to {0} from {1} not supported"
+msgstr "Il livello di isolamento delle transazioni �{0}� non � supportato."
-#: org/postgresql/jdbc/PgSQLXML.java:153
-#, java-format
-msgid "Unknown XML Source class: {0}"
-msgstr ""
+#: org/postgresql/jdbc/TimestampUtils.java:355
+#: org/postgresql/jdbc/TimestampUtils.java:423
+#, fuzzy, java-format
+msgid "Bad value for type timestamp/date/time: {1}"
+msgstr "Il valore �{1}� non � adeguato al tipo �{0}�."
-#: org/postgresql/jdbc/PgSQLXML.java:196
-#, fuzzy
-msgid "Unable to create SAXResult for SQLXML."
-msgstr "Fallita la creazione dell''oggetto per: {0}."
+#: org/postgresql/jdbc/TimestampUtils.java:858
+#: org/postgresql/jdbc/TimestampUtils.java:915
+#: org/postgresql/jdbc/TimestampUtils.java:961
+#: org/postgresql/jdbc/TimestampUtils.java:1010
+#, fuzzy, java-format
+msgid "Unsupported binary encoding of {0}."
+msgstr "Valore di tipo �{0}� non supportato."
-#: org/postgresql/jdbc/PgSQLXML.java:211
-msgid "Unable to create StAXResult for SQLXML"
+#: org/postgresql/jdbc/PgCallableStatement.java:86
+#: org/postgresql/jdbc/PgCallableStatement.java:96
+msgid "A CallableStatement was executed with nothing returned."
msgstr ""
+"Un �CallableStatement� � stato eseguito senza produrre alcun risultato. "
-#: org/postgresql/jdbc/PgSQLXML.java:216
-#, fuzzy, java-format
-msgid "Unknown XML Result class: {0}"
-msgstr "Il parametro �holdability� per il �ResultSet� � sconosciuto: {0}."
-
-#: org/postgresql/jdbc/PgSQLXML.java:228
+#: org/postgresql/jdbc/PgCallableStatement.java:107
#, fuzzy
-msgid "This SQLXML object has already been freed."
-msgstr "Questo �PooledConnection� � stato chiuso."
-
-#: org/postgresql/jdbc/PgSQLXML.java:237
-msgid ""
-"This SQLXML object has not been initialized, so you cannot retrieve data "
-"from it."
+msgid "A CallableStatement was executed with an invalid number of parameters"
msgstr ""
+"Un �CallableStatement� � stato eseguito con un numero errato di parametri."
-#: org/postgresql/jdbc/PgSQLXML.java:250
+#: org/postgresql/jdbc/PgCallableStatement.java:145
#, java-format
-msgid "Failed to convert binary xml data to encoding: {0}."
-msgstr ""
-
-#: org/postgresql/jdbc/PgSQLXML.java:276
-msgid "Unable to convert DOMResult SQLXML data to a string."
+msgid ""
+"A CallableStatement function was executed and the out parameter {0} was of "
+"type {1} however type {2} was registered."
msgstr ""
+"� stato eseguito un �CallableStatement� ma il parametro in uscita �{0}� era "
+"di tipo �{1}� al posto di �{2}�, che era stato dichiarato."
-#: org/postgresql/jdbc/PgSQLXML.java:290
+#: org/postgresql/jdbc/PgCallableStatement.java:202
msgid ""
-"This SQLXML object has already been initialized, so you cannot manipulate it "
-"further."
+"This statement does not declare an OUT parameter. Use '{' ?= call ... '}' "
+"to declare one."
msgstr ""
+"Questo statement non dichiara il parametro in uscita. Usare �{ ?= "
+"call ... }� per farlo."
-#: org/postgresql/jdbc/PgStatement.java:325
-msgid "Can''t use executeWithFlags(int) on a Statement."
+#: org/postgresql/jdbc/PgCallableStatement.java:246
+msgid "wasNull cannot be call before fetching a result."
msgstr ""
-#: org/postgresql/jdbc/PgStatement.java:484
-msgid "Maximum number of rows must be a value grater than or equal to 0."
-msgstr "Il numero massimo di righe deve essere maggiore o eguale a 0."
-
-#: org/postgresql/jdbc/PgStatement.java:525
-msgid "Query timeout must be a value greater than or equals to 0."
-msgstr "Il timeout relativo alle query deve essere maggiore o eguale a 0."
-
-#: org/postgresql/jdbc/PgStatement.java:561
-msgid "The maximum field size must be a value greater than or equal to 0."
-msgstr "La dimensione massima del campo deve essere maggiore o eguale a 0."
-
-#: org/postgresql/jdbc/PgStatement.java:871
-msgid "This statement has been closed."
-msgstr "Questo statement � stato chiuso."
-
-#: org/postgresql/jdbc/PgStatement.java:1148
-#, fuzzy
+#: org/postgresql/jdbc/PgCallableStatement.java:384
+#: org/postgresql/jdbc/PgCallableStatement.java:403
+#, java-format
msgid ""
-"Returning autogenerated keys is only supported for 8.2 and later servers."
-msgstr "La restituzione di chiavi autogenerate non � supportata."
-
-#: org/postgresql/jdbc/PgStatement.java:1326
-#: org/postgresql/jdbc/PgStatement.java:1357
-#, fuzzy
-msgid "Returning autogenerated keys by column index is not supported."
-msgstr "La restituzione di chiavi autogenerate non � supportata."
-
-#: org/postgresql/jdbc/PSQLSavepoint.java:40
-#: org/postgresql/jdbc/PSQLSavepoint.java:54
-#: org/postgresql/jdbc/PSQLSavepoint.java:72
-msgid "Cannot reference a savepoint after it has been released."
+"Parameter of type {0} was registered, but call to get{1} (sqltype={2}) was "
+"made."
msgstr ""
-"Non � possibile utilizzare un punto di ripristino successivamente al suo "
-"rilascio."
-
-#: org/postgresql/jdbc/PSQLSavepoint.java:45
-msgid "Cannot retrieve the id of a named savepoint."
-msgstr "Non � possibile trovare l''id del punto di ripristino indicato."
-
-#: org/postgresql/jdbc/PSQLSavepoint.java:59
-msgid "Cannot retrieve the name of an unnamed savepoint."
-msgstr "Non � possibile trovare il nome di un punto di ripristino anonimo."
-
-#: org/postgresql/jdbc/TimestampUtils.java:298
-#, fuzzy, java-format
-msgid "Bad value for type timestamp/date/time: {1}"
-msgstr "Il valore �{1}� non � adeguato al tipo �{0}�."
+"� stato definito il parametro di tipo �{0}�, ma poi � stato invocato il "
+"metodo �get{1}()� (sqltype={2})."
-#: org/postgresql/jdbc/TimestampUtils.java:359
+#: org/postgresql/jdbc/PgCallableStatement.java:424
msgid ""
-"Infinite value found for timestamp/date. This cannot be represented as time."
+"A CallableStatement was declared, but no call to registerOutParameter(1, "
+"<some type>) was made."
msgstr ""
-"Il valore specificato per il tipo �timestamp� o �date�, infinito, non pu� "
-"essere rappresentato come �time�."
-
-#: org/postgresql/jdbc/TimestampUtils.java:674
-#: org/postgresql/jdbc/TimestampUtils.java:710
-#: org/postgresql/jdbc/TimestampUtils.java:757
-#, fuzzy, java-format
-msgid "Unsupported binary encoding of {0}."
-msgstr "Valore di tipo �{0}� non supportato."
+"� stato definito un �CallableStatement� ma non � stato invocato il metodo "
+"�registerOutParameter(1, <tipo>)�."
-#: org/postgresql/largeobject/LargeObjectManager.java:147
-msgid "Failed to initialize LargeObject API"
-msgstr "Inizializzazione di LargeObject API fallita."
+#: org/postgresql/jdbc/PgCallableStatement.java:430
+msgid "No function outputs were registered."
+msgstr ""
-#: org/postgresql/largeobject/LargeObjectManager.java:265
-#: org/postgresql/largeobject/LargeObjectManager.java:308
-msgid "Large Objects may not be used in auto-commit mode."
-msgstr "Non � possibile impostare i �Large Object� in modalit� �auto-commit�."
+#: org/postgresql/jdbc/PgCallableStatement.java:436
+msgid ""
+"Results cannot be retrieved from a CallableStatement before it is executed."
+msgstr ""
-#: org/postgresql/osgi/PGDataSourceFactory.java:85
+#: org/postgresql/jdbc/PgCallableStatement.java:703
#, fuzzy, java-format
-msgid "Unsupported properties: {0}"
+msgid "Unsupported type conversion to {1}."
msgstr "Valore di tipo �{0}� non supportato."
-#: org/postgresql/PGProperty.java:450 org/postgresql/PGProperty.java:470
+#: org/postgresql/jdbc/EscapedFunctions.java:240
#, java-format
-msgid "{0} parameter value must be an integer but was: {1}"
-msgstr ""
-
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:125
-msgid ""
-"Could not find a java cryptographic algorithm: X.509 CertificateFactory not "
-"available."
-msgstr ""
+msgid "{0} function takes four and only four argument."
+msgstr "Il metodo �{0}� accetta quattro e solo quattro argomenti."
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:135
+#: org/postgresql/jdbc/EscapedFunctions.java:270
+#: org/postgresql/jdbc/EscapedFunctions.java:344
+#: org/postgresql/jdbc/EscapedFunctions.java:749
+#: org/postgresql/jdbc/EscapedFunctions.java:787
#, java-format
-msgid "Could not open SSL certificate file {0}."
-msgstr ""
+msgid "{0} function takes two and only two arguments."
+msgstr "Il metodo �{0}� accetta due e solo due argomenti."
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:140
+#: org/postgresql/jdbc/EscapedFunctions.java:288
+#: org/postgresql/jdbc/EscapedFunctions.java:326
+#: org/postgresql/jdbc/EscapedFunctions.java:446
+#: org/postgresql/jdbc/EscapedFunctions.java:461
+#: org/postgresql/jdbc/EscapedFunctions.java:476
+#: org/postgresql/jdbc/EscapedFunctions.java:491
+#: org/postgresql/jdbc/EscapedFunctions.java:506
+#: org/postgresql/jdbc/EscapedFunctions.java:521
+#: org/postgresql/jdbc/EscapedFunctions.java:536
+#: org/postgresql/jdbc/EscapedFunctions.java:551
+#: org/postgresql/jdbc/EscapedFunctions.java:566
+#: org/postgresql/jdbc/EscapedFunctions.java:581
+#: org/postgresql/jdbc/EscapedFunctions.java:596
+#: org/postgresql/jdbc/EscapedFunctions.java:611
+#: org/postgresql/jdbc/EscapedFunctions.java:775
#, java-format
-msgid "Loading the SSL certificate {0} into a KeyManager failed."
-msgstr ""
-
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:195
-msgid "Enter SSL password: "
-msgstr ""
+msgid "{0} function takes one and only one argument."
+msgstr "Il metodo �{0}� accetta un ed un solo argomento."
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:202
-msgid "Could not read password for SSL key file, console is not available."
-msgstr ""
+#: org/postgresql/jdbc/EscapedFunctions.java:310
+#: org/postgresql/jdbc/EscapedFunctions.java:391
+#, java-format
+msgid "{0} function takes two or three arguments."
+msgstr "Il metodo �{0}� accetta due o tre argomenti."
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:207
+#: org/postgresql/jdbc/EscapedFunctions.java:416
+#: org/postgresql/jdbc/EscapedFunctions.java:431
+#: org/postgresql/jdbc/EscapedFunctions.java:734
+#: org/postgresql/jdbc/EscapedFunctions.java:764
#, java-format
-msgid "Could not read password for SSL key file by callbackhandler {0}."
-msgstr ""
+msgid "{0} function doesn''t take any argument."
+msgstr "Il metodo �{0}� non accetta argomenti."
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:226
+#: org/postgresql/jdbc/EscapedFunctions.java:627
+#: org/postgresql/jdbc/EscapedFunctions.java:680
#, java-format
-msgid "Could not decrypt SSL key file {0}."
-msgstr ""
+msgid "{0} function takes three and only three arguments."
+msgstr "Il metodo �{0}� accetta tre e solo tre argomenti."
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:240
+#: org/postgresql/jdbc/EscapedFunctions.java:640
+#: org/postgresql/jdbc/EscapedFunctions.java:661
+#: org/postgresql/jdbc/EscapedFunctions.java:664
+#: org/postgresql/jdbc/EscapedFunctions.java:697
+#: org/postgresql/jdbc/EscapedFunctions.java:710
+#: org/postgresql/jdbc/EscapedFunctions.java:713
#, java-format
-msgid "Could not read SSL key file {0}."
-msgstr ""
+msgid "Interval {0} not yet implemented"
+msgstr "L''intervallo �{0}� non � stato ancora implementato."
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:243
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:162
+#: org/postgresql/PGProperty.java:535 org/postgresql/PGProperty.java:555
#, java-format
-msgid "Could not find a java cryptographic algorithm: {0}."
+msgid "{0} parameter value must be an integer but was: {1}"
msgstr ""
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:90
+#: org/postgresql/largeobject/LargeObjectManager.java:144
+msgid "Failed to initialize LargeObject API"
+msgstr "Inizializzazione di LargeObject API fallita."
+
+#: org/postgresql/largeobject/LargeObjectManager.java:262
+#: org/postgresql/largeobject/LargeObjectManager.java:305
+msgid "Large Objects may not be used in auto-commit mode."
+msgstr "Non � possibile impostare i �Large Object� in modalit� �auto-commit�."
+
+#: org/postgresql/copy/PGCopyInputStream.java:51
#, fuzzy, java-format
-msgid "The password callback class provided {0} could not be instantiated."
-msgstr ""
-"La classe �SSLSocketFactory� specificata, �{0}�, non pu� essere istanziata."
+msgid "Copying from database failed: {0}"
+msgstr "Fallita la conversione di un ``box'': {0}."
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:123
-#, java-format
-msgid "Could not open SSL root certificate file {0}."
-msgstr ""
+#: org/postgresql/copy/PGCopyInputStream.java:67
+#: org/postgresql/copy/PGCopyOutputStream.java:94
+#, fuzzy
+msgid "This copy stream is closed."
+msgstr "Questo �ResultSet� � chiuso."
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:139
-#, java-format
-msgid "Could not read SSL root certificate file {0}."
+#: org/postgresql/copy/PGCopyInputStream.java:110
+msgid "Read from copy failed."
msgstr ""
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:143
+#: org/postgresql/copy/CopyManager.java:53
#, java-format
-msgid "Loading the SSL root certificate {0} into a TrustManager failed."
+msgid "Requested CopyIn but got {0}"
msgstr ""
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:156
-msgid "Could not initialize SSL context."
+#: org/postgresql/copy/CopyManager.java:64
+#, java-format
+msgid "Requested CopyOut but got {0}"
msgstr ""
-#: org/postgresql/ssl/MakeSSL.java:52
+#: org/postgresql/copy/CopyManager.java:75
#, java-format
-msgid "The SSLSocketFactory class provided {0} could not be instantiated."
+msgid "Requested CopyDual but got {0}"
msgstr ""
-"La classe �SSLSocketFactory� specificata, �{0}�, non pu� essere istanziata."
-#: org/postgresql/ssl/MakeSSL.java:67
+#: org/postgresql/copy/PGCopyOutputStream.java:71
#, java-format
-msgid "SSL error: {0}"
+msgid "Cannot write to copy a byte of value {0}"
msgstr ""
-#: org/postgresql/ssl/MakeSSL.java:78
+#: org/postgresql/fastpath/Fastpath.java:80
#, fuzzy, java-format
-msgid "The HostnameVerifier class provided {0} could not be instantiated."
-msgstr ""
-"La classe �SSLSocketFactory� specificata, �{0}�, non pu� essere istanziata."
-
-#: org/postgresql/ssl/MakeSSL.java:84
-#, java-format
-msgid "The hostname {0} could not be verified by hostnameverifier {1}."
+msgid "Fastpath call {0} - No result was returned and we expected a numeric."
msgstr ""
+"Chiamata Fastpath �{0}�: Nessun risultato restituito mentre ci si aspettava "
+"un intero."
-#: org/postgresql/ssl/MakeSSL.java:93
+#: org/postgresql/fastpath/Fastpath.java:157
#, java-format
-msgid "The hostname {0} could not be verified."
-msgstr ""
-
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:167
-msgid "The sslfactoryarg property may not be empty."
+msgid "Fastpath call {0} - No result was returned and we expected an integer."
msgstr ""
+"Chiamata Fastpath �{0}�: Nessun risultato restituito mentre ci si aspettava "
+"un intero."
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:183
+#: org/postgresql/fastpath/Fastpath.java:165
+#, fuzzy, java-format
msgid ""
-"The environment variable containing the server's SSL certificate must not be "
-"empty."
+"Fastpath call {0} - No result was returned or wrong size while expecting an "
+"integer."
msgstr ""
+"Chiamata Fastpath �{0}�: Nessun risultato restituito mentre ci si aspettava "
+"un intero."
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:191
-msgid ""
-"The system property containing the server's SSL certificate must not be "
-"empty."
+#: org/postgresql/fastpath/Fastpath.java:182
+#, fuzzy, java-format
+msgid "Fastpath call {0} - No result was returned and we expected a long."
msgstr ""
+"Chiamata Fastpath �{0}�: Nessun risultato restituito mentre ci si aspettava "
+"un intero."
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:198
+#: org/postgresql/fastpath/Fastpath.java:190
+#, fuzzy, java-format
msgid ""
-"The sslfactoryarg property must start with the prefix file:, classpath:, "
-"env:, sys:, or -----BEGIN CERTIFICATE-----."
-msgstr ""
-
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:210
-#, fuzzy
-msgid "An error occurred reading the certificate"
-msgstr "Si � verificato un errore impostando la connessione SSL."
-
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:243
-msgid "No X509TrustManager found"
+"Fastpath call {0} - No result was returned or wrong size while expecting a "
+"long."
msgstr ""
+"Chiamata Fastpath �{0}�: Nessun risultato restituito mentre ci si aspettava "
+"un intero."
-#: org/postgresql/util/PGInterval.java:155
-msgid "Conversion of interval failed"
-msgstr "Fallita la conversione di un �interval�."
-
-#: org/postgresql/util/PGmoney.java:65
-msgid "Conversion of money failed."
-msgstr "Fallita la conversione di un �money�."
-
-#: org/postgresql/util/ServerErrorMessage.java:165
-#, java-format
-msgid "Detail: {0}"
-msgstr "Dettaglio: {0}"
-
-#: org/postgresql/util/ServerErrorMessage.java:170
-#, java-format
-msgid "Hint: {0}"
-msgstr "Suggerimento: {0}"
-
-#: org/postgresql/util/ServerErrorMessage.java:174
-#, java-format
-msgid "Position: {0}"
-msgstr "Posizione: {0}"
-
-#: org/postgresql/util/ServerErrorMessage.java:178
-#, java-format
-msgid "Where: {0}"
-msgstr "Dove: {0}"
-
-#: org/postgresql/util/ServerErrorMessage.java:184
-#, java-format
-msgid "Internal Query: {0}"
-msgstr "Query interna: {0}"
-
-#: org/postgresql/util/ServerErrorMessage.java:188
-#, java-format
-msgid "Internal Position: {0}"
-msgstr "Posizione interna: {0}"
-
-#: org/postgresql/util/ServerErrorMessage.java:195
-#, java-format
-msgid "Location: File: {0}, Routine: {1}, Line: {2}"
-msgstr "Individuazione: file: \"{0}\", routine: {1}, linea: {2}"
-
-#: org/postgresql/util/ServerErrorMessage.java:200
+#: org/postgresql/fastpath/Fastpath.java:302
#, java-format
-msgid "Server SQLState: {0}"
-msgstr "SQLState del server: {0}"
-
-#: org/postgresql/xa/PGXAConnection.java:148
-msgid ""
-"Transaction control methods setAutoCommit(true), commit, rollback and "
-"setSavePoint not allowed while an XA transaction is active."
-msgstr ""
-
-#: org/postgresql/xa/PGXAConnection.java:196
-#: org/postgresql/xa/PGXAConnection.java:265
-msgid "Invalid flags"
-msgstr "Flag non validi"
-
-#: org/postgresql/xa/PGXAConnection.java:200
-#: org/postgresql/xa/PGXAConnection.java:269
-#: org/postgresql/xa/PGXAConnection.java:437
-msgid "xid must not be null"
-msgstr "xid non pu� essere NULL"
-
-#: org/postgresql/xa/PGXAConnection.java:204
-msgid "Connection is busy with another transaction"
-msgstr "La connessione � utilizzata da un''altra transazione"
-
-#: org/postgresql/xa/PGXAConnection.java:213
-#: org/postgresql/xa/PGXAConnection.java:279
-msgid "suspend/resume not implemented"
-msgstr "�suspend�/�resume� non implementato"
+msgid "The fastpath function {0} is unknown."
+msgstr "La funzione fastpath �{0}� � sconosciuta."
-#: org/postgresql/xa/PGXAConnection.java:219
-#: org/postgresql/xa/PGXAConnection.java:224
-#: org/postgresql/xa/PGXAConnection.java:228
-msgid "Transaction interleaving not implemented"
-msgstr "L''\"interleaving\" delle transazioni �{0}� non � supportato."
+#~ msgid ""
+#~ "Connection refused. Check that the hostname and port are correct and that "
+#~ "the postmaster is accepting TCP/IP connections."
+#~ msgstr ""
+#~ "Connessione rifiutata. Controllare che il nome dell''host e la porta "
+#~ "siano corretti, e che il server (postmaster) sia in esecuzione con "
+#~ "l''opzione -i, che abilita le connessioni attraverso la rete TCP/IP."
-#: org/postgresql/xa/PGXAConnection.java:239
#, fuzzy
-msgid "Error disabling autocommit"
-msgstr "Errore durante il commit \"one-phase\""
+#~ msgid "The connection url is invalid."
+#~ msgstr "Il tentativo di connessione � fallito."
-#: org/postgresql/xa/PGXAConnection.java:273
-msgid "tried to call end without corresponding start call"
-msgstr "� stata chiamata �end� senza la corrispondente chiamata a �start�"
+#~ msgid "Connection rejected: {0}."
+#~ msgstr "Connessione rifiutata: {0}."
-#: org/postgresql/xa/PGXAConnection.java:305
-msgid ""
-"Not implemented: Prepare must be issued using the same connection that "
-"started the transaction"
-msgstr ""
-"Non implementato: �Prepare� deve essere eseguito nella stessa connessione "
-"che ha iniziato la transazione."
-
-#: org/postgresql/xa/PGXAConnection.java:309
-msgid "Prepare called before end"
-msgstr "�Prepare� invocato prima della fine"
-
-#: org/postgresql/xa/PGXAConnection.java:317
-msgid "Server versions prior to 8.1 do not support two-phase commit."
-msgstr ""
-"Le versioni del server precedenti alla 8.1 non permettono i commit \"two-"
-"phase\"."
-
-#: org/postgresql/xa/PGXAConnection.java:334
-msgid "Error preparing transaction"
-msgstr "Errore nel preparare una transazione"
-
-#: org/postgresql/xa/PGXAConnection.java:349
-msgid "Invalid flag"
-msgstr "Flag non valido"
-
-#: org/postgresql/xa/PGXAConnection.java:384
-msgid "Error during recover"
-msgstr "Errore durante il ripristino"
+#~ msgid "Backend start-up failed: {0}."
+#~ msgstr "Attivazione del backend fallita: {0}."
-#: org/postgresql/xa/PGXAConnection.java:423
-#: org/postgresql/xa/PGXAConnection.java:426
-msgid "Error rolling back prepared transaction"
-msgstr "Errore durante il �rollback� di una transazione preparata"
+#~ msgid "Server versions prior to 8.0 do not support savepoints."
+#~ msgstr ""
+#~ "Le versioni del server precedenti alla 8.0 non permettono i punti di "
+#~ "ripristino."
-#: org/postgresql/xa/PGXAConnection.java:464
-msgid ""
-"Not implemented: one-phase commit must be issued using the same connection "
-"that was used to start it"
-msgstr ""
-"Non implementato: il commit \"one-phase\" deve essere invocato sulla stessa "
-"connessione che ha iniziato la transazione."
+#~ msgid "Unexpected error while decoding character data from a large object."
+#~ msgstr ""
+#~ "Errore non previsto durante la decodifica di caratteri a partire da un "
+#~ "�large object�."
-#: org/postgresql/xa/PGXAConnection.java:468
-msgid "commit called before end"
-msgstr "�Commit� � stato chiamato prima della fine"
+#, fuzzy
+#~ msgid ""
+#~ "Returning autogenerated keys is only supported for 8.2 and later servers."
+#~ msgstr "La restituzione di chiavi autogenerate non � supportata."
-#: org/postgresql/xa/PGXAConnection.java:478
-msgid "Error during one-phase commit"
-msgstr "Errore durante il commit \"one-phase\""
+#~ msgid ""
+#~ "Infinite value found for timestamp/date. This cannot be represented as "
+#~ "time."
+#~ msgstr ""
+#~ "Il valore specificato per il tipo �timestamp� o �date�, infinito, non pu� "
+#~ "essere rappresentato come �time�."
-#: org/postgresql/xa/PGXAConnection.java:497
-msgid ""
-"Not implemented: 2nd phase commit must be issued using an idle connection"
-msgstr ""
-"Non implementato: la seconda fase del �commit� deve essere effettuata con "
-"una connessione non in uso"
+#~ msgid "Transaction interleaving not implemented"
+#~ msgstr "L''\"interleaving\" delle transazioni �{0}� non � supportato."
-#: org/postgresql/xa/PGXAConnection.java:513
-#, fuzzy
-msgid "Error committing prepared transaction"
-msgstr "Errore durante il �rollback� di una transazione preparata"
+#~ msgid "Server versions prior to 8.1 do not support two-phase commit."
+#~ msgstr ""
+#~ "Le versioni del server precedenti alla 8.1 non permettono i commit \"two-"
+#~ "phase\"."
-#: org/postgresql/xa/PGXAConnection.java:529
-msgid "Heuristic commit/rollback not supported"
-msgstr "�Commit� e �rollback� euristici non sono supportati"
+#~ msgid "Invalid flag"
+#~ msgstr "Flag non valido"
#~ msgid "The class {0} does not implement org.postgresql.util.PGobject."
#~ msgstr "La class �{0}� non implementa �org.postgresql.util.PGobject�."
diff --git a/pgjdbc/src/main/java/org/postgresql/translation/ja.po b/pgjdbc/src/main/java/org/postgresql/translation/ja.po
index 98bd4ae..bc1cd02 100644
--- a/pgjdbc/src/main/java/org/postgresql/translation/ja.po
+++ b/pgjdbc/src/main/java/org/postgresql/translation/ja.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: head-ja\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-01-07 13:37+0300\n"
+"POT-Creation-Date: 2018-03-10 23:24+0300\n"
"PO-Revision-Date: 2010-04-11 22:58+0900\n"
"Last-Translator: Hiroshi Saito <z-saito at guitar.ocn.ne.jp>\n"
"Language-Team: PostgreSQL <z-saito at guitar.ocn.ne.jp>\n"
@@ -20,401 +20,394 @@ msgstr ""
"X-Poedit-Language: Japanese\n"
"X-Poedit-Country: Japan\n"
-#: org/postgresql/copy/CopyManager.java:57
-#, java-format
-msgid "Requested CopyIn but got {0}"
-msgstr "CopyInを要求しましたが {0} を得ました。"
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:164
+msgid "The sslfactoryarg property may not be empty."
+msgstr ""
-#: org/postgresql/copy/CopyManager.java:69
-#, java-format
-msgid "Requested CopyOut but got {0}"
-msgstr "CopyOutを要求しましたが {0} を得ました。"
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:180
+msgid ""
+"The environment variable containing the server's SSL certificate must not be "
+"empty."
+msgstr ""
-#: org/postgresql/copy/PGCopyInputStream.java:54
-#, java-format
-msgid "Copying from database failed: {0}"
-msgstr "データベースからコピーに失敗しました: {0}"
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:188
+msgid ""
+"The system property containing the server's SSL certificate must not be "
+"empty."
+msgstr ""
-#: org/postgresql/copy/PGCopyInputStream.java:70
-#: org/postgresql/copy/PGCopyOutputStream.java:97
-msgid "This copy stream is closed."
-msgstr "コピー・ストリームは閉じられました。"
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:195
+msgid ""
+"The sslfactoryarg property must start with the prefix file:, classpath:, "
+"env:, sys:, or -----BEGIN CERTIFICATE-----."
+msgstr ""
-#: org/postgresql/copy/PGCopyInputStream.java:113
-msgid "Read from copy failed."
-msgstr "copyからの読み取りに失敗しました。"
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:207
+#, fuzzy
+msgid "An error occurred reading the certificate"
+msgstr "SSL接続のセットアップ中に、エラーが起こりました。"
-#: org/postgresql/copy/PGCopyOutputStream.java:74
-#, java-format
-msgid "Cannot write to copy a byte of value {0}"
-msgstr "値{0}のバイトコピーで書き込みができません。"
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:240
+msgid "No X509TrustManager found"
+msgstr ""
-#: org/postgresql/core/ConnectionFactory.java:74
-#, java-format
-msgid "A connection could not be made using the requested protocol {0}."
-msgstr "要求されたプロトコル {0} を使用して接続することができません。"
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:133
+msgid ""
+"Could not find a java cryptographic algorithm: X.509 CertificateFactory not "
+"available."
+msgstr ""
+"javaの暗号化アルゴリズムを見つけることができませんでした。X.509 "
+"CertificateFactory は利用できません。"
-#: org/postgresql/core/Oid.java:114
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:143
#, java-format
-msgid "oid type {0} not known and not a number"
-msgstr "数値でない、未知のOID型 {0} です。"
+msgid "Could not open SSL certificate file {0}."
+msgstr "SSL証明書ファイル {0} を開けませんでした。"
-#: org/postgresql/core/Parser.java:616
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:148
#, java-format
-msgid "Malformed function or procedure escape syntax at offset {0}."
-msgstr "正しくない関数または手続きは、位置 {0} で文法を逸しました。"
+msgid "Loading the SSL certificate {0} into a KeyManager failed."
+msgstr "SSL証明書 {0} のKeyManagerへの読み込みに失敗しました。"
-#: org/postgresql/core/PGStream.java:497
-#, java-format
-msgid "Premature end of input stream, expected {0} bytes, but only read {1}."
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:205
+msgid "Enter SSL password: "
+msgstr "SSLパスワード入力: "
+
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:212
+msgid "Could not read password for SSL key file, console is not available."
msgstr ""
-"早すぎた入力ストリームの終了です。{0} バイトが想定されましたが、 {1} のみが読"
-"み込まれました。"
+"SSL keyファイルのパスワードを読めませんでした。コンソールは利用できません。"
-#: org/postgresql/core/PGStream.java:538
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:217
#, java-format
-msgid "Expected an EOF from server, got: {0}"
-msgstr "サーバからの EOF が想定されましたが、{0} を得ました。"
-
-#: org/postgresql/core/SetupQueryRunner.java:90
-msgid "An unexpected result was returned by a query."
-msgstr "クエリによって想定しない結果が返されました。"
+msgid "Could not read password for SSL key file by callbackhandler {0}."
+msgstr "callbackhandler {0} で、SSL keyファイルを読めませんでした。"
-#: org/postgresql/core/UTF8Encoding.java:31
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:236
#, java-format
-msgid ""
-"Illegal UTF-8 sequence: byte {0} of {1} byte sequence is not 10xxxxxx: {2}"
-msgstr ""
-"UTF-8シーケンス違反: {1} バイトシーケンスの {0} バイト は、10xxxxxx でありま"
-"せん: {2}"
+msgid "Could not decrypt SSL key file {0}."
+msgstr "SSL keyファイル {0} を復号できませんでした。"
-#: org/postgresql/core/UTF8Encoding.java:69
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:250
#, java-format
-msgid "Illegal UTF-8 sequence: {0} bytes used to encode a {1} byte value: {2}"
-msgstr ""
-"UTF-8シーケンス違反: {0} バイトを、 {1} バイト値のエンコードに使いました: {2}"
+msgid "Could not read SSL key file {0}."
+msgstr "SSL keyファイル {0} を読めませんでした。"
-#: org/postgresql/core/UTF8Encoding.java:104
-#: org/postgresql/core/UTF8Encoding.java:131
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:253
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:176
#, java-format
-msgid "Illegal UTF-8 sequence: initial byte is {0}: {1}"
-msgstr "UTF-8シーケンス違反: 初期バイトは、{0}: {1}"
+msgid "Could not find a java cryptographic algorithm: {0}."
+msgstr "javaの暗号化アルゴリズム {0} を見つけることができませんでした。"
+
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:99
+#, fuzzy, java-format
+msgid "The password callback class provided {0} could not be instantiated."
+msgstr "提供されたpassword callbackクラス {0} は、即応しないかもしれません。"
-#: org/postgresql/core/UTF8Encoding.java:137
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:132
#, java-format
-msgid "Illegal UTF-8 sequence: final value is out of range: {0}"
-msgstr "UTF-8シーケンス違反: 最終値が範囲外です: {0}"
+msgid "Could not open SSL root certificate file {0}."
+msgstr "SSLルート証明書ファイル {0} を開けませんでした。"
-#: org/postgresql/core/UTF8Encoding.java:153
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:147
#, java-format
-msgid "Illegal UTF-8 sequence: final value is a surrogate value: {0}"
-msgstr "UTF-8シーケンス違反: 最終値がサロゲート値です: {0}"
+msgid "Could not read SSL root certificate file {0}."
+msgstr "SSLルート証明書ファイル {0} を読めませんでした。"
-#: org/postgresql/core/Utils.java:119 org/postgresql/core/Utils.java:136
-msgid "Zero bytes may not occur in string parameters."
-msgstr "ゼロ・バイトを文字列パラメータ中に含めることはできません。"
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:151
+#, java-format
+msgid "Loading the SSL root certificate {0} into a TrustManager failed."
+msgstr "SSLルート証明書 {0} のTrustManagerへの読み込みに失敗しました。"
-#: org/postgresql/core/Utils.java:146 org/postgresql/core/Utils.java:217
-msgid "No IOException expected from StringBuffer or StringBuilder"
-msgstr ""
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:170
+msgid "Could not initialize SSL context."
+msgstr "SSL contextを初期化できませんでした。"
-#: org/postgresql/core/Utils.java:206
-msgid "Zero bytes may not occur in identifiers."
-msgstr "ゼロ・バイトを識別子に含めることはできません。"
+#: org/postgresql/ssl/MakeSSL.java:52
+#, java-format
+msgid "The SSLSocketFactory class provided {0} could not be instantiated."
+msgstr "提供のSSLSocketFactoryクラス {0} は、即応しないかもしれません。"
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:72
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:87
-#, fuzzy, java-format
-msgid "Invalid sslmode value: {0}"
-msgstr "無効な sslmode 値です。{0}."
+#: org/postgresql/ssl/MakeSSL.java:67
+#, java-format
+msgid "SSL error: {0}"
+msgstr "SSL エラー: {0}"
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:87
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:111
+#: org/postgresql/ssl/MakeSSL.java:78
#, fuzzy, java-format
-msgid "Invalid targetServerType value: {0}"
-msgstr "無効な sslmode 値です。{0}."
+msgid "The HostnameVerifier class provided {0} could not be instantiated."
+msgstr "提供されたHostnameVerifierクラス {0} は、即応しないかもしれません。"
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:152
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:228
+#: org/postgresql/ssl/MakeSSL.java:84
#, java-format
-msgid "Could not find a server with specified targetServerType: {0}"
-msgstr ""
+msgid "The hostname {0} could not be verified by hostnameverifier {1}."
+msgstr "ホスト名 {0} は、hostnameverifier {1} で確認できませんでした。"
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:172
-msgid ""
-"Connection refused. Check that the hostname and port are correct and that "
-"the postmaster is accepting TCP/IP connections."
-msgstr ""
-"接続は拒絶されました。ホスト名とポート番号が正しいことと、ポストマスタがTCP/"
-"IP接続を受け入れていることを調べて下さい。"
+#: org/postgresql/ssl/MakeSSL.java:93
+#, java-format
+msgid "The hostname {0} could not be verified."
+msgstr "ホスト名 {0} は確認できませんでした。"
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:181
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:262
-msgid "The connection attempt failed."
-msgstr "接続試行は失敗しました。"
+#: org/postgresql/gss/GssAction.java:126
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2550
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2581
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2585
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2640
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2650
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2659
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:655
+msgid "Protocol error. Session setup failed."
+msgstr "プロトコルエラー。セッション設定は失敗しました。"
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:192
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:273
-#, fuzzy
-msgid "The connection url is invalid."
-msgstr "接続URLが不正です。"
+#: org/postgresql/gss/GssAction.java:137 org/postgresql/gss/MakeGSS.java:66
+#: org/postgresql/gss/MakeGSS.java:74
+msgid "GSS Authentication failed"
+msgstr "GSS認証は失敗しました。"
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:218
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:233
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:324
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:339
-msgid "The server does not support SSL."
-msgstr "サーバはSSLをサポートしていません。"
+#: org/postgresql/core/Parser.java:933
+#, java-format
+msgid "Malformed function or procedure escape syntax at offset {0}."
+msgstr "正しくない関数または手続きは、位置 {0} で文法を逸しました。"
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:249
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:355
-msgid "An error occurred while setting up the SSL connection."
-msgstr "SSL接続のセットアップ中に、エラーが起こりました。"
+#: org/postgresql/core/SocketFactoryFactory.java:41
+#, fuzzy, java-format
+msgid "The SocketFactory class provided {0} could not be instantiated."
+msgstr "提供のSSLSocketFactoryクラス {0} は、即応しないかもしれません。"
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:300
-#, java-format
-msgid "Connection rejected: {0}."
-msgstr "接続は拒絶されました: {0}."
+#: org/postgresql/core/Utils.java:93 org/postgresql/core/Utils.java:110
+msgid "Zero bytes may not occur in string parameters."
+msgstr "ゼロ・バイトを文字列パラメータ中に含めることはできません。"
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:321
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:349
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:375
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:456
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:486
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:515
-msgid ""
-"The server requested password-based authentication, but no password was "
-"provided."
+#: org/postgresql/core/Utils.java:120 org/postgresql/core/Utils.java:170
+msgid "No IOException expected from StringBuffer or StringBuilder"
msgstr ""
-"サーバはパスワード・ベースの認証を要求しましたが、いかなるパスワードも提供さ"
-"れませんでした。"
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:405
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:625
+#: org/postgresql/core/Utils.java:159
+msgid "Zero bytes may not occur in identifiers."
+msgstr "ゼロ・バイトを識別子に含めることはできません。"
+
+#: org/postgresql/core/UTF8Encoding.java:28
#, java-format
msgid ""
-"The authentication type {0} is not supported. Check that you have configured "
-"the pg_hba.conf file to include the client''s IP address or subnet, and that "
-"it is using an authentication scheme supported by the driver."
+"Illegal UTF-8 sequence: byte {0} of {1} byte sequence is not 10xxxxxx: {2}"
msgstr ""
-"認証型 {0} はサポートされません。pg_hba.confファイルの構成でクライアントのIP"
-"アドレス、サブネットが含まれているか、そしてドライバがサポートする認証機構を"
-"使っているかを調べてください。"
-
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:412
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:455
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:632
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:688
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:744
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:754
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:763
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:774
-#: org/postgresql/gss/GssAction.java:130
-msgid "Protocol error. Session setup failed."
-msgstr "プロトコルエラー。セッション設定は失敗しました。"
+"UTF-8シーケンス違反: {1} バイトシーケンスの {0} バイト は、10xxxxxx でありま"
+"せん: {2}"
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:443
-#, java-format
-msgid "Backend start-up failed: {0}."
-msgstr "バックエンドの開始に失敗しました: {0}"
-
-#: org/postgresql/core/v2/FastpathParameterList.java:63
-#: org/postgresql/core/v2/FastpathParameterList.java:89
-#: org/postgresql/core/v2/FastpathParameterList.java:100
-#: org/postgresql/core/v2/FastpathParameterList.java:111
-#: org/postgresql/core/v2/SimpleParameterList.java:70
-#: org/postgresql/core/v2/SimpleParameterList.java:94
-#: org/postgresql/core/v2/SimpleParameterList.java:105
-#: org/postgresql/core/v2/SimpleParameterList.java:116
-#: org/postgresql/core/v2/SimpleParameterList.java:127
-#: org/postgresql/core/v3/CompositeParameterList.java:36
-#: org/postgresql/core/v3/SimpleParameterList.java:53
-#: org/postgresql/core/v3/SimpleParameterList.java:64
-#: org/postgresql/jdbc/PgResultSet.java:2715
-#: org/postgresql/jdbc/PgResultSetMetaData.java:472
+#: org/postgresql/core/UTF8Encoding.java:66
#, java-format
-msgid "The column index is out of range: {0}, number of columns: {1}."
-msgstr "列インデックスは範囲外です: {0} , 列の数: {1}"
+msgid "Illegal UTF-8 sequence: {0} bytes used to encode a {1} byte value: {2}"
+msgstr ""
+"UTF-8シーケンス違反: {0} バイトを、 {1} バイト値のエンコードに使いました: {2}"
-#: org/postgresql/core/v2/FastpathParameterList.java:164
-#: org/postgresql/core/v2/SimpleParameterList.java:191
-#: org/postgresql/core/v3/SimpleParameterList.java:225
+#: org/postgresql/core/UTF8Encoding.java:102
+#: org/postgresql/core/UTF8Encoding.java:129
#, java-format
-msgid "No value specified for parameter {0}."
-msgstr "パラメータ {0} に値が設定されてません。"
+msgid "Illegal UTF-8 sequence: initial byte is {0}: {1}"
+msgstr "UTF-8シーケンス違反: 初期バイトは、{0}: {1}"
-#: org/postgresql/core/v2/QueryExecutorImpl.java:87
-#: org/postgresql/core/v2/QueryExecutorImpl.java:347
-#: org/postgresql/core/v3/QueryExecutorImpl.java:404
-#: org/postgresql/core/v3/QueryExecutorImpl.java:465
+#: org/postgresql/core/UTF8Encoding.java:135
#, java-format
-msgid "Expected command status BEGIN, got {0}."
-msgstr "BEGINコマンドステータスを想定しましたが、{0} を得ました。"
+msgid "Illegal UTF-8 sequence: final value is out of range: {0}"
+msgstr "UTF-8シーケンス違反: 最終値が範囲外です: {0}"
-#: org/postgresql/core/v2/QueryExecutorImpl.java:92
-#: org/postgresql/core/v3/QueryExecutorImpl.java:470
-#: org/postgresql/jdbc/PgResultSet.java:1731
+#: org/postgresql/core/UTF8Encoding.java:151
#, java-format
-msgid "Unexpected command status: {0}."
-msgstr "想定外のコマンドステータス: {0}"
+msgid "Illegal UTF-8 sequence: final value is a surrogate value: {0}"
+msgstr "UTF-8シーケンス違反: 最終値がサロゲート値です: {0}"
-#: org/postgresql/core/v2/QueryExecutorImpl.java:127
-#: org/postgresql/core/v2/QueryExecutorImpl.java:136
-#: org/postgresql/core/v2/QueryExecutorImpl.java:185
-#: org/postgresql/core/v2/QueryExecutorImpl.java:376
-#: org/postgresql/core/v3/QueryExecutorImpl.java:226
-#: org/postgresql/core/v3/QueryExecutorImpl.java:364
-#: org/postgresql/core/v3/QueryExecutorImpl.java:441
-#: org/postgresql/core/v3/QueryExecutorImpl.java:505
-#: org/postgresql/core/v3/QueryExecutorImpl.java:587
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2211
-#: org/postgresql/util/StreamWrapper.java:133
-#, fuzzy
-msgid "An I/O error occurred while sending to the backend."
-msgstr "バックエンドに送信中に、入出力エラーが起こりました。"
+#: org/postgresql/core/SetupQueryRunner.java:64
+msgid "An unexpected result was returned by a query."
+msgstr "クエリによって想定しない結果が返されました。"
-#: org/postgresql/core/v2/QueryExecutorImpl.java:180
-#: org/postgresql/core/v2/QueryExecutorImpl.java:235
-#: org/postgresql/core/v2/QueryExecutorImpl.java:249
-#: org/postgresql/core/v3/QueryExecutorImpl.java:582
-#: org/postgresql/core/v3/QueryExecutorImpl.java:642
+#: org/postgresql/core/PGStream.java:486
#, java-format
-msgid "Unknown Response Type {0}."
-msgstr "未知の応答型 {0} です。"
-
-#: org/postgresql/core/v2/QueryExecutorImpl.java:453
-#: org/postgresql/core/v2/QueryExecutorImpl.java:503
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1962
-msgid "Ran out of memory retrieving query results."
-msgstr "クエリの結果取得にメモリを使い果たしました。"
+msgid "Premature end of input stream, expected {0} bytes, but only read {1}."
+msgstr ""
+"早すぎた入力ストリームの終了です。{0} バイトが想定されましたが、 {1} のみが読"
+"み込まれました。"
-#: org/postgresql/core/v2/QueryExecutorImpl.java:640
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2328
+#: org/postgresql/core/PGStream.java:528
#, java-format
-msgid "Unable to interpret the update count in command completion tag: {0}."
-msgstr "コマンド完了タグの更新数を解釈することができません: {0}"
-
-#: org/postgresql/core/v2/QueryExecutorImpl.java:654
-msgid "Copy not implemented for protocol version 2"
-msgstr "プロトコルバージョン2でコピーは実装されていません。"
-
-#: org/postgresql/core/v2/SocketFactoryFactory.java:36
-#, fuzzy, java-format
-msgid "The SocketFactory class provided {0} could not be instantiated."
-msgstr "提供のSSLSocketFactoryクラス {0} は、即応しないかもしれません。"
-
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:253
-#, fuzzy, java-format
-msgid ""
-"Connection to {0} refused. Check that the hostname and port are correct and "
-"that the postmaster is accepting TCP/IP connections."
-msgstr ""
-"接続は拒絶されました。ホスト名とポート番号が正しいことと、ポストマスタがTCP/"
-"IP接続を受け入れていることを調べて下さい。"
+msgid "Expected an EOF from server, got: {0}"
+msgstr "サーバからの EOF が想定されましたが、{0} を得ました。"
-#: org/postgresql/core/v3/CopyOperationImpl.java:57
+#: org/postgresql/core/v3/CopyOperationImpl.java:54
msgid "CommandComplete expected COPY but got: "
msgstr "コマンド完了はCOPYを想定しましたが、次の結果を得ました:"
-#: org/postgresql/core/v3/QueryExecutorImpl.java:83
+#: org/postgresql/core/v3/CopyInImpl.java:47
+msgid "CopyIn copy direction can't receive data"
+msgstr ""
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:161
msgid "Tried to obtain lock while already holding it"
msgstr "すでに占有している最中のロック取得です。"
-#: org/postgresql/core/v3/QueryExecutorImpl.java:98
+#: org/postgresql/core/v3/QueryExecutorImpl.java:177
msgid "Tried to break lock on database connection"
msgstr "データベース接続のロック中断を試みます。"
-#: org/postgresql/core/v3/QueryExecutorImpl.java:115
+#: org/postgresql/core/v3/QueryExecutorImpl.java:195
msgid "Interrupted while waiting to obtain lock on database connection"
msgstr "データベース接続でロック待ちの最中に割り込みがありました。"
-#: org/postgresql/core/v3/QueryExecutorImpl.java:220
+#: org/postgresql/core/v3/QueryExecutorImpl.java:327
msgid "Unable to bind parameter values for statement."
msgstr "ステートメントのパラメータ値をバインドできません。"
-#: org/postgresql/core/v3/QueryExecutorImpl.java:689
+#: org/postgresql/core/v3/QueryExecutorImpl.java:333
+#: org/postgresql/core/v3/QueryExecutorImpl.java:485
+#: org/postgresql/core/v3/QueryExecutorImpl.java:559
+#: org/postgresql/core/v3/QueryExecutorImpl.java:602
+#: org/postgresql/core/v3/QueryExecutorImpl.java:729
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2372
+#: org/postgresql/util/StreamWrapper.java:130
+#, fuzzy
+msgid "An I/O error occurred while sending to the backend."
+msgstr "バックエンドに送信中に、入出力エラーが起こりました。"
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:534
+#: org/postgresql/core/v3/QueryExecutorImpl.java:576
+#, java-format
+msgid "Expected command status BEGIN, got {0}."
+msgstr "BEGINコマンドステータスを想定しましたが、{0} を得ました。"
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:581
+#: org/postgresql/jdbc/PgResultSet.java:1778
+#, java-format
+msgid "Unexpected command status: {0}."
+msgstr "想定外のコマンドステータス: {0}"
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:687
+#, fuzzy
+msgid "An error occurred while trying to get the socket timeout."
+msgstr "バックエンドに送信中に、入出力エラーが起こりました。"
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:722
+#: org/postgresql/core/v3/QueryExecutorImpl.java:798
+#, java-format
+msgid "Unknown Response Type {0}."
+msgstr "未知の応答型 {0} です。"
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:745
+#, fuzzy
+msgid "An error occurred while trying to reset the socket timeout."
+msgstr "バックエンドに送信中に、入出力エラーが起こりました。"
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:843
msgid "Database connection failed when starting copy"
msgstr "コピー開始時のデータベース接続に失敗しました。"
-#: org/postgresql/core/v3/QueryExecutorImpl.java:724
+#: org/postgresql/core/v3/QueryExecutorImpl.java:878
msgid "Tried to cancel an inactive copy operation"
msgstr "動作していないコピー操作の取り消しを試みました。"
-#: org/postgresql/core/v3/QueryExecutorImpl.java:765
+#: org/postgresql/core/v3/QueryExecutorImpl.java:917
msgid "Database connection failed when canceling copy operation"
msgstr "コピー操作取り消し時のデータベース接続に失敗しました。"
-#: org/postgresql/core/v3/QueryExecutorImpl.java:781
+#: org/postgresql/core/v3/QueryExecutorImpl.java:933
msgid "Missing expected error response to copy cancel request"
msgstr "コピー取り消し要求のエラー応答を想定しました。"
-#: org/postgresql/core/v3/QueryExecutorImpl.java:785
+#: org/postgresql/core/v3/QueryExecutorImpl.java:937
#, java-format
msgid "Got {0} error responses to single copy cancel request"
msgstr "単一copy取り消し要求に {0} エラー応答を得ました。"
-#: org/postgresql/core/v3/QueryExecutorImpl.java:800
+#: org/postgresql/core/v3/QueryExecutorImpl.java:952
msgid "Tried to end inactive copy"
msgstr "動作していないコピーの終了を試みました。"
-#: org/postgresql/core/v3/QueryExecutorImpl.java:815
+#: org/postgresql/core/v3/QueryExecutorImpl.java:967
msgid "Database connection failed when ending copy"
msgstr "コピー終了時のデータベース接続に失敗しました。"
-#: org/postgresql/core/v3/QueryExecutorImpl.java:833
-#: org/postgresql/core/v3/QueryExecutorImpl.java:855
+#: org/postgresql/core/v3/QueryExecutorImpl.java:985
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1005
msgid "Tried to write to an inactive copy operation"
msgstr "動作していないコピー操作で書き込みを試みました。"
-#: org/postgresql/core/v3/QueryExecutorImpl.java:848
-#: org/postgresql/core/v3/QueryExecutorImpl.java:863
+#: org/postgresql/core/v3/QueryExecutorImpl.java:998
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1013
msgid "Database connection failed when writing to copy"
msgstr "コピーへの書き込み時のデータベース接続に失敗しました。"
-#: org/postgresql/core/v3/QueryExecutorImpl.java:877
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1028
msgid "Tried to read from inactive copy"
msgstr "動作していないコピーから読み取りを試みました。"
-#: org/postgresql/core/v3/QueryExecutorImpl.java:884
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1035
msgid "Database connection failed when reading from copy"
msgstr "コピーからの読み取り時のデータベース接続に失敗しました。"
-#: org/postgresql/core/v3/QueryExecutorImpl.java:956
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1101
#, java-format
msgid "Received CommandComplete ''{0}'' without an active copy operation"
msgstr "活動中のコピー操作なしでCommandComplete ''{0}'' を受け取りました。"
-#: org/postgresql/core/v3/QueryExecutorImpl.java:983
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1126
#, java-format
msgid "Got CopyInResponse from server during an active {0}"
msgstr "活動中のサーバ {0} からCopyInResponseを得ました"
-#: org/postgresql/core/v3/QueryExecutorImpl.java:999
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1140
#, java-format
msgid "Got CopyOutResponse from server during an active {0}"
msgstr "活動中のサーバ {0} からCopyOutResponseを得ました"
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1017
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1154
+#, fuzzy, java-format
+msgid "Got CopyBothResponse from server during an active {0}"
+msgstr "活動中のサーバ {0} からCopyOutResponseを得ました"
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1170
msgid "Got CopyData without an active copy operation"
msgstr "動作中のコピー操作なしでCopyDataを得ました。"
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1021
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1174
#, java-format
msgid "Unexpected copydata from server for {0}"
msgstr "{0} のサーバからの思いがけない copydata です。"
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1061
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2037
-#, fuzzy, java-format
-msgid ""
-"The server''s client_encoding parameter was changed to {0}. The JDBC driver "
-"requires client_encoding to be UTF8 for correct operation."
-msgstr ""
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1234
+#, java-format
+msgid "Unexpected packet type during copy: {0}"
+msgstr "コピー中の想定外のパケット型です: {0}"
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1524
+#, java-format
+msgid ""
+"Bind message length {0} too long. This can be caused by very large or "
+"incorrect length specifications on InputStream parameters."
+msgstr ""
+"バインドメッセージ長 {0} は長すぎます。InputStreamパラメータにとても大きな長"
+"さ、あるいは不正確な長さが設定されている可能性があります。"
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2145
+msgid "Ran out of memory retrieving query results."
+msgstr "クエリの結果取得にメモリを使い果たしました。"
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2313
+msgid "The driver currently does not support COPY operations."
+msgstr "現在、ドライバはコピー操作をサポートしません。"
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2487
+#, fuzzy, java-format
+msgid "Unable to parse the count in command completion tag: {0}."
+msgstr "コマンド完了タグの更新数を解釈することができません: {0}"
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2603
+#, fuzzy, java-format
+msgid ""
+"The server''s client_encoding parameter was changed to {0}. The JDBC driver "
+"requires client_encoding to be UTF8 for correct operation."
+msgstr ""
"サーバのclient_encodingパラメータが {0} に変わりました。JDBCドライバは、正し"
"い操作のためclient_encodingをUNICODEにすることを要求します。"
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1069
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2045
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2611
#, java-format
msgid ""
"The server''s DateStyle parameter was changed to {0}. The JDBC driver "
@@ -423,8 +416,7 @@ msgstr ""
"サーバのDateStyleパラメータは、{0} に変わりました。JDBCドライバは、正しい操作"
"のためISOで開始するDateStyleを要求します。"
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1083
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2059
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2624
#, java-format
msgid ""
"The server''s standard_conforming_strings parameter was reported as {0}. The "
@@ -433,64 +425,194 @@ msgstr ""
"サーバのstandard_conforming_stringsパラメータは、{0}として報告されました。"
"JDBCドライバは、on または off を想定します。"
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1122
+#: org/postgresql/core/v3/SimpleParameterList.java:54
+#: org/postgresql/core/v3/SimpleParameterList.java:65
+#: org/postgresql/core/v3/CompositeParameterList.java:33
+#: org/postgresql/jdbc/PgResultSetMetaData.java:493
+#: org/postgresql/jdbc/PgResultSet.java:2751
#, java-format
-msgid "Unexpected packet type during copy: {0}"
-msgstr "コピー中の想定外のパケット型です: {0}"
+msgid "The column index is out of range: {0}, number of columns: {1}."
+msgstr "列インデックスは範囲外です: {0} , 列の数: {1}"
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1393
+#: org/postgresql/core/v3/SimpleParameterList.java:257
#, java-format
+msgid "No value specified for parameter {0}."
+msgstr "パラメータ {0} に値が設定されてません。"
+
+#: org/postgresql/core/v3/SimpleParameterList.java:431
+#, fuzzy, java-format
+msgid "Added parameters index out of range: {0}, number of columns: {1}."
+msgstr "パラメータ・インデックスは範囲外です: {0} , パラメータ数: {1}"
+
+#: org/postgresql/core/v3/replication/V3ReplicationProtocol.java:133
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:257
+msgid "The connection attempt failed."
+msgstr "接続試行は失敗しました。"
+
+#: org/postgresql/core/v3/replication/V3PGReplicationStream.java:144
+#, fuzzy, java-format
+msgid "Unexpected packet type during replication: {0}"
+msgstr "コピー中の想定外のパケット型です: {0}"
+
+#: org/postgresql/core/v3/replication/V3PGReplicationStream.java:269
+#, fuzzy
+msgid "This replication stream has been closed."
+msgstr "この接続は既に閉じられています。"
+
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:109
+#, fuzzy, java-format
+msgid "Invalid sslmode value: {0}"
+msgstr "無効な sslmode 値です。{0}."
+
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:124
+#, fuzzy, java-format
+msgid "Invalid targetServerType value: {0}"
+msgstr "無効な sslmode 値です。{0}."
+
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:246
+#, fuzzy, java-format
msgid ""
-"Bind message length {0} too long. This can be caused by very large or "
-"incorrect length specifications on InputStream parameters."
+"Connection to {0} refused. Check that the hostname and port are correct and "
+"that the postmaster is accepting TCP/IP connections."
msgstr ""
-"バインドメッセージ長 {0} は長すぎます。InputStreamパラメータにとても大きな長"
-"さ、あるいは不正確な長さが設定されている可能性があります。"
+"接続は拒絶されました。ホスト名とポート番号が正しいことと、ポストマスタがTCP/"
+"IP接続を受け入れていることを調べて下さい。"
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2131
-msgid "The driver currently does not support COPY operations."
-msgstr "現在、ドライバはコピー操作をサポートしません。"
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:272
+#, java-format
+msgid "Could not find a server with specified targetServerType: {0}"
+msgstr ""
-#: org/postgresql/Driver.java:234
-msgid "Error loading default settings from driverconfig.properties"
-msgstr "driverconfig.propertiesによる初期設定のロードエラー。"
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:366
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:379
+msgid "The server does not support SSL."
+msgstr "サーバはSSLをサポートしていません。"
-#: org/postgresql/Driver.java:247
-msgid "Properties for the driver contains a non-string value for the key "
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:393
+msgid "An error occurred while setting up the SSL connection."
+msgstr "SSL接続のセットアップ中に、エラーが起こりました。"
+
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:494
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:521
+msgid ""
+"The server requested password-based authentication, but no password was "
+"provided."
msgstr ""
+"サーバはパスワード・ベースの認証を要求しましたが、いかなるパスワードも提供さ"
+"れませんでした。"
-#: org/postgresql/Driver.java:290
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:624
msgid ""
-"Your security policy has prevented the connection from being attempted. You "
-"probably need to grant the connect java.net.SocketPermission to the database "
-"server host and port that you wish to connect to."
+"SCRAM authentication is not supported by this driver. You need JDK >= 8 and "
+"pgjdbc >= 42.2.0 (not \".jre\" vesions)"
msgstr ""
-"セキュリティ・ポリシーにより、接続試行は妨げられました。おそらく、データベー"
-"ス・サーバ・ホスト接続のためjava.net.SocketPermissionを許可する必要がありま"
-"す。"
-#: org/postgresql/Driver.java:296 org/postgresql/Driver.java:362
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:648
+#, java-format
msgid ""
-"Something unusual has occurred to cause the driver to fail. Please report "
-"this exception."
+"The authentication type {0} is not supported. Check that you have configured "
+"the pg_hba.conf file to include the client''s IP address or subnet, and that "
+"it is using an authentication scheme supported by the driver."
msgstr ""
-"ドライバの失敗を引き起こす異常が起こりました。この例外を報告して下さい。"
+"認証型 {0} はサポートされません。pg_hba.confファイルの構成でクライアントのIP"
+"アドレス、サブネットが含まれているか、そしてドライバがサポートする認証機構を"
+"使っているかを調べてください。"
-#: org/postgresql/Driver.java:370
-msgid "Connection attempt timed out."
-msgstr "接続試行がタイムアウトしました。"
+#: org/postgresql/core/ConnectionFactory.java:57
+#, java-format
+msgid "A connection could not be made using the requested protocol {0}."
+msgstr "要求されたプロトコル {0} を使用して接続することができません。"
-#: org/postgresql/Driver.java:383
-msgid "Interrupted while attempting to connect."
-msgstr "接続試行中に割り込みがありました。"
+#: org/postgresql/core/Oid.java:116
+#, java-format
+msgid "oid type {0} not known and not a number"
+msgstr "数値でない、未知のOID型 {0} です。"
+
+#: org/postgresql/util/HStoreConverter.java:43
+#: org/postgresql/util/HStoreConverter.java:74
+#: org/postgresql/jdbc/PgArray.java:210
+#: org/postgresql/jdbc/PgResultSet.java:1924
+msgid ""
+"Invalid character data was found. This is most likely caused by stored data "
+"containing characters that are invalid for the character set the database "
+"was created in. The most common example of this is storing 8bit data in a "
+"SQL_ASCII database."
+msgstr ""
+"不正な文字データが見つかりました。これは、恐らく作成されたデータベースの文字"
+"セットにとって無効である文字を含むデータが格納されたことによって引き起こされ"
+"ます。最も一般的な例は、SQL_ASCIIデータベースに保存された8bitデータ等です。"
+
+#: org/postgresql/util/PGmoney.java:62
+msgid "Conversion of money failed."
+msgstr "moneyの変換に失敗しました。"
+
+#: org/postgresql/util/StreamWrapper.java:56
+#: org/postgresql/jdbc/PgPreparedStatement.java:1449
+msgid "Object is too large to send over the protocol."
+msgstr "プロトコルで送信するにはオブジェクトが大きすぎます。"
+
+#: org/postgresql/util/PGInterval.java:152
+msgid "Conversion of interval failed"
+msgstr "intervalの変換に失敗しました。"
-#: org/postgresql/Driver.java:645
+#: org/postgresql/util/ServerErrorMessage.java:45
#, java-format
-msgid "Method {0} is not yet implemented."
-msgstr "{0} メソッドはまだ実装されていません。"
+msgid ""
+" (pgjdbc: autodetected server-encoding to be {0}, if the message is not "
+"readable, please check database logs and/or host, port, dbname, user, "
+"password, pg_hba.conf)"
+msgstr ""
+
+#: org/postgresql/util/ServerErrorMessage.java:176
+#, java-format
+msgid "Detail: {0}"
+msgstr "詳細: {0}"
+
+#: org/postgresql/util/ServerErrorMessage.java:181
+#, java-format
+msgid "Hint: {0}"
+msgstr "ヒント: {0}"
+
+#: org/postgresql/util/ServerErrorMessage.java:185
+#, java-format
+msgid "Position: {0}"
+msgstr "ポジション: {0}"
+
+#: org/postgresql/util/ServerErrorMessage.java:189
+#, java-format
+msgid "Where: {0}"
+msgstr "場所: {0}"
+
+#: org/postgresql/util/ServerErrorMessage.java:195
+#, java-format
+msgid "Internal Query: {0}"
+msgstr "インターナル・クエリ: {0}"
+
+#: org/postgresql/util/ServerErrorMessage.java:199
+#, java-format
+msgid "Internal Position: {0}"
+msgstr "インターナル・ポジション: {0}"
+
+#: org/postgresql/util/ServerErrorMessage.java:206
+#, java-format
+msgid "Location: File: {0}, Routine: {1}, Line: {2}"
+msgstr "場所: ファイル: {0}, ルーチン: {1},行: {2}"
+
+#: org/postgresql/util/ServerErrorMessage.java:211
+#, java-format
+msgid "Server SQLState: {0}"
+msgstr "サーバ SQLState: {0}"
+
+#: org/postgresql/ds/PGPoolingDataSource.java:269
+msgid "Failed to setup DataSource."
+msgstr "データソースのセットアップに失敗しました。"
+
+#: org/postgresql/ds/PGPoolingDataSource.java:371
+msgid "DataSource has been closed."
+msgstr "データソースは閉じられました。"
-#: org/postgresql/ds/common/BaseDataSource.java:1037
-#: org/postgresql/ds/common/BaseDataSource.java:1047
+#: org/postgresql/ds/common/BaseDataSource.java:1132
+#: org/postgresql/ds/common/BaseDataSource.java:1142
#, fuzzy, java-format
msgid "Unsupported property name: {0}"
msgstr "サポートされない型の値: {0}."
@@ -499,7 +621,7 @@ msgstr "サポートされない型の値: {0}."
msgid "This PooledConnection has already been closed."
msgstr "PooledConnectionは、すでに閉じられています。"
-#: org/postgresql/ds/PGPooledConnection.java:313
+#: org/postgresql/ds/PGPooledConnection.java:314
msgid ""
"Connection has been closed automatically because a new connection was opened "
"for the same PooledConnection or the PooledConnection has been closed."
@@ -507,397 +629,517 @@ msgstr ""
"同じPooledConnectionが開かれたので新しい接続は自動的に閉じられました。また"
"は、PooledConnectionは既に閉じられています。"
-#: org/postgresql/ds/PGPooledConnection.java:314
+#: org/postgresql/ds/PGPooledConnection.java:315
msgid "Connection has been closed."
msgstr "接続は閉じられました。"
-#: org/postgresql/ds/PGPooledConnection.java:418
+#: org/postgresql/ds/PGPooledConnection.java:420
msgid "Statement has been closed."
msgstr "ステートメントは閉じられました。"
-#: org/postgresql/ds/PGPoolingDataSource.java:269
-msgid "Failed to setup DataSource."
-msgstr "データソースのセットアップに失敗しました。"
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:68
+msgid "No SCRAM mechanism(s) advertised by the server"
+msgstr ""
-#: org/postgresql/ds/PGPoolingDataSource.java:371
-msgid "DataSource has been closed."
-msgstr "データソースは閉じられました。"
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:81
+msgid "Invalid or unsupported by client SCRAM mechanisms"
+msgstr ""
-#: org/postgresql/fastpath/Fastpath.java:82
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:117
#, fuzzy, java-format
-msgid "Fastpath call {0} - No result was returned and we expected a numeric."
-msgstr ""
-"Fastpath 呼び出し {0} - 整数値を想定しましたが、いかなる結果も返されませんで"
-"した。"
+msgid "Invalid server-first-message: {0}"
+msgstr "無効な sslmode 値です。{0}."
-#: org/postgresql/fastpath/Fastpath.java:165
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:147
+#, fuzzy, java-format
+msgid "Invalid server-final-message: {0}"
+msgstr "無効な sslmode 値です。{0}."
+
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:153
#, java-format
-msgid "Fastpath call {0} - No result was returned and we expected an integer."
+msgid "SCRAM authentication failed, server returned error: {0}"
msgstr ""
-"Fastpath 呼び出し {0} - 整数値を想定しましたが、いかなる結果も返されませんで"
-"した。"
-#: org/postgresql/fastpath/Fastpath.java:174
-#, fuzzy, java-format
-msgid ""
-"Fastpath call {0} - No result was returned or wrong size while expecting an "
-"integer."
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:160
+msgid "Invalid server SCRAM signature"
msgstr ""
-"Fastpath 呼び出し {0} - 整数値を想定しましたが、いかなる結果も返されませんで"
-"した。"
-#: org/postgresql/fastpath/Fastpath.java:191
+#: org/postgresql/osgi/PGDataSourceFactory.java:82
#, fuzzy, java-format
-msgid "Fastpath call {0} - No result was returned and we expected a long."
+msgid "Unsupported properties: {0}"
+msgstr "サポートされない型の値: {0}."
+
+#: org/postgresql/Driver.java:214
+msgid "Error loading default settings from driverconfig.properties"
+msgstr "driverconfig.propertiesによる初期設定のロードエラー。"
+
+#: org/postgresql/Driver.java:226
+msgid "Properties for the driver contains a non-string value for the key "
msgstr ""
-"Fastpath 呼び出し {0} - 整数値を想定しましたが、いかなる結果も返されませんで"
-"した。"
-#: org/postgresql/fastpath/Fastpath.java:200
-#, fuzzy, java-format
+#: org/postgresql/Driver.java:270
msgid ""
-"Fastpath call {0} - No result was returned or wrong size while expecting a "
-"long."
+"Your security policy has prevented the connection from being attempted. You "
+"probably need to grant the connect java.net.SocketPermission to the database "
+"server host and port that you wish to connect to."
msgstr ""
-"Fastpath 呼び出し {0} - 整数値を想定しましたが、いかなる結果も返されませんで"
-"した。"
+"セキュリティ・ポリシーにより、接続試行は妨げられました。おそらく、データベー"
+"ス・サーバ・ホスト接続のためjava.net.SocketPermissionを許可する必要がありま"
+"す。"
+
+#: org/postgresql/Driver.java:276 org/postgresql/Driver.java:408
+msgid ""
+"Something unusual has occurred to cause the driver to fail. Please report "
+"this exception."
+msgstr ""
+"ドライバの失敗を引き起こす異常が起こりました。この例外を報告して下さい。"
+
+#: org/postgresql/Driver.java:416
+msgid "Connection attempt timed out."
+msgstr "接続試行がタイムアウトしました。"
-#: org/postgresql/fastpath/Fastpath.java:312
+#: org/postgresql/Driver.java:429
+msgid "Interrupted while attempting to connect."
+msgstr "接続試行中に割り込みがありました。"
+
+#: org/postgresql/Driver.java:682
#, java-format
-msgid "The fastpath function {0} is unknown."
-msgstr "{0} は未知の fastpath 関数です。"
+msgid "Method {0} is not yet implemented."
+msgstr "{0} メソッドはまだ実装されていません。"
-#: org/postgresql/geometric/PGbox.java:79
-#: org/postgresql/geometric/PGcircle.java:76
-#: org/postgresql/geometric/PGcircle.java:84
-#: org/postgresql/geometric/PGline.java:109
-#: org/postgresql/geometric/PGline.java:118
-#: org/postgresql/geometric/PGlseg.java:72
-#: org/postgresql/geometric/PGpoint.java:78
+#: org/postgresql/geometric/PGlseg.java:70
+#: org/postgresql/geometric/PGline.java:107
+#: org/postgresql/geometric/PGline.java:116
+#: org/postgresql/geometric/PGcircle.java:74
+#: org/postgresql/geometric/PGcircle.java:82
+#: org/postgresql/geometric/PGpoint.java:76
+#: org/postgresql/geometric/PGbox.java:77
#, java-format
msgid "Conversion to type {0} failed: {1}."
msgstr "{0} への型変換は失敗しました: {1}."
-#: org/postgresql/geometric/PGpath.java:73
+#: org/postgresql/geometric/PGpath.java:70
#, java-format
msgid "Cannot tell if path is open or closed: {0}."
msgstr "path が オープンしているか、クローズしているか判別できません: {0}"
-#: org/postgresql/gss/GssAction.java:141 org/postgresql/gss/MakeGSS.java:69
-#: org/postgresql/gss/MakeGSS.java:77
-msgid "GSS Authentication failed"
-msgstr "GSS認証は失敗しました。"
-
-#: org/postgresql/jdbc/AbstractBlobClob.java:89
+#: org/postgresql/xa/PGXAConnection.java:128
msgid ""
-"Truncation of large objects is only implemented in 8.3 and later servers."
+"Transaction control methods setAutoCommit(true), commit, rollback and "
+"setSavePoint not allowed while an XA transaction is active."
msgstr ""
-"ラージオブジェクトの除去は、サーババージョンが 8.3 以上で実装されています。"
-
-#: org/postgresql/jdbc/AbstractBlobClob.java:94
-msgid "Cannot truncate LOB to a negative length."
-msgstr "負の値でLOBを削除できません。"
+"トランザクション制御メソッドである setAutoCommit(true), commit, rollback, "
+"setSavePoint は、XAトランザクションが有効では利用できません。"
-#: org/postgresql/jdbc/AbstractBlobClob.java:101
-#: org/postgresql/jdbc/AbstractBlobClob.java:245
+#: org/postgresql/xa/PGXAConnection.java:177
+#: org/postgresql/xa/PGXAConnection.java:253
+#: org/postgresql/xa/PGXAConnection.java:347
#, java-format
-msgid "PostgreSQL LOBs can only index to: {0}"
-msgstr "PostgreSQL LOB は、インデックス {0} までのみ可能です。 "
-
-#: org/postgresql/jdbc/AbstractBlobClob.java:241
-msgid "LOB positioning offsets start at 1."
-msgstr "LOB オフセット開始位置を 1 としてください。"
+msgid "Invalid flags {0}"
+msgstr "無効なフラグです。{0}"
-#: org/postgresql/jdbc/AbstractBlobClob.java:257
-msgid "free() was called on this LOB previously"
-msgstr "以前に、このLOBに対するfree() は呼ばれました。"
+#: org/postgresql/xa/PGXAConnection.java:181
+#: org/postgresql/xa/PGXAConnection.java:257
+#: org/postgresql/xa/PGXAConnection.java:449
+msgid "xid must not be null"
+msgstr "xidはnullではいけません。"
-#: org/postgresql/jdbc/BatchResultHandler.java:41
-#: org/postgresql/jdbc/PgConnection.java:474
-#: org/postgresql/jdbc/PgPreparedStatement.java:138
-#: org/postgresql/jdbc/PgStatement.java:299
-msgid "A result was returned when none was expected."
-msgstr "結果がないことを想定しましたが、結果が返されました。"
+#: org/postgresql/xa/PGXAConnection.java:185
+msgid "Connection is busy with another transaction"
+msgstr "接続は、別のトランザクションに対応中です。"
-#: org/postgresql/jdbc/BatchResultHandler.java:59
-msgid "Too many update results were returned."
-msgstr "多すぎる更新結果が返されました。"
+#: org/postgresql/xa/PGXAConnection.java:194
+#: org/postgresql/xa/PGXAConnection.java:267
+msgid "suspend/resume not implemented"
+msgstr "停止/再開 は実装されていません。"
-#: org/postgresql/jdbc/BatchResultHandler.java:88
+#: org/postgresql/xa/PGXAConnection.java:202
+#: org/postgresql/xa/PGXAConnection.java:209
+#: org/postgresql/xa/PGXAConnection.java:213
#, java-format
msgid ""
-"Batch entry {0} {1} was aborted. Call getNextException to see the cause."
+"Invalid protocol state requested. Attempted transaction interleaving is not "
+"supported. xid={0}, currentXid={1}, state={2}, flags={3}"
msgstr ""
-"バッチ投入 {0} {1} は停止しました。getNextExceptionを呼んで原因を見て下さい。"
+"Transaction interleaving は実装されていません。xid={0}, currentXid={1}, "
+"state={2}, flags={3}"
-#: org/postgresql/jdbc/EscapedFunctions.java:243
-#, java-format
-msgid "{0} function takes four and only four argument."
-msgstr "{0} 関数は、四つの引数のみを用います。"
+#: org/postgresql/xa/PGXAConnection.java:224
+msgid "Error disabling autocommit"
+msgstr "自動コミットの無効化エラー"
-#: org/postgresql/jdbc/EscapedFunctions.java:273
-#: org/postgresql/jdbc/EscapedFunctions.java:347
-#: org/postgresql/jdbc/EscapedFunctions.java:752
-#: org/postgresql/jdbc/EscapedFunctions.java:790
+#: org/postgresql/xa/PGXAConnection.java:261
#, java-format
-msgid "{0} function takes two and only two arguments."
-msgstr "{0} 関数は、二つの引数のみを用います。"
+msgid ""
+"tried to call end without corresponding start call. state={0}, start "
+"xid={1}, currentXid={2}, preparedXid={3}"
+msgstr ""
+"対応する開始呼び出しなしで、終了呼び出しました。state={0}, start xid={1}, "
+"currentXid={2}, preparedXid={3}"
-#: org/postgresql/jdbc/EscapedFunctions.java:291
-#: org/postgresql/jdbc/EscapedFunctions.java:329
-#: org/postgresql/jdbc/EscapedFunctions.java:449
-#: org/postgresql/jdbc/EscapedFunctions.java:464
-#: org/postgresql/jdbc/EscapedFunctions.java:479
-#: org/postgresql/jdbc/EscapedFunctions.java:494
-#: org/postgresql/jdbc/EscapedFunctions.java:509
-#: org/postgresql/jdbc/EscapedFunctions.java:524
-#: org/postgresql/jdbc/EscapedFunctions.java:539
-#: org/postgresql/jdbc/EscapedFunctions.java:554
-#: org/postgresql/jdbc/EscapedFunctions.java:569
-#: org/postgresql/jdbc/EscapedFunctions.java:584
-#: org/postgresql/jdbc/EscapedFunctions.java:599
-#: org/postgresql/jdbc/EscapedFunctions.java:614
-#: org/postgresql/jdbc/EscapedFunctions.java:778
-#, java-format
-msgid "{0} function takes one and only one argument."
-msgstr "{0} 関数は、単一の引数のみを用います。"
+#: org/postgresql/xa/PGXAConnection.java:297
+#, fuzzy, java-format
+msgid ""
+"Preparing already prepared transaction, the prepared xid {0}, prepare xid={1}"
+msgstr ""
+"準備トランザクションのロールバックエラー rollback xid={0}, preparedXid={1}, "
+"currentXid={2}"
-#: org/postgresql/jdbc/EscapedFunctions.java:313
-#: org/postgresql/jdbc/EscapedFunctions.java:394
+#: org/postgresql/xa/PGXAConnection.java:300
#, java-format
-msgid "{0} function takes two or three arguments."
-msgstr "{0} 関数は、二つ、または三つの引数を用います。"
+msgid "Current connection does not have an associated xid. prepare xid={0}"
+msgstr ""
-#: org/postgresql/jdbc/EscapedFunctions.java:419
-#: org/postgresql/jdbc/EscapedFunctions.java:434
-#: org/postgresql/jdbc/EscapedFunctions.java:737
-#: org/postgresql/jdbc/EscapedFunctions.java:767
+#: org/postgresql/xa/PGXAConnection.java:307
#, java-format
-msgid "{0} function doesn''t take any argument."
-msgstr "{0} 関数は、どのような引数も用いません。"
+msgid ""
+"Not implemented: Prepare must be issued using the same connection that "
+"started the transaction. currentXid={0}, prepare xid={1}"
+msgstr ""
+"実装されていません: Prepareは、トランザクションを開始したときと同じ接続で使わ"
+"なくてはなりません。currentXid={0}, prepare xid={1}"
-#: org/postgresql/jdbc/EscapedFunctions.java:630
-#: org/postgresql/jdbc/EscapedFunctions.java:683
+#: org/postgresql/xa/PGXAConnection.java:311
#, java-format
-msgid "{0} function takes three and only three arguments."
-msgstr "{0} 関数は、三つの引数のみを用います。"
+msgid "Prepare called before end. prepare xid={0}, state={1}"
+msgstr "終了前に\"Prepare\"が呼ばれました prepare xid={0}, state={1}"
-#: org/postgresql/jdbc/EscapedFunctions.java:643
-#: org/postgresql/jdbc/EscapedFunctions.java:664
-#: org/postgresql/jdbc/EscapedFunctions.java:667
-#: org/postgresql/jdbc/EscapedFunctions.java:700
-#: org/postgresql/jdbc/EscapedFunctions.java:713
-#: org/postgresql/jdbc/EscapedFunctions.java:716
+#: org/postgresql/xa/PGXAConnection.java:331
#, java-format
-msgid "Interval {0} not yet implemented"
-msgstr "間隔 {0} はまだ実装されていません。"
+msgid "Error preparing transaction. prepare xid={0}"
+msgstr "トランザクションの準備エラー。prepare xid={0}"
+
+#: org/postgresql/xa/PGXAConnection.java:382
+msgid "Error during recover"
+msgstr "回復中にエラー"
-#: org/postgresql/jdbc/PgArray.java:166 org/postgresql/jdbc/PgArray.java:822
+#: org/postgresql/xa/PGXAConnection.java:438
#, java-format
-msgid "The array index is out of range: {0}"
-msgstr "配列インデックスは、範囲外です: {0}"
+msgid ""
+"Error rolling back prepared transaction. rollback xid={0}, preparedXid={1}, "
+"currentXid={2}"
+msgstr ""
+"準備トランザクションのロールバックエラー rollback xid={0}, preparedXid={1}, "
+"currentXid={2}"
-#: org/postgresql/jdbc/PgArray.java:183 org/postgresql/jdbc/PgArray.java:839
+#: org/postgresql/xa/PGXAConnection.java:471
#, java-format
-msgid "The array index is out of range: {0}, number of elements: {1}."
-msgstr "配列インデックスは、範囲外です: {0} 、要素の数: {1}"
+msgid ""
+"One-phase commit called for xid {0} but connection was prepared with xid {1}"
+msgstr ""
-#: org/postgresql/jdbc/PgArray.java:215
-#: org/postgresql/jdbc/PgResultSet.java:1885
-#: org/postgresql/util/HStoreConverter.java:38
-#: org/postgresql/util/HStoreConverter.java:69
+#: org/postgresql/xa/PGXAConnection.java:479
msgid ""
-"Invalid character data was found. This is most likely caused by stored data "
-"containing characters that are invalid for the character set the database "
-"was created in. The most common example of this is storing 8bit data in a "
-"SQL_ASCII database."
+"Not implemented: one-phase commit must be issued using the same connection "
+"that was used to start it"
msgstr ""
-"不正な文字データが見つかりました。これは、恐らく作成されたデータベースの文字"
-"セットにとって無効である文字を含むデータが格納されたことによって引き起こされ"
-"ます。最も一般的な例は、SQL_ASCIIデータベースに保存された8bitデータ等です。"
+"実装されていません: 単一フェーズのCOMMITは、開始時と同じ接続で実行されなけれ"
+"ばなりません。"
-#: org/postgresql/jdbc/PgCallableStatement.java:90
-#: org/postgresql/jdbc/PgCallableStatement.java:96
-msgid "A CallableStatement was executed with nothing returned."
-msgstr "CallableStatementは、戻りなしで実行されました。"
+#: org/postgresql/xa/PGXAConnection.java:483
+#, java-format
+msgid "One-phase commit with unknown xid. commit xid={0}, currentXid={1}"
+msgstr ""
-#: org/postgresql/jdbc/PgCallableStatement.java:107
-msgid "A CallableStatement was executed with an invalid number of parameters"
-msgstr "CallableStatementは、不正な数のパラメータで実行されました。"
+#: org/postgresql/xa/PGXAConnection.java:487
+#, java-format
+msgid "commit called before end. commit xid={0}, state={1}"
+msgstr "終了の前に COMMIT を呼びました commit xid={0}, state={1}"
-#: org/postgresql/jdbc/PgCallableStatement.java:139
+#: org/postgresql/xa/PGXAConnection.java:498
#, java-format
+msgid "Error during one-phase commit. commit xid={0}"
+msgstr "単一フェーズのCOMMITの最中にエラー commit xid={0}"
+
+#: org/postgresql/xa/PGXAConnection.java:517
msgid ""
-"A CallableStatement function was executed and the out parameter {0} was of "
-"type {1} however type {2} was registered."
+"Not implemented: 2nd phase commit must be issued using an idle connection. "
+"commit xid={0}, currentXid={1}, state={2], transactionState={3}"
msgstr ""
-"CallableStatement機能が実行され、出力パラメータ {0} は、型 {1} でした。しか"
-"し、型 {2} が登録されました。"
+"実装されていません: 第二フェーズの COMMIT は、待機接続で使わなくてはなりませ"
+"ん。xid={0}, currentXid={1}, state={2], transactionState={3}"
-#: org/postgresql/jdbc/PgCallableStatement.java:195
+#: org/postgresql/xa/PGXAConnection.java:550
+#, java-format
msgid ""
-"This statement does not declare an OUT parameter. Use '{' ?= call ... '}' "
-"to declare one."
+"Error committing prepared transaction. commit xid={0}, preparedXid={1}, "
+"currentXid={2}"
msgstr ""
-"ステートメントは、OUTパラメータを宣言していません。'{' ?= call ... '}' を使っ"
-"て宣言して下さい。"
+"準備トランザクションのコミットエラー。commit xid={0}, preparedXid={1}, "
+"currentXid={2}"
-#: org/postgresql/jdbc/PgCallableStatement.java:239
-msgid "wasNull cannot be call before fetching a result."
-msgstr "wasNullは、結果フェッチ前に呼び出せません。"
+#: org/postgresql/xa/PGXAConnection.java:567
+#, java-format
+msgid "Heuristic commit/rollback not supported. forget xid={0}"
+msgstr "サポートされない commit/rollback が見つかりました。forget xid={0}"
+
+#: org/postgresql/jdbc/PgSQLXML.java:147
+msgid "Unable to decode xml data."
+msgstr "xmlデータを復号化できません。"
+
+#: org/postgresql/jdbc/PgSQLXML.java:150
+#, java-format
+msgid "Unknown XML Source class: {0}"
+msgstr "未知のXMLソースクラス: {0}"
+
+#: org/postgresql/jdbc/PgSQLXML.java:193
+msgid "Unable to create SAXResult for SQLXML."
+msgstr "SQLXMLに対するSAXResultを生成できません。"
+
+#: org/postgresql/jdbc/PgSQLXML.java:208
+msgid "Unable to create StAXResult for SQLXML"
+msgstr "SQLXMLに対するStAXResultを生成できません。"
-#: org/postgresql/jdbc/PgCallableStatement.java:377
-#: org/postgresql/jdbc/PgCallableStatement.java:396
+#: org/postgresql/jdbc/PgSQLXML.java:213
#, java-format
+msgid "Unknown XML Result class: {0}"
+msgstr "未知のXML結果クラス: {0}"
+
+#: org/postgresql/jdbc/PgSQLXML.java:225
+msgid "This SQLXML object has already been freed."
+msgstr "このSQLXMLオブジェクトはすでに解放されています。"
+
+#: org/postgresql/jdbc/PgSQLXML.java:234
msgid ""
-"Parameter of type {0} was registered, but call to get{1} (sqltype={2}) was "
-"made."
+"This SQLXML object has not been initialized, so you cannot retrieve data "
+"from it."
msgstr ""
-"型 {0} のパラメータが登録されましたが、get{1} (sqltype={2}) が呼び出されまし"
-"た。"
+"このSQLXMLオブジェクトは初期化されてなかったため、そこからデータを取得できま"
+"せん。"
+
+#: org/postgresql/jdbc/PgSQLXML.java:247
+#, java-format
+msgid "Failed to convert binary xml data to encoding: {0}."
+msgstr "バイナリxmlデータのエンコード: {0} への変換に失敗しました。"
+
+#: org/postgresql/jdbc/PgSQLXML.java:273
+msgid "Unable to convert DOMResult SQLXML data to a string."
+msgstr "DOMResult SQLXMLデータを文字列に変えることができません。"
-#: org/postgresql/jdbc/PgCallableStatement.java:417
+#: org/postgresql/jdbc/PgSQLXML.java:287
msgid ""
-"A CallableStatement was declared, but no call to registerOutParameter(1, "
-"<some type>) was made."
-msgstr ""
-"CallableStatementは宣言されましたが、registerOutParameter(1, <some type>) は"
-"呼び出されませんでした。"
+"This SQLXML object has already been initialized, so you cannot manipulate it "
+"further."
+msgstr "このSQLXMLオブジェクトは既に初期化されたため、これ以上操作できません。"
-#: org/postgresql/jdbc/PgCallableStatement.java:423
-msgid "No function outputs were registered."
-msgstr "関数出力は登録されませんでした。"
+#: org/postgresql/jdbc/PSQLSavepoint.java:37
+#: org/postgresql/jdbc/PSQLSavepoint.java:51
+#: org/postgresql/jdbc/PSQLSavepoint.java:69
+msgid "Cannot reference a savepoint after it has been released."
+msgstr "savepointは、解放された後で参照することはできません。"
+
+#: org/postgresql/jdbc/PSQLSavepoint.java:42
+msgid "Cannot retrieve the id of a named savepoint."
+msgstr "名前の付いたsavepointのidを取得することができません。"
+
+#: org/postgresql/jdbc/PSQLSavepoint.java:56
+msgid "Cannot retrieve the name of an unnamed savepoint."
+msgstr "名前のないsavepointの名前を取得することができません。"
+
+#: org/postgresql/jdbc/PgArray.java:157 org/postgresql/jdbc/PgArray.java:844
+#, java-format
+msgid "The array index is out of range: {0}"
+msgstr "配列インデックスは、範囲外です: {0}"
+
+#: org/postgresql/jdbc/PgArray.java:178 org/postgresql/jdbc/PgArray.java:861
+#, java-format
+msgid "The array index is out of range: {0}, number of elements: {1}."
+msgstr "配列インデックスは、範囲外です: {0} 、要素の数: {1}"
+
+#: org/postgresql/jdbc/PgParameterMetaData.java:83
+#, java-format
+msgid "The parameter index is out of range: {0}, number of parameters: {1}."
+msgstr "パラメータ・インデックスは範囲外です: {0} , パラメータ数: {1}"
+
+#: org/postgresql/jdbc/BatchResultHandler.java:92
+msgid "Too many update results were returned."
+msgstr "多すぎる更新結果が返されました。"
-#: org/postgresql/jdbc/PgCallableStatement.java:429
+#: org/postgresql/jdbc/BatchResultHandler.java:146
+#, fuzzy, java-format
msgid ""
-"Results cannot be retrieved from a CallableStatement before it is executed."
-msgstr "実行される前に、CallableStatement から結果を得ることはできません。"
+"Batch entry {0} {1} was aborted: {2} Call getNextException to see other "
+"errors in the batch."
+msgstr ""
+"バッチ投入 {0} {1} は停止しました。getNextExceptionを呼んで原因を見て下さい。"
-#: org/postgresql/jdbc/PgConnection.java:312
+#: org/postgresql/jdbc/PgConnection.java:272
#, java-format
msgid "Unsupported value for stringtype parameter: {0}"
msgstr "サポートされないstringtypeパラメータ値です: {0}"
-#: org/postgresql/jdbc/PgConnection.java:457
-#: org/postgresql/jdbc/PgPreparedStatement.java:115
-#: org/postgresql/jdbc/PgStatement.java:282
-#: org/postgresql/jdbc/TypeInfoCache.java:230
-#: org/postgresql/jdbc/TypeInfoCache.java:370
-#: org/postgresql/jdbc/TypeInfoCache.java:412
+#: org/postgresql/jdbc/PgConnection.java:424
+#: org/postgresql/jdbc/PgStatement.java:225
+#: org/postgresql/jdbc/TypeInfoCache.java:226
+#: org/postgresql/jdbc/TypeInfoCache.java:371
+#: org/postgresql/jdbc/TypeInfoCache.java:411
+#: org/postgresql/jdbc/TypeInfoCache.java:484
#: org/postgresql/jdbc/TypeInfoCache.java:489
-#: org/postgresql/jdbc/TypeInfoCache.java:494
-#: org/postgresql/jdbc/TypeInfoCache.java:535
-#: org/postgresql/jdbc/TypeInfoCache.java:540
+#: org/postgresql/jdbc/TypeInfoCache.java:526
+#: org/postgresql/jdbc/TypeInfoCache.java:531
+#: org/postgresql/jdbc/PgPreparedStatement.java:119
msgid "No results were returned by the query."
msgstr "いかなる結果も、クエリによって返されませんでした。"
-#: org/postgresql/jdbc/PgConnection.java:578
+#: org/postgresql/jdbc/PgConnection.java:441
+#: org/postgresql/jdbc/PgStatement.java:254
+msgid "A result was returned when none was expected."
+msgstr "結果がないことを想定しましたが、結果が返されました。"
+
+#: org/postgresql/jdbc/PgConnection.java:545
msgid "Custom type maps are not supported."
msgstr "カスタム型マップはサポートされません。"
-#: org/postgresql/jdbc/PgConnection.java:620
+#: org/postgresql/jdbc/PgConnection.java:587
#, java-format
msgid "Failed to create object for: {0}."
msgstr "{0} へのオブジェクト生成に失敗しました。"
-#: org/postgresql/jdbc/PgConnection.java:672
+#: org/postgresql/jdbc/PgConnection.java:641
#, java-format
msgid "Unable to load the class {0} responsible for the datatype {1}"
msgstr "データ型 {1} に対応するクラス{0} をロードできません。"
-#: org/postgresql/jdbc/PgConnection.java:724
+#: org/postgresql/jdbc/PgConnection.java:693
msgid ""
"Cannot change transaction read-only property in the middle of a transaction."
msgstr ""
"トランザクションの最中に読み出し専用プロパティを変えることはできません。"
-#: org/postgresql/jdbc/PgConnection.java:775
+#: org/postgresql/jdbc/PgConnection.java:756
msgid "Cannot commit when autoCommit is enabled."
msgstr "autoCommit有効時に、明示的なコミットはできません。"
-#: org/postgresql/jdbc/PgConnection.java:786
-#: org/postgresql/jdbc/PgConnection.java:1358
-#: org/postgresql/jdbc/PgConnection.java:1395
+#: org/postgresql/jdbc/PgConnection.java:767
+#: org/postgresql/jdbc/PgConnection.java:1384
+#: org/postgresql/jdbc/PgConnection.java:1428
msgid "This connection has been closed."
msgstr "この接続は既に閉じられています。"
-#: org/postgresql/jdbc/PgConnection.java:796
+#: org/postgresql/jdbc/PgConnection.java:777
msgid "Cannot rollback when autoCommit is enabled."
msgstr "autoCommit有効時に、明示的なロールバックはできません。"
-#: org/postgresql/jdbc/PgConnection.java:870
+#: org/postgresql/jdbc/PgConnection.java:827
msgid ""
"Cannot change transaction isolation level in the middle of a transaction."
msgstr "トランザクションの最中に隔離レベルを変えることができません。"
-#: org/postgresql/jdbc/PgConnection.java:876
+#: org/postgresql/jdbc/PgConnection.java:833
#, java-format
msgid "Transaction isolation level {0} not supported."
msgstr "トランザクション隔離レベル{0} はサポートされていません。"
-#: org/postgresql/jdbc/PgConnection.java:921
+#: org/postgresql/jdbc/PgConnection.java:878
msgid "Finalizing a Connection that was never closed:"
msgstr "接続終了で閉じられませんでした:"
-#: org/postgresql/jdbc/PgConnection.java:1009
+#: org/postgresql/jdbc/PgConnection.java:945
msgid "Unable to translate data into the desired encoding."
msgstr "望む符号化にデータを訳すことができません。"
-#: org/postgresql/jdbc/PgConnection.java:1081
-#: org/postgresql/jdbc/PgResultSet.java:1782
-#: org/postgresql/jdbc/PgStatement.java:1053
+#: org/postgresql/jdbc/PgConnection.java:1008
+#: org/postgresql/jdbc/PgStatement.java:903
+#: org/postgresql/jdbc/PgResultSet.java:1817
msgid "Fetch size must be a value greater to or equal to 0."
msgstr "フェッチサイズは、0に等しいか、より大きな値でなくてはなりません。"
-#: org/postgresql/jdbc/PgConnection.java:1311
+#: org/postgresql/jdbc/PgConnection.java:1289
+#: org/postgresql/jdbc/PgConnection.java:1330
#, java-format
msgid "Unable to find server array type for provided name {0}."
msgstr "提供名 {0} で、サーバの配列型を見つけることができません。"
-#: org/postgresql/jdbc/PgConnection.java:1327
+#: org/postgresql/jdbc/PgConnection.java:1312
+#, fuzzy, java-format
+msgid "Invalid elements {0}"
+msgstr "無効なフラグです。{0}"
+
+#: org/postgresql/jdbc/PgConnection.java:1348
#, fuzzy, java-format
msgid "Invalid timeout ({0}<0)."
msgstr "無効なタイムアウト値です ({0}<0)。"
-#: org/postgresql/jdbc/PgConnection.java:1340
+#: org/postgresql/jdbc/PgConnection.java:1372
msgid "Validating connection."
msgstr "有効確認の接続"
-#: org/postgresql/jdbc/PgConnection.java:1375
+#: org/postgresql/jdbc/PgConnection.java:1405
#, fuzzy, java-format
msgid "Failed to set ClientInfo property: {0}"
msgstr "ClientInfo プロパティ:{0} の設定に失敗しました。"
-#: org/postgresql/jdbc/PgConnection.java:1383
+#: org/postgresql/jdbc/PgConnection.java:1415
msgid "ClientInfo property not supported."
msgstr "ClientInfo プロパティはサポートされていません。"
-#: org/postgresql/jdbc/PgConnection.java:1408
+#: org/postgresql/jdbc/PgConnection.java:1441
msgid "One ore more ClientInfo failed."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:1517
+#: org/postgresql/jdbc/PgConnection.java:1540
+#, fuzzy
+msgid "Network timeout must be a value greater than or equal to 0."
+msgstr "クエリタイムアウトは、0に等しいか、より大きな値でなくてはなりません。"
+
+#: org/postgresql/jdbc/PgConnection.java:1552
+msgid "Unable to set network timeout."
+msgstr ""
+
+#: org/postgresql/jdbc/PgConnection.java:1563
+msgid "Unable to get network timeout."
+msgstr ""
+
+#: org/postgresql/jdbc/PgConnection.java:1580
#, java-format
msgid "Unknown ResultSet holdability setting: {0}."
msgstr "未知の ResultSet に対するholdability設定です: {0}"
-#: org/postgresql/jdbc/PgConnection.java:1531
-#: org/postgresql/jdbc/PgConnection.java:1554
-#: org/postgresql/jdbc/PgConnection.java:1576
-#: org/postgresql/jdbc/PgConnection.java:1587
-msgid "Server versions prior to 8.0 do not support savepoints."
-msgstr "サーバのバージョン 8.0 以前は、savepointをサポートしません。"
-
-#: org/postgresql/jdbc/PgConnection.java:1535
-#: org/postgresql/jdbc/PgConnection.java:1558
+#: org/postgresql/jdbc/PgConnection.java:1598
+#: org/postgresql/jdbc/PgConnection.java:1619
msgid "Cannot establish a savepoint in auto-commit mode."
msgstr "自動コミットモードでsavepointを作成できません。"
-#: org/postgresql/jdbc/PgConnection.java:1635
+#: org/postgresql/jdbc/PgConnection.java:1685
msgid "Returning autogenerated keys is not supported."
msgstr "自動生成キーを返すことはサポートされていません。"
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:78
+#: org/postgresql/jdbc/PgStatement.java:235
+msgid "Multiple ResultSets were returned by the query."
+msgstr "クエリの実行により、複数のResultSetが返されました。"
+
+#: org/postgresql/jdbc/PgStatement.java:316
+msgid "Can''t use executeWithFlags(int) on a Statement."
+msgstr ""
+
+#: org/postgresql/jdbc/PgStatement.java:509
+msgid "Maximum number of rows must be a value grater than or equal to 0."
+msgstr "行の最大数は、0に等しいか、より大きな値でなくてはなりません。"
+
+#: org/postgresql/jdbc/PgStatement.java:550
+msgid "Query timeout must be a value greater than or equals to 0."
+msgstr "クエリタイムアウトは、0に等しいか、より大きな値でなくてはなりません。"
+
+#: org/postgresql/jdbc/PgStatement.java:590
+msgid "The maximum field size must be a value greater than or equal to 0."
+msgstr "最大の項目サイズは、0に等しいか、より大きな値でなくてはなりません。"
+
+#: org/postgresql/jdbc/PgStatement.java:689
+msgid "This statement has been closed."
+msgstr "このステートメントは閉じられました。"
+
+#: org/postgresql/jdbc/PgStatement.java:895
+#: org/postgresql/jdbc/PgResultSet.java:878
+#, java-format
+msgid "Invalid fetch direction constant: {0}."
+msgstr "無効なフェッチ方向の定数です: {0}"
+
+#: org/postgresql/jdbc/PgStatement.java:1145
+#: org/postgresql/jdbc/PgStatement.java:1173
+msgid "Returning autogenerated keys by column index is not supported."
+msgstr "列インデックスで自動生成キーを返すことはサポートされていません。"
+
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:66
msgid ""
"Unable to determine a value for MaxIndexKeys due to missing system catalog "
"data."
@@ -905,116 +1147,133 @@ msgstr ""
"間違ったシステム・カタログ・データのためにMaxIndexKeysの値を決めることができ"
"ません。"
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:100
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:89
msgid "Unable to find name datatype in the system catalogs."
msgstr "名前データ型をシステムカタログで見つけることができません。"
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1117
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1028
msgid "proname"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1117
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1028
msgid "oid"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1119
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1714
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1030
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1481
msgid "typtype"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1122
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1033
msgid "proargtypes"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1732
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1499
msgid "adsrc"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1872
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1963
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1512
+msgid "attidentity"
+msgstr ""
+
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1608
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1684
msgid "rolname"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1873
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1964
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1609
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1685
msgid "relacl"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1878
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1615
msgid "attacl"
msgstr ""
-#: org/postgresql/jdbc/PgParameterMetaData.java:86
+#: org/postgresql/jdbc/AbstractBlobClob.java:78
+msgid ""
+"Truncation of large objects is only implemented in 8.3 and later servers."
+msgstr ""
+"ラージオブジェクトの除去は、サーババージョンが 8.3 以上で実装されています。"
+
+#: org/postgresql/jdbc/AbstractBlobClob.java:83
+msgid "Cannot truncate LOB to a negative length."
+msgstr "負の値でLOBを削除できません。"
+
+#: org/postgresql/jdbc/AbstractBlobClob.java:90
+#: org/postgresql/jdbc/AbstractBlobClob.java:234
#, java-format
-msgid "The parameter index is out of range: {0}, number of parameters: {1}."
-msgstr "パラメータ・インデックスは範囲外です: {0} , パラメータ数: {1}"
+msgid "PostgreSQL LOBs can only index to: {0}"
+msgstr "PostgreSQL LOB は、インデックス {0} までのみ可能です。 "
+
+#: org/postgresql/jdbc/AbstractBlobClob.java:230
+msgid "LOB positioning offsets start at 1."
+msgstr "LOB オフセット開始位置を 1 としてください。"
+
+#: org/postgresql/jdbc/AbstractBlobClob.java:246
+msgid "free() was called on this LOB previously"
+msgstr "以前に、このLOBに対するfree() は呼ばれました。"
-#: org/postgresql/jdbc/PgPreparedStatement.java:102
-#: org/postgresql/jdbc/PgPreparedStatement.java:128
-#: org/postgresql/jdbc/PgPreparedStatement.java:150
-#: org/postgresql/jdbc/PgPreparedStatement.java:1108
+#: org/postgresql/jdbc/PgPreparedStatement.java:106
+#: org/postgresql/jdbc/PgPreparedStatement.java:127
+#: org/postgresql/jdbc/PgPreparedStatement.java:139
+#: org/postgresql/jdbc/PgPreparedStatement.java:1035
msgid ""
"Can''t use query methods that take a query string on a PreparedStatement."
msgstr "PreparedStatementでクエリ文字を持ったクエリメソッドは使えません。"
-#: org/postgresql/jdbc/PgPreparedStatement.java:119
-#: org/postgresql/jdbc/PgStatement.java:286
-msgid "Multiple ResultSets were returned by the query."
-msgstr "クエリの実行により、複数のResultSetが返されました。"
-
-#: org/postgresql/jdbc/PgPreparedStatement.java:270
+#: org/postgresql/jdbc/PgPreparedStatement.java:249
msgid "Unknown Types value."
msgstr "未知の型の値です。"
-#: org/postgresql/jdbc/PgPreparedStatement.java:417
-#: org/postgresql/jdbc/PgPreparedStatement.java:486
-#: org/postgresql/jdbc/PgPreparedStatement.java:1251
-#: org/postgresql/jdbc/PgPreparedStatement.java:1583
+#: org/postgresql/jdbc/PgPreparedStatement.java:382
+#: org/postgresql/jdbc/PgPreparedStatement.java:439
+#: org/postgresql/jdbc/PgPreparedStatement.java:1191
+#: org/postgresql/jdbc/PgPreparedStatement.java:1490
#, java-format
msgid "Invalid stream length {0}."
msgstr "無効なストリーム長 {0}."
-#: org/postgresql/jdbc/PgPreparedStatement.java:447
+#: org/postgresql/jdbc/PgPreparedStatement.java:411
#, java-format
msgid "The JVM claims not to support the {0} encoding."
msgstr "JVMは、エンコーディング {0} をサポートしません。"
-#: org/postgresql/jdbc/PgPreparedStatement.java:450
-#: org/postgresql/jdbc/PgPreparedStatement.java:519
-#: org/postgresql/jdbc/PgResultSet.java:1075
-#: org/postgresql/jdbc/PgResultSet.java:1109
+#: org/postgresql/jdbc/PgPreparedStatement.java:414
+#: org/postgresql/jdbc/PgResultSet.java:1122
+#: org/postgresql/jdbc/PgResultSet.java:1156
msgid "Provided InputStream failed."
msgstr "提供された InputStream は失敗しました。"
-#: org/postgresql/jdbc/PgPreparedStatement.java:536
-#: org/postgresql/jdbc/PgPreparedStatement.java:1170
+#: org/postgresql/jdbc/PgPreparedStatement.java:460
+#: org/postgresql/jdbc/PgPreparedStatement.java:1096
#, java-format
msgid "Unknown type {0}."
msgstr "未知の型 {0}."
-#: org/postgresql/jdbc/PgPreparedStatement.java:553
+#: org/postgresql/jdbc/PgPreparedStatement.java:477
msgid "No hstore extension installed."
msgstr "hstore 拡張がインストールされてません。"
-#: org/postgresql/jdbc/PgPreparedStatement.java:683
-#: org/postgresql/jdbc/PgPreparedStatement.java:705
-#: org/postgresql/jdbc/PgPreparedStatement.java:715
-#: org/postgresql/jdbc/PgPreparedStatement.java:725
+#: org/postgresql/jdbc/PgPreparedStatement.java:619
+#: org/postgresql/jdbc/PgPreparedStatement.java:642
+#: org/postgresql/jdbc/PgPreparedStatement.java:652
+#: org/postgresql/jdbc/PgPreparedStatement.java:664
#, java-format
msgid "Cannot cast an instance of {0} to type {1}"
msgstr "インスタンス {0} を型 {1} へキャストできません"
-#: org/postgresql/jdbc/PgPreparedStatement.java:741
+#: org/postgresql/jdbc/PgPreparedStatement.java:682
#, java-format
msgid "Unsupported Types value: {0}"
msgstr "サポートされない型の値: {0}."
-#: org/postgresql/jdbc/PgPreparedStatement.java:970
+#: org/postgresql/jdbc/PgPreparedStatement.java:894
#, java-format
msgid "Cannot convert an instance of {0} to type {1}"
msgstr "型 {1} に {0} のインスタンスを変換できません。"
-#: org/postgresql/jdbc/PgPreparedStatement.java:1040
+#: org/postgresql/jdbc/PgPreparedStatement.java:968
#, java-format
msgid ""
"Can''t infer the SQL type to use for an instance of {0}. Use setObject() "
@@ -1023,24 +1282,23 @@ msgstr ""
"インスタンス {0} で使うべきSQL型を推測できません。明確な型値を記述した "
"setObject() を使ってください。"
-#: org/postgresql/jdbc/PgPreparedStatement.java:1207
-#: org/postgresql/jdbc/PgPreparedStatement.java:1303
-#: org/postgresql/jdbc/PgPreparedStatement.java:1340
+#: org/postgresql/jdbc/PgPreparedStatement.java:1133
+#: org/postgresql/jdbc/PgPreparedStatement.java:1233
msgid "Unexpected error writing large object to database."
msgstr ""
"データベースへのラージオブジェクト書き込み中に想定外のエラーが起きました。"
-#: org/postgresql/jdbc/PgPreparedStatement.java:1278
-#: org/postgresql/jdbc/PgResultSet.java:1163
+#: org/postgresql/jdbc/PgPreparedStatement.java:1178
+#: org/postgresql/jdbc/PgResultSet.java:1210
msgid "Provided Reader failed."
msgstr "提供された Reader は失敗しました。"
-#: org/postgresql/jdbc/PgPreparedStatement.java:1542
-#: org/postgresql/util/StreamWrapper.java:59
-msgid "Object is too large to send over the protocol."
-msgstr "プロトコルで送信するにはオブジェクトが大きすぎます。"
+#: org/postgresql/jdbc/BooleanTypeUtil.java:99
+#, java-format
+msgid "Cannot cast to boolean: \"{0}\""
+msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:285
+#: org/postgresql/jdbc/PgResultSet.java:280
msgid ""
"Operation requires a scrollable ResultSet, but this ResultSet is "
"FORWARD_ONLY."
@@ -1048,41 +1306,32 @@ msgstr ""
"操作は、スクロール可能なResultSetを必要としますが、このResultSetは、 "
"FORWARD_ONLYです。"
-#: org/postgresql/jdbc/PgResultSet.java:456
-msgid "Unexpected error while decoding character data from a large object."
-msgstr ""
-"ラージオブジェクトから文字データの複合化中に想定外のエラーが起きました。"
-
-#: org/postgresql/jdbc/PgResultSet.java:507
-#: org/postgresql/jdbc/PgResultSet.java:537
-#: org/postgresql/jdbc/PgResultSet.java:570
-#: org/postgresql/jdbc/PgResultSet.java:2964
+#: org/postgresql/jdbc/PgResultSet.java:492
+#: org/postgresql/jdbc/PgResultSet.java:532
+#: org/postgresql/jdbc/PgResultSet.java:556
+#: org/postgresql/jdbc/PgResultSet.java:594
+#: org/postgresql/jdbc/PgResultSet.java:624
#: org/postgresql/jdbc/PgResultSet.java:3008
+#: org/postgresql/jdbc/PgResultSet.java:3052
#, fuzzy, java-format
msgid "Cannot convert the column of type {0} to requested type {1}."
msgstr "型 {0} の列値を型 {1} に変換できません。"
-#: org/postgresql/jdbc/PgResultSet.java:789
-#: org/postgresql/jdbc/PgResultSet.java:810
-#: org/postgresql/jdbc/PgResultSet.java:1797
+#: org/postgresql/jdbc/PgResultSet.java:838
+#: org/postgresql/jdbc/PgResultSet.java:859
+#: org/postgresql/jdbc/PgResultSet.java:1832
msgid "Can''t use relative move methods while on the insert row."
msgstr "行挿入の最中に関連の動作方法を使うことはできません。"
-#: org/postgresql/jdbc/PgResultSet.java:829
-#: org/postgresql/jdbc/PgStatement.java:1045
-#, java-format
-msgid "Invalid fetch direction constant: {0}."
-msgstr "無効なフェッチ方向の定数です: {0}"
-
-#: org/postgresql/jdbc/PgResultSet.java:840
+#: org/postgresql/jdbc/PgResultSet.java:889
msgid "Cannot call cancelRowUpdates() when on the insert row."
msgstr "行挿入時に cancelRowUpdates() を呼び出せません。"
-#: org/postgresql/jdbc/PgResultSet.java:856
+#: org/postgresql/jdbc/PgResultSet.java:905
msgid "Cannot call deleteRow() when on the insert row."
msgstr "行挿入時に deleteRow() を呼び出せません。"
-#: org/postgresql/jdbc/PgResultSet.java:863
+#: org/postgresql/jdbc/PgResultSet.java:912
msgid ""
"Currently positioned before the start of the ResultSet. You cannot call "
"deleteRow() here."
@@ -1090,7 +1339,7 @@ msgstr ""
"ResultSetの開始の前に位置していました。ここでdeleteRow()を呼ぶことはできませ"
"ん。"
-#: org/postgresql/jdbc/PgResultSet.java:869
+#: org/postgresql/jdbc/PgResultSet.java:918
msgid ""
"Currently positioned after the end of the ResultSet. You cannot call "
"deleteRow() here."
@@ -1098,73 +1347,73 @@ msgstr ""
"ResultSetの終わりの後に位置していました。ここでdeleteRow()を呼ぶことはできま"
"せん。"
-#: org/postgresql/jdbc/PgResultSet.java:873
+#: org/postgresql/jdbc/PgResultSet.java:922
msgid "There are no rows in this ResultSet."
msgstr "このResultSetにいかなる行もありません。"
-#: org/postgresql/jdbc/PgResultSet.java:914
+#: org/postgresql/jdbc/PgResultSet.java:963
msgid "Not on the insert row."
msgstr "挿入行がありません。"
-#: org/postgresql/jdbc/PgResultSet.java:916
+#: org/postgresql/jdbc/PgResultSet.java:965
msgid "You must specify at least one column value to insert a row."
msgstr "行挿入には、最低でも1つの列の値が必要です。"
-#: org/postgresql/jdbc/PgResultSet.java:1072
-#: org/postgresql/jdbc/PgResultSet.java:1706
-#: org/postgresql/jdbc/PgResultSet.java:2377
-#: org/postgresql/jdbc/PgResultSet.java:2402
+#: org/postgresql/jdbc/PgResultSet.java:1119
+#: org/postgresql/jdbc/PgResultSet.java:1754
+#: org/postgresql/jdbc/PgResultSet.java:2416
+#: org/postgresql/jdbc/PgResultSet.java:2437
#, java-format
msgid "The JVM claims not to support the encoding: {0}"
msgstr "JVMでサポートされないエンコーディングです: {0}"
-#: org/postgresql/jdbc/PgResultSet.java:1214
+#: org/postgresql/jdbc/PgResultSet.java:1261
msgid "Can''t refresh the insert row."
msgstr "挿入行を回復することはできません。"
-#: org/postgresql/jdbc/PgResultSet.java:1280
+#: org/postgresql/jdbc/PgResultSet.java:1328
msgid "Cannot call updateRow() when on the insert row."
msgstr "行を挿入したときに、updateRow() を呼び出すことができません。"
-#: org/postgresql/jdbc/PgResultSet.java:1287
-#: org/postgresql/jdbc/PgResultSet.java:3025
+#: org/postgresql/jdbc/PgResultSet.java:1335
+#: org/postgresql/jdbc/PgResultSet.java:3069
msgid ""
"Cannot update the ResultSet because it is either before the start or after "
"the end of the results."
msgstr "開始前もしくは終了後であるため、ResultSetを更新することができません。"
-#: org/postgresql/jdbc/PgResultSet.java:1486
+#: org/postgresql/jdbc/PgResultSet.java:1535
msgid "ResultSets with concurrency CONCUR_READ_ONLY cannot be updated."
msgstr "CONCUR_READ_ONLYを伴うResultSetsは更新できません。"
-#: org/postgresql/jdbc/PgResultSet.java:1555
+#: org/postgresql/jdbc/PgResultSet.java:1603
#, java-format
msgid "No primary key found for table {0}."
msgstr "テーブル {0} の主キーがありません。"
-#: org/postgresql/jdbc/PgResultSet.java:1941
-#: org/postgresql/jdbc/PgResultSet.java:1946
-#: org/postgresql/jdbc/PgResultSet.java:1986
-#: org/postgresql/jdbc/PgResultSet.java:1992
-#: org/postgresql/jdbc/PgResultSet.java:2790
-#: org/postgresql/jdbc/PgResultSet.java:2796
-#: org/postgresql/jdbc/PgResultSet.java:2820
-#: org/postgresql/jdbc/PgResultSet.java:2825
-#: org/postgresql/jdbc/PgResultSet.java:2841
-#: org/postgresql/jdbc/PgResultSet.java:2862
-#: org/postgresql/jdbc/PgResultSet.java:2873
-#: org/postgresql/jdbc/PgResultSet.java:2886
-#: org/postgresql/jdbc/PgResultSet.java:3013
+#: org/postgresql/jdbc/PgResultSet.java:2011
+#: org/postgresql/jdbc/PgResultSet.java:2016
+#: org/postgresql/jdbc/PgResultSet.java:2803
+#: org/postgresql/jdbc/PgResultSet.java:2809
+#: org/postgresql/jdbc/PgResultSet.java:2834
+#: org/postgresql/jdbc/PgResultSet.java:2840
+#: org/postgresql/jdbc/PgResultSet.java:2864
+#: org/postgresql/jdbc/PgResultSet.java:2869
+#: org/postgresql/jdbc/PgResultSet.java:2885
+#: org/postgresql/jdbc/PgResultSet.java:2906
+#: org/postgresql/jdbc/PgResultSet.java:2917
+#: org/postgresql/jdbc/PgResultSet.java:2930
+#: org/postgresql/jdbc/PgResultSet.java:3057
#, java-format
msgid "Bad value for type {0} : {1}"
msgstr "型 {0} で不正な値 : {1}"
-#: org/postgresql/jdbc/PgResultSet.java:2564
+#: org/postgresql/jdbc/PgResultSet.java:2589
#, java-format
msgid "The column name {0} was not found in this ResultSet."
msgstr "ResultSet に列名 {0} は見つかりませんでした。"
-#: org/postgresql/jdbc/PgResultSet.java:2689
+#: org/postgresql/jdbc/PgResultSet.java:2725
msgid ""
"ResultSet is not updateable. The query that generated this result set must "
"select only one table, and must select all primary keys from that table. See "
@@ -1174,431 +1423,319 @@ msgstr ""
"のテーブルを選び、そのテーブルから全ての主キーを選ばなくてはいけません。より"
"多くの詳細に関して JDBC 2.1 API仕様、章 5.6 を参照して下さい。"
-#: org/postgresql/jdbc/PgResultSet.java:2701
+#: org/postgresql/jdbc/PgResultSet.java:2737
msgid "This ResultSet is closed."
msgstr "ResultSetは閉じられました。"
-#: org/postgresql/jdbc/PgResultSet.java:2732
+#: org/postgresql/jdbc/PgResultSet.java:2768
msgid "ResultSet not positioned properly, perhaps you need to call next."
msgstr ""
"適切な位置を指していないResultSetです。おそらく、nextを呼ぶ必要があります。"
-#: org/postgresql/jdbc/PgResultSet.java:3045
+#: org/postgresql/jdbc/PgResultSet.java:3089
msgid "Invalid UUID data."
msgstr "無効なUUIDデータです。"
-#: org/postgresql/jdbc/PgSQLXML.java:150
-msgid "Unable to decode xml data."
-msgstr "xmlデータを復号化できません。"
+#: org/postgresql/jdbc/PgResultSet.java:3178
+#: org/postgresql/jdbc/PgResultSet.java:3185
+#: org/postgresql/jdbc/PgResultSet.java:3196
+#: org/postgresql/jdbc/PgResultSet.java:3207
+#: org/postgresql/jdbc/PgResultSet.java:3218
+#: org/postgresql/jdbc/PgResultSet.java:3229
+#: org/postgresql/jdbc/PgResultSet.java:3240
+#: org/postgresql/jdbc/PgResultSet.java:3251
+#: org/postgresql/jdbc/PgResultSet.java:3262
+#: org/postgresql/jdbc/PgResultSet.java:3269
+#: org/postgresql/jdbc/PgResultSet.java:3276
+#: org/postgresql/jdbc/PgResultSet.java:3287
+#: org/postgresql/jdbc/PgResultSet.java:3304
+#: org/postgresql/jdbc/PgResultSet.java:3311
+#: org/postgresql/jdbc/PgResultSet.java:3318
+#: org/postgresql/jdbc/PgResultSet.java:3329
+#: org/postgresql/jdbc/PgResultSet.java:3336
+#: org/postgresql/jdbc/PgResultSet.java:3343
+#: org/postgresql/jdbc/PgResultSet.java:3381
+#: org/postgresql/jdbc/PgResultSet.java:3388
+#: org/postgresql/jdbc/PgResultSet.java:3395
+#: org/postgresql/jdbc/PgResultSet.java:3415
+#: org/postgresql/jdbc/PgResultSet.java:3428
+#, fuzzy, java-format
+msgid "conversion to {0} from {1} not supported"
+msgstr "トランザクション隔離レベル{0} はサポートされていません。"
-#: org/postgresql/jdbc/PgSQLXML.java:153
-#, java-format
-msgid "Unknown XML Source class: {0}"
-msgstr "未知のXMLソースクラス: {0}"
+#: org/postgresql/jdbc/TimestampUtils.java:355
+#: org/postgresql/jdbc/TimestampUtils.java:423
+#, fuzzy, java-format
+msgid "Bad value for type timestamp/date/time: {1}"
+msgstr "型 {0} で不正な値 : {1}"
-#: org/postgresql/jdbc/PgSQLXML.java:196
-msgid "Unable to create SAXResult for SQLXML."
-msgstr "SQLXMLに対するSAXResultを生成できません。"
+#: org/postgresql/jdbc/TimestampUtils.java:858
+#: org/postgresql/jdbc/TimestampUtils.java:915
+#: org/postgresql/jdbc/TimestampUtils.java:961
+#: org/postgresql/jdbc/TimestampUtils.java:1010
+#, fuzzy, java-format
+msgid "Unsupported binary encoding of {0}."
+msgstr "サポートされないバイナリエンコーディングです: {0}."
-#: org/postgresql/jdbc/PgSQLXML.java:211
-msgid "Unable to create StAXResult for SQLXML"
-msgstr "SQLXMLに対するStAXResultを生成できません。"
+#: org/postgresql/jdbc/PgCallableStatement.java:86
+#: org/postgresql/jdbc/PgCallableStatement.java:96
+msgid "A CallableStatement was executed with nothing returned."
+msgstr "CallableStatementは、戻りなしで実行されました。"
-#: org/postgresql/jdbc/PgSQLXML.java:216
-#, java-format
-msgid "Unknown XML Result class: {0}"
-msgstr "未知のXML結果クラス: {0}"
-
-#: org/postgresql/jdbc/PgSQLXML.java:228
-msgid "This SQLXML object has already been freed."
-msgstr "このSQLXMLオブジェクトはすでに解放されています。"
+#: org/postgresql/jdbc/PgCallableStatement.java:107
+msgid "A CallableStatement was executed with an invalid number of parameters"
+msgstr "CallableStatementは、不正な数のパラメータで実行されました。"
-#: org/postgresql/jdbc/PgSQLXML.java:237
+#: org/postgresql/jdbc/PgCallableStatement.java:145
+#, java-format
msgid ""
-"This SQLXML object has not been initialized, so you cannot retrieve data "
-"from it."
+"A CallableStatement function was executed and the out parameter {0} was of "
+"type {1} however type {2} was registered."
msgstr ""
-"このSQLXMLオブジェクトは初期化されてなかったため、そこからデータを取得できま"
-"せん。"
-
-#: org/postgresql/jdbc/PgSQLXML.java:250
-#, java-format
-msgid "Failed to convert binary xml data to encoding: {0}."
-msgstr "バイナリxmlデータのエンコード: {0} への変換に失敗しました。"
-
-#: org/postgresql/jdbc/PgSQLXML.java:276
-msgid "Unable to convert DOMResult SQLXML data to a string."
-msgstr "DOMResult SQLXMLデータを文字列に変えることができません。"
+"CallableStatement機能が実行され、出力パラメータ {0} は、型 {1} でした。しか"
+"し、型 {2} が登録されました。"
-#: org/postgresql/jdbc/PgSQLXML.java:290
+#: org/postgresql/jdbc/PgCallableStatement.java:202
msgid ""
-"This SQLXML object has already been initialized, so you cannot manipulate it "
-"further."
-msgstr "このSQLXMLオブジェクトは既に初期化されたため、これ以上操作できません。"
-
-#: org/postgresql/jdbc/PgStatement.java:325
-msgid "Can''t use executeWithFlags(int) on a Statement."
+"This statement does not declare an OUT parameter. Use '{' ?= call ... '}' "
+"to declare one."
msgstr ""
+"ステートメントは、OUTパラメータを宣言していません。'{' ?= call ... '}' を使っ"
+"て宣言して下さい。"
-#: org/postgresql/jdbc/PgStatement.java:484
-msgid "Maximum number of rows must be a value grater than or equal to 0."
-msgstr "行の最大数は、0に等しいか、より大きな値でなくてはなりません。"
-
-#: org/postgresql/jdbc/PgStatement.java:525
-msgid "Query timeout must be a value greater than or equals to 0."
-msgstr "クエリタイムアウトは、0に等しいか、より大きな値でなくてはなりません。"
-
-#: org/postgresql/jdbc/PgStatement.java:561
-msgid "The maximum field size must be a value greater than or equal to 0."
-msgstr "最大の項目サイズは、0に等しいか、より大きな値でなくてはなりません。"
-
-#: org/postgresql/jdbc/PgStatement.java:871
-msgid "This statement has been closed."
-msgstr "このステートメントは閉じられました。"
+#: org/postgresql/jdbc/PgCallableStatement.java:246
+msgid "wasNull cannot be call before fetching a result."
+msgstr "wasNullは、結果フェッチ前に呼び出せません。"
-#: org/postgresql/jdbc/PgStatement.java:1148
+#: org/postgresql/jdbc/PgCallableStatement.java:384
+#: org/postgresql/jdbc/PgCallableStatement.java:403
+#, java-format
msgid ""
-"Returning autogenerated keys is only supported for 8.2 and later servers."
-msgstr "自動生成キーを返すことは 8.2 以上でサポートされます。"
-
-#: org/postgresql/jdbc/PgStatement.java:1326
-#: org/postgresql/jdbc/PgStatement.java:1357
-msgid "Returning autogenerated keys by column index is not supported."
-msgstr "列インデックスで自動生成キーを返すことはサポートされていません。"
-
-#: org/postgresql/jdbc/PSQLSavepoint.java:40
-#: org/postgresql/jdbc/PSQLSavepoint.java:54
-#: org/postgresql/jdbc/PSQLSavepoint.java:72
-msgid "Cannot reference a savepoint after it has been released."
-msgstr "savepointは、解放された後で参照することはできません。"
-
-#: org/postgresql/jdbc/PSQLSavepoint.java:45
-msgid "Cannot retrieve the id of a named savepoint."
-msgstr "名前の付いたsavepointのidを取得することができません。"
-
-#: org/postgresql/jdbc/PSQLSavepoint.java:59
-msgid "Cannot retrieve the name of an unnamed savepoint."
-msgstr "名前のないsavepointの名前を取得することができません。"
-
-#: org/postgresql/jdbc/TimestampUtils.java:298
-#, fuzzy, java-format
-msgid "Bad value for type timestamp/date/time: {1}"
-msgstr "型 {0} で不正な値 : {1}"
+"Parameter of type {0} was registered, but call to get{1} (sqltype={2}) was "
+"made."
+msgstr ""
+"型 {0} のパラメータが登録されましたが、get{1} (sqltype={2}) が呼び出されまし"
+"た。"
-#: org/postgresql/jdbc/TimestampUtils.java:359
+#: org/postgresql/jdbc/PgCallableStatement.java:424
msgid ""
-"Infinite value found for timestamp/date. This cannot be represented as time."
+"A CallableStatement was declared, but no call to registerOutParameter(1, "
+"<some type>) was made."
msgstr ""
-"timestamp/date で無限値が見つかりました。これは、時間として表すことができませ"
-"ん。"
-
-#: org/postgresql/jdbc/TimestampUtils.java:674
-#: org/postgresql/jdbc/TimestampUtils.java:710
-#: org/postgresql/jdbc/TimestampUtils.java:757
-#, fuzzy, java-format
-msgid "Unsupported binary encoding of {0}."
-msgstr "サポートされないバイナリエンコーディングです: {0}."
-
-#: org/postgresql/largeobject/LargeObjectManager.java:147
-msgid "Failed to initialize LargeObject API"
-msgstr "ラージオブジェクトAPIの初期化に失敗しました。"
+"CallableStatementは宣言されましたが、registerOutParameter(1, <some type>) は"
+"呼び出されませんでした。"
-#: org/postgresql/largeobject/LargeObjectManager.java:265
-#: org/postgresql/largeobject/LargeObjectManager.java:308
-msgid "Large Objects may not be used in auto-commit mode."
-msgstr "ラージオブジェクトは、自動コミットモードで使うことができません。"
+#: org/postgresql/jdbc/PgCallableStatement.java:430
+msgid "No function outputs were registered."
+msgstr "関数出力は登録されませんでした。"
-#: org/postgresql/osgi/PGDataSourceFactory.java:85
-#, fuzzy, java-format
-msgid "Unsupported properties: {0}"
-msgstr "サポートされない型の値: {0}."
+#: org/postgresql/jdbc/PgCallableStatement.java:436
+msgid ""
+"Results cannot be retrieved from a CallableStatement before it is executed."
+msgstr "実行される前に、CallableStatement から結果を得ることはできません。"
-#: org/postgresql/PGProperty.java:450 org/postgresql/PGProperty.java:470
+#: org/postgresql/jdbc/PgCallableStatement.java:703
#, fuzzy, java-format
-msgid "{0} parameter value must be an integer but was: {1}"
-msgstr "unknownLengthパラメータ値は整数でなければなりません"
-
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:125
-msgid ""
-"Could not find a java cryptographic algorithm: X.509 CertificateFactory not "
-"available."
-msgstr ""
-"javaの暗号化アルゴリズムを見つけることができませんでした。X.509 "
-"CertificateFactory は利用できません。"
+msgid "Unsupported type conversion to {1}."
+msgstr "サポートされないバイナリエンコーディングです: {0}."
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:135
+#: org/postgresql/jdbc/EscapedFunctions.java:240
#, java-format
-msgid "Could not open SSL certificate file {0}."
-msgstr "SSL証明書ファイル {0} を開けませんでした。"
+msgid "{0} function takes four and only four argument."
+msgstr "{0} 関数は、四つの引数のみを用います。"
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:140
+#: org/postgresql/jdbc/EscapedFunctions.java:270
+#: org/postgresql/jdbc/EscapedFunctions.java:344
+#: org/postgresql/jdbc/EscapedFunctions.java:749
+#: org/postgresql/jdbc/EscapedFunctions.java:787
#, java-format
-msgid "Loading the SSL certificate {0} into a KeyManager failed."
-msgstr "SSL証明書 {0} のKeyManagerへの読み込みに失敗しました。"
-
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:195
-msgid "Enter SSL password: "
-msgstr "SSLパスワード入力: "
+msgid "{0} function takes two and only two arguments."
+msgstr "{0} 関数は、二つの引数のみを用います。"
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:202
-msgid "Could not read password for SSL key file, console is not available."
-msgstr ""
-"SSL keyファイルのパスワードを読めませんでした。コンソールは利用できません。"
+#: org/postgresql/jdbc/EscapedFunctions.java:288
+#: org/postgresql/jdbc/EscapedFunctions.java:326
+#: org/postgresql/jdbc/EscapedFunctions.java:446
+#: org/postgresql/jdbc/EscapedFunctions.java:461
+#: org/postgresql/jdbc/EscapedFunctions.java:476
+#: org/postgresql/jdbc/EscapedFunctions.java:491
+#: org/postgresql/jdbc/EscapedFunctions.java:506
+#: org/postgresql/jdbc/EscapedFunctions.java:521
+#: org/postgresql/jdbc/EscapedFunctions.java:536
+#: org/postgresql/jdbc/EscapedFunctions.java:551
+#: org/postgresql/jdbc/EscapedFunctions.java:566
+#: org/postgresql/jdbc/EscapedFunctions.java:581
+#: org/postgresql/jdbc/EscapedFunctions.java:596
+#: org/postgresql/jdbc/EscapedFunctions.java:611
+#: org/postgresql/jdbc/EscapedFunctions.java:775
+#, java-format
+msgid "{0} function takes one and only one argument."
+msgstr "{0} 関数は、単一の引数のみを用います。"
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:207
+#: org/postgresql/jdbc/EscapedFunctions.java:310
+#: org/postgresql/jdbc/EscapedFunctions.java:391
#, java-format
-msgid "Could not read password for SSL key file by callbackhandler {0}."
-msgstr "callbackhandler {0} で、SSL keyファイルを読めませんでした。"
+msgid "{0} function takes two or three arguments."
+msgstr "{0} 関数は、二つ、または三つの引数を用います。"
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:226
+#: org/postgresql/jdbc/EscapedFunctions.java:416
+#: org/postgresql/jdbc/EscapedFunctions.java:431
+#: org/postgresql/jdbc/EscapedFunctions.java:734
+#: org/postgresql/jdbc/EscapedFunctions.java:764
#, java-format
-msgid "Could not decrypt SSL key file {0}."
-msgstr "SSL keyファイル {0} を復号できませんでした。"
+msgid "{0} function doesn''t take any argument."
+msgstr "{0} 関数は、どのような引数も用いません。"
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:240
+#: org/postgresql/jdbc/EscapedFunctions.java:627
+#: org/postgresql/jdbc/EscapedFunctions.java:680
#, java-format
-msgid "Could not read SSL key file {0}."
-msgstr "SSL keyファイル {0} を読めませんでした。"
+msgid "{0} function takes three and only three arguments."
+msgstr "{0} 関数は、三つの引数のみを用います。"
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:243
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:162
+#: org/postgresql/jdbc/EscapedFunctions.java:640
+#: org/postgresql/jdbc/EscapedFunctions.java:661
+#: org/postgresql/jdbc/EscapedFunctions.java:664
+#: org/postgresql/jdbc/EscapedFunctions.java:697
+#: org/postgresql/jdbc/EscapedFunctions.java:710
+#: org/postgresql/jdbc/EscapedFunctions.java:713
#, java-format
-msgid "Could not find a java cryptographic algorithm: {0}."
-msgstr "javaの暗号化アルゴリズム {0} を見つけることができませんでした。"
+msgid "Interval {0} not yet implemented"
+msgstr "間隔 {0} はまだ実装されていません。"
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:90
+#: org/postgresql/PGProperty.java:535 org/postgresql/PGProperty.java:555
#, fuzzy, java-format
-msgid "The password callback class provided {0} could not be instantiated."
-msgstr "提供されたpassword callbackクラス {0} は、即応しないかもしれません。"
+msgid "{0} parameter value must be an integer but was: {1}"
+msgstr "unknownLengthパラメータ値は整数でなければなりません"
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:123
-#, java-format
-msgid "Could not open SSL root certificate file {0}."
-msgstr "SSLルート証明書ファイル {0} を開けませんでした。"
+#: org/postgresql/largeobject/LargeObjectManager.java:144
+msgid "Failed to initialize LargeObject API"
+msgstr "ラージオブジェクトAPIの初期化に失敗しました。"
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:139
-#, java-format
-msgid "Could not read SSL root certificate file {0}."
-msgstr "SSLルート証明書ファイル {0} を読めませんでした。"
+#: org/postgresql/largeobject/LargeObjectManager.java:262
+#: org/postgresql/largeobject/LargeObjectManager.java:305
+msgid "Large Objects may not be used in auto-commit mode."
+msgstr "ラージオブジェクトは、自動コミットモードで使うことができません。"
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:143
+#: org/postgresql/copy/PGCopyInputStream.java:51
#, java-format
-msgid "Loading the SSL root certificate {0} into a TrustManager failed."
-msgstr "SSLルート証明書 {0} のTrustManagerへの読み込みに失敗しました。"
+msgid "Copying from database failed: {0}"
+msgstr "データベースからコピーに失敗しました: {0}"
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:156
-msgid "Could not initialize SSL context."
-msgstr "SSL contextを初期化できませんでした。"
+#: org/postgresql/copy/PGCopyInputStream.java:67
+#: org/postgresql/copy/PGCopyOutputStream.java:94
+msgid "This copy stream is closed."
+msgstr "コピー・ストリームは閉じられました。"
-#: org/postgresql/ssl/MakeSSL.java:52
+#: org/postgresql/copy/PGCopyInputStream.java:110
+msgid "Read from copy failed."
+msgstr "copyからの読み取りに失敗しました。"
+
+#: org/postgresql/copy/CopyManager.java:53
#, java-format
-msgid "The SSLSocketFactory class provided {0} could not be instantiated."
-msgstr "提供のSSLSocketFactoryクラス {0} は、即応しないかもしれません。"
+msgid "Requested CopyIn but got {0}"
+msgstr "CopyInを要求しましたが {0} を得ました。"
-#: org/postgresql/ssl/MakeSSL.java:67
+#: org/postgresql/copy/CopyManager.java:64
#, java-format
-msgid "SSL error: {0}"
-msgstr "SSL エラー: {0}"
+msgid "Requested CopyOut but got {0}"
+msgstr "CopyOutを要求しましたが {0} を得ました。"
-#: org/postgresql/ssl/MakeSSL.java:78
+#: org/postgresql/copy/CopyManager.java:75
#, fuzzy, java-format
-msgid "The HostnameVerifier class provided {0} could not be instantiated."
-msgstr "提供されたHostnameVerifierクラス {0} は、即応しないかもしれません。"
-
-#: org/postgresql/ssl/MakeSSL.java:84
-#, java-format
-msgid "The hostname {0} could not be verified by hostnameverifier {1}."
-msgstr "ホスト名 {0} は、hostnameverifier {1} で確認できませんでした。"
+msgid "Requested CopyDual but got {0}"
+msgstr "CopyOutを要求しましたが {0} を得ました。"
-#: org/postgresql/ssl/MakeSSL.java:93
+#: org/postgresql/copy/PGCopyOutputStream.java:71
#, java-format
-msgid "The hostname {0} could not be verified."
-msgstr "ホスト名 {0} は確認できませんでした。"
-
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:167
-msgid "The sslfactoryarg property may not be empty."
-msgstr ""
+msgid "Cannot write to copy a byte of value {0}"
+msgstr "値{0}のバイトコピーで書き込みができません。"
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:183
-msgid ""
-"The environment variable containing the server's SSL certificate must not be "
-"empty."
+#: org/postgresql/fastpath/Fastpath.java:80
+#, fuzzy, java-format
+msgid "Fastpath call {0} - No result was returned and we expected a numeric."
msgstr ""
+"Fastpath 呼び出し {0} - 整数値を想定しましたが、いかなる結果も返されませんで"
+"した。"
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:191
-msgid ""
-"The system property containing the server's SSL certificate must not be "
-"empty."
+#: org/postgresql/fastpath/Fastpath.java:157
+#, java-format
+msgid "Fastpath call {0} - No result was returned and we expected an integer."
msgstr ""
+"Fastpath 呼び出し {0} - 整数値を想定しましたが、いかなる結果も返されませんで"
+"した。"
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:198
+#: org/postgresql/fastpath/Fastpath.java:165
+#, fuzzy, java-format
msgid ""
-"The sslfactoryarg property must start with the prefix file:, classpath:, "
-"env:, sys:, or -----BEGIN CERTIFICATE-----."
-msgstr ""
-
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:210
-#, fuzzy
-msgid "An error occurred reading the certificate"
-msgstr "SSL接続のセットアップ中に、エラーが起こりました。"
-
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:243
-msgid "No X509TrustManager found"
+"Fastpath call {0} - No result was returned or wrong size while expecting an "
+"integer."
msgstr ""
+"Fastpath 呼び出し {0} - 整数値を想定しましたが、いかなる結果も返されませんで"
+"した。"
-#: org/postgresql/util/PGInterval.java:155
-msgid "Conversion of interval failed"
-msgstr "intervalの変換に失敗しました。"
-
-#: org/postgresql/util/PGmoney.java:65
-msgid "Conversion of money failed."
-msgstr "moneyの変換に失敗しました。"
-
-#: org/postgresql/util/ServerErrorMessage.java:165
-#, java-format
-msgid "Detail: {0}"
-msgstr "詳細: {0}"
-
-#: org/postgresql/util/ServerErrorMessage.java:170
-#, java-format
-msgid "Hint: {0}"
-msgstr "ヒント: {0}"
-
-#: org/postgresql/util/ServerErrorMessage.java:174
-#, java-format
-msgid "Position: {0}"
-msgstr "ポジション: {0}"
-
-#: org/postgresql/util/ServerErrorMessage.java:178
-#, java-format
-msgid "Where: {0}"
-msgstr "場所: {0}"
-
-#: org/postgresql/util/ServerErrorMessage.java:184
-#, java-format
-msgid "Internal Query: {0}"
-msgstr "インターナル・クエリ: {0}"
-
-#: org/postgresql/util/ServerErrorMessage.java:188
-#, java-format
-msgid "Internal Position: {0}"
-msgstr "インターナル・ポジション: {0}"
-
-#: org/postgresql/util/ServerErrorMessage.java:195
-#, java-format
-msgid "Location: File: {0}, Routine: {1}, Line: {2}"
-msgstr "場所: ファイル: {0}, ルーチン: {1},行: {2}"
-
-#: org/postgresql/util/ServerErrorMessage.java:200
-#, java-format
-msgid "Server SQLState: {0}"
-msgstr "サーバ SQLState: {0}"
-
-#: org/postgresql/xa/PGXAConnection.java:148
-msgid ""
-"Transaction control methods setAutoCommit(true), commit, rollback and "
-"setSavePoint not allowed while an XA transaction is active."
+#: org/postgresql/fastpath/Fastpath.java:182
+#, fuzzy, java-format
+msgid "Fastpath call {0} - No result was returned and we expected a long."
msgstr ""
-"トランザクション制御メソッドである setAutoCommit(true), commit, rollback, "
-"setSavePoint は、XAトランザクションが有効では利用できません。"
-
-#: org/postgresql/xa/PGXAConnection.java:196
-#: org/postgresql/xa/PGXAConnection.java:265
-msgid "Invalid flags"
-msgstr "無効なフラグです。"
-
-#: org/postgresql/xa/PGXAConnection.java:200
-#: org/postgresql/xa/PGXAConnection.java:269
-#: org/postgresql/xa/PGXAConnection.java:437
-msgid "xid must not be null"
-msgstr "xidはnullではいけません。"
-
-#: org/postgresql/xa/PGXAConnection.java:204
-msgid "Connection is busy with another transaction"
-msgstr "接続は、別のトランザクションに対応中です。"
-
-#: org/postgresql/xa/PGXAConnection.java:213
-#: org/postgresql/xa/PGXAConnection.java:279
-msgid "suspend/resume not implemented"
-msgstr "停止/再開 は実装されていません。"
-
-#: org/postgresql/xa/PGXAConnection.java:219
-#: org/postgresql/xa/PGXAConnection.java:224
-#: org/postgresql/xa/PGXAConnection.java:228
-msgid "Transaction interleaving not implemented"
-msgstr "Transaction interleaving は実装されていません。"
-
-#: org/postgresql/xa/PGXAConnection.java:239
-msgid "Error disabling autocommit"
-msgstr "自動コミットの無効化エラー"
-
-#: org/postgresql/xa/PGXAConnection.java:273
-msgid "tried to call end without corresponding start call"
-msgstr "対応する開始呼び出しなしで、終了呼び出しました。"
+"Fastpath 呼び出し {0} - 整数値を想定しましたが、いかなる結果も返されませんで"
+"した。"
-#: org/postgresql/xa/PGXAConnection.java:305
+#: org/postgresql/fastpath/Fastpath.java:190
+#, fuzzy, java-format
msgid ""
-"Not implemented: Prepare must be issued using the same connection that "
-"started the transaction"
+"Fastpath call {0} - No result was returned or wrong size while expecting a "
+"long."
msgstr ""
-"実装されていません: Prepareは、トランザクションを開始したときと同じ接続で使わ"
-"なくてはなりません。"
+"Fastpath 呼び出し {0} - 整数値を想定しましたが、いかなる結果も返されませんで"
+"した。"
-#: org/postgresql/xa/PGXAConnection.java:309
-msgid "Prepare called before end"
-msgstr "終了前に\"Prepare\"が呼ばれました"
+#: org/postgresql/fastpath/Fastpath.java:302
+#, java-format
+msgid "The fastpath function {0} is unknown."
+msgstr "{0} は未知の fastpath 関数です。"
-#: org/postgresql/xa/PGXAConnection.java:317
-msgid "Server versions prior to 8.1 do not support two-phase commit."
-msgstr "2相コミット は、サーバのバージョン 8.1以前はサポートされません。"
+#~ msgid ""
+#~ "Connection refused. Check that the hostname and port are correct and that "
+#~ "the postmaster is accepting TCP/IP connections."
+#~ msgstr ""
+#~ "接続は拒絶されました。ホスト名とポート番号が正しいことと、ポストマスタが"
+#~ "TCP/IP接続を受け入れていることを調べて下さい。"
-#: org/postgresql/xa/PGXAConnection.java:334
-msgid "Error preparing transaction"
-msgstr "トランザクションの準備エラー"
+#, fuzzy
+#~ msgid "The connection url is invalid."
+#~ msgstr "接続URLが不正です。"
-#: org/postgresql/xa/PGXAConnection.java:349
-msgid "Invalid flag"
-msgstr "無効なフラグ"
+#~ msgid "Connection rejected: {0}."
+#~ msgstr "接続は拒絶されました: {0}."
-#: org/postgresql/xa/PGXAConnection.java:384
-msgid "Error during recover"
-msgstr "回復中にエラー"
+#~ msgid "Backend start-up failed: {0}."
+#~ msgstr "バックエンドの開始に失敗しました: {0}"
-#: org/postgresql/xa/PGXAConnection.java:423
-#: org/postgresql/xa/PGXAConnection.java:426
-msgid "Error rolling back prepared transaction"
-msgstr "準備トランザクションのロールバックエラー"
+#~ msgid "Copy not implemented for protocol version 2"
+#~ msgstr "プロトコルバージョン2でコピーは実装されていません。"
-#: org/postgresql/xa/PGXAConnection.java:464
-msgid ""
-"Not implemented: one-phase commit must be issued using the same connection "
-"that was used to start it"
-msgstr ""
-"実装されていません: 単一フェーズのCOMMITは、開始時と同じ接続で実行されなけれ"
-"ばなりません。"
+#~ msgid "Server versions prior to 8.0 do not support savepoints."
+#~ msgstr "サーバのバージョン 8.0 以前は、savepointをサポートしません。"
-#: org/postgresql/xa/PGXAConnection.java:468
-msgid "commit called before end"
-msgstr "終了の前に COMMIT を呼びました"
+#~ msgid "Unexpected error while decoding character data from a large object."
+#~ msgstr ""
+#~ "ラージオブジェクトから文字データの複合化中に想定外のエラーが起きました。"
-#: org/postgresql/xa/PGXAConnection.java:478
-msgid "Error during one-phase commit"
-msgstr "単一フェーズのCOMMITの最中にエラー"
+#~ msgid ""
+#~ "Returning autogenerated keys is only supported for 8.2 and later servers."
+#~ msgstr "自動生成キーを返すことは 8.2 以上でサポートされます。"
-#: org/postgresql/xa/PGXAConnection.java:497
-msgid ""
-"Not implemented: 2nd phase commit must be issued using an idle connection"
-msgstr ""
-"実装されていません: 第二フェーズの COMMIT は、待機接続で使わなくてはなりませ"
-"ん。"
+#~ msgid ""
+#~ "Infinite value found for timestamp/date. This cannot be represented as "
+#~ "time."
+#~ msgstr ""
+#~ "timestamp/date で無限値が見つかりました。これは、時間として表すことができ"
+#~ "ません。"
-#: org/postgresql/xa/PGXAConnection.java:513
-msgid "Error committing prepared transaction"
-msgstr "準備トランザクションのコミットエラー"
+#~ msgid "Server versions prior to 8.1 do not support two-phase commit."
+#~ msgstr "2相コミット は、サーバのバージョン 8.1以前はサポートされません。"
-#: org/postgresql/xa/PGXAConnection.java:529
-msgid "Heuristic commit/rollback not supported"
-msgstr "サポートされない commit/rollback が見つかりました。"
+#~ msgid "Invalid flag"
+#~ msgstr "無効なフラグ"
#~ msgid "The class {0} does not implement org.postgresql.util.PGobject."
#~ msgstr "クラス {0} は、org.postgresql.util.PGobject を実装していません。"
diff --git a/pgjdbc/src/main/java/org/postgresql/translation/messages.pot b/pgjdbc/src/main/java/org/postgresql/translation/messages.pot
index e6ef865..1d55495 100644
--- a/pgjdbc/src/main/java/org/postgresql/translation/messages.pot
+++ b/pgjdbc/src/main/java/org/postgresql/translation/messages.pot
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-01-07 15:09+0300\n"
+"POT-Creation-Date: 2018-03-10 23:25+0300\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
"Language-Team: LANGUAGE <LL at li.org>\n"
@@ -17,1496 +17,1581 @@ msgstr ""
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
-#: org/postgresql/copy/CopyManager.java:57
-#, java-format
-msgid "Requested CopyIn but got {0}"
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:164
+msgid "The sslfactoryarg property may not be empty."
msgstr ""
-#: org/postgresql/copy/CopyManager.java:69
-#, java-format
-msgid "Requested CopyOut but got {0}"
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:180
+msgid ""
+"The environment variable containing the server's SSL certificate must not be "
+"empty."
msgstr ""
-#: org/postgresql/copy/PGCopyInputStream.java:54
-#, java-format
-msgid "Copying from database failed: {0}"
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:188
+msgid ""
+"The system property containing the server's SSL certificate must not be "
+"empty."
msgstr ""
-#: org/postgresql/copy/PGCopyInputStream.java:70
-#: org/postgresql/copy/PGCopyOutputStream.java:97
-msgid "This copy stream is closed."
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:195
+msgid ""
+"The sslfactoryarg property must start with the prefix file:, classpath:, "
+"env:, sys:, or -----BEGIN CERTIFICATE-----."
msgstr ""
-#: org/postgresql/copy/PGCopyInputStream.java:113
-msgid "Read from copy failed."
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:207
+msgid "An error occurred reading the certificate"
msgstr ""
-#: org/postgresql/copy/PGCopyOutputStream.java:74
-#, java-format
-msgid "Cannot write to copy a byte of value {0}"
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:240
+msgid "No X509TrustManager found"
msgstr ""
-#: org/postgresql/core/ConnectionFactory.java:74
-#, java-format
-msgid "A connection could not be made using the requested protocol {0}."
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:133
+msgid ""
+"Could not find a java cryptographic algorithm: X.509 CertificateFactory not "
+"available."
msgstr ""
-#: org/postgresql/core/Oid.java:114
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:143
#, java-format
-msgid "oid type {0} not known and not a number"
+msgid "Could not open SSL certificate file {0}."
msgstr ""
-#: org/postgresql/core/Parser.java:616
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:148
#, java-format
-msgid "Malformed function or procedure escape syntax at offset {0}."
+msgid "Loading the SSL certificate {0} into a KeyManager failed."
+msgstr ""
+
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:205
+msgid "Enter SSL password: "
+msgstr ""
+
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:212
+msgid "Could not read password for SSL key file, console is not available."
msgstr ""
-#: org/postgresql/core/PGStream.java:497
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:217
#, java-format
-msgid "Premature end of input stream, expected {0} bytes, but only read {1}."
+msgid "Could not read password for SSL key file by callbackhandler {0}."
msgstr ""
-#: org/postgresql/core/PGStream.java:538
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:236
#, java-format
-msgid "Expected an EOF from server, got: {0}"
+msgid "Could not decrypt SSL key file {0}."
msgstr ""
-#: org/postgresql/core/SetupQueryRunner.java:90
-msgid "An unexpected result was returned by a query."
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:250
+#, java-format
+msgid "Could not read SSL key file {0}."
msgstr ""
-#: org/postgresql/core/UTF8Encoding.java:31
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:253
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:176
#, java-format
-msgid ""
-"Illegal UTF-8 sequence: byte {0} of {1} byte sequence is not 10xxxxxx: {2}"
+msgid "Could not find a java cryptographic algorithm: {0}."
msgstr ""
-#: org/postgresql/core/UTF8Encoding.java:69
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:99
#, java-format
-msgid "Illegal UTF-8 sequence: {0} bytes used to encode a {1} byte value: {2}"
+msgid "The password callback class provided {0} could not be instantiated."
msgstr ""
-#: org/postgresql/core/UTF8Encoding.java:104
-#: org/postgresql/core/UTF8Encoding.java:131
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:132
#, java-format
-msgid "Illegal UTF-8 sequence: initial byte is {0}: {1}"
+msgid "Could not open SSL root certificate file {0}."
msgstr ""
-#: org/postgresql/core/UTF8Encoding.java:137
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:147
#, java-format
-msgid "Illegal UTF-8 sequence: final value is out of range: {0}"
+msgid "Could not read SSL root certificate file {0}."
msgstr ""
-#: org/postgresql/core/UTF8Encoding.java:153
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:151
#, java-format
-msgid "Illegal UTF-8 sequence: final value is a surrogate value: {0}"
+msgid "Loading the SSL root certificate {0} into a TrustManager failed."
msgstr ""
-#: org/postgresql/core/Utils.java:119 org/postgresql/core/Utils.java:136
-msgid "Zero bytes may not occur in string parameters."
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:170
+msgid "Could not initialize SSL context."
msgstr ""
-#: org/postgresql/core/Utils.java:146 org/postgresql/core/Utils.java:217
-msgid "No IOException expected from StringBuffer or StringBuilder"
+#: org/postgresql/ssl/MakeSSL.java:52
+#, java-format
+msgid "The SSLSocketFactory class provided {0} could not be instantiated."
msgstr ""
-#: org/postgresql/core/Utils.java:206
-msgid "Zero bytes may not occur in identifiers."
+#: org/postgresql/ssl/MakeSSL.java:67
+#, java-format
+msgid "SSL error: {0}"
msgstr ""
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:72
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:87
+#: org/postgresql/ssl/MakeSSL.java:78
#, java-format
-msgid "Invalid sslmode value: {0}"
+msgid "The HostnameVerifier class provided {0} could not be instantiated."
msgstr ""
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:87
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:111
+#: org/postgresql/ssl/MakeSSL.java:84
#, java-format
-msgid "Invalid targetServerType value: {0}"
+msgid "The hostname {0} could not be verified by hostnameverifier {1}."
msgstr ""
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:152
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:228
+#: org/postgresql/ssl/MakeSSL.java:93
#, java-format
-msgid "Could not find a server with specified targetServerType: {0}"
+msgid "The hostname {0} could not be verified."
msgstr ""
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:172
-msgid ""
-"Connection refused. Check that the hostname and port are correct and that "
-"the postmaster is accepting TCP/IP connections."
+#: org/postgresql/gss/GssAction.java:126
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2550
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2581
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2585
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2640
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2650
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2659
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:655
+msgid "Protocol error. Session setup failed."
msgstr ""
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:181
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:262
-msgid "The connection attempt failed."
+#: org/postgresql/gss/GssAction.java:137 org/postgresql/gss/MakeGSS.java:66
+#: org/postgresql/gss/MakeGSS.java:74
+msgid "GSS Authentication failed"
msgstr ""
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:192
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:273
-msgid "The connection url is invalid."
+#: org/postgresql/core/Parser.java:933
+#, java-format
+msgid "Malformed function or procedure escape syntax at offset {0}."
msgstr ""
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:218
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:233
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:324
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:339
-msgid "The server does not support SSL."
+#: org/postgresql/core/SocketFactoryFactory.java:41
+#, java-format
+msgid "The SocketFactory class provided {0} could not be instantiated."
msgstr ""
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:249
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:355
-msgid "An error occurred while setting up the SSL connection."
+#: org/postgresql/core/Utils.java:93 org/postgresql/core/Utils.java:110
+msgid "Zero bytes may not occur in string parameters."
msgstr ""
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:300
-#, java-format
-msgid "Connection rejected: {0}."
+#: org/postgresql/core/Utils.java:120 org/postgresql/core/Utils.java:170
+msgid "No IOException expected from StringBuffer or StringBuilder"
msgstr ""
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:321
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:349
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:375
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:456
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:486
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:515
-msgid ""
-"The server requested password-based authentication, but no password was "
-"provided."
+#: org/postgresql/core/Utils.java:159
+msgid "Zero bytes may not occur in identifiers."
msgstr ""
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:405
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:625
+#: org/postgresql/core/UTF8Encoding.java:28
#, java-format
msgid ""
-"The authentication type {0} is not supported. Check that you have configured "
-"the pg_hba.conf file to include the client''s IP address or subnet, and that "
-"it is using an authentication scheme supported by the driver."
+"Illegal UTF-8 sequence: byte {0} of {1} byte sequence is not 10xxxxxx: {2}"
msgstr ""
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:412
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:455
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:632
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:688
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:744
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:754
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:763
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:774
-#: org/postgresql/gss/GssAction.java:130
-msgid "Protocol error. Session setup failed."
+#: org/postgresql/core/UTF8Encoding.java:66
+#, java-format
+msgid "Illegal UTF-8 sequence: {0} bytes used to encode a {1} byte value: {2}"
msgstr ""
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:443
+#: org/postgresql/core/UTF8Encoding.java:102
+#: org/postgresql/core/UTF8Encoding.java:129
#, java-format
-msgid "Backend start-up failed: {0}."
+msgid "Illegal UTF-8 sequence: initial byte is {0}: {1}"
msgstr ""
-#: org/postgresql/core/v2/FastpathParameterList.java:63
-#: org/postgresql/core/v2/FastpathParameterList.java:89
-#: org/postgresql/core/v2/FastpathParameterList.java:100
-#: org/postgresql/core/v2/FastpathParameterList.java:111
-#: org/postgresql/core/v2/SimpleParameterList.java:70
-#: org/postgresql/core/v2/SimpleParameterList.java:94
-#: org/postgresql/core/v2/SimpleParameterList.java:105
-#: org/postgresql/core/v2/SimpleParameterList.java:116
-#: org/postgresql/core/v2/SimpleParameterList.java:127
-#: org/postgresql/core/v3/CompositeParameterList.java:36
-#: org/postgresql/core/v3/SimpleParameterList.java:53
-#: org/postgresql/core/v3/SimpleParameterList.java:64
-#: org/postgresql/jdbc/PgResultSet.java:2715
-#: org/postgresql/jdbc/PgResultSetMetaData.java:472
+#: org/postgresql/core/UTF8Encoding.java:135
#, java-format
-msgid "The column index is out of range: {0}, number of columns: {1}."
+msgid "Illegal UTF-8 sequence: final value is out of range: {0}"
msgstr ""
-#: org/postgresql/core/v2/FastpathParameterList.java:164
-#: org/postgresql/core/v2/SimpleParameterList.java:191
-#: org/postgresql/core/v3/SimpleParameterList.java:225
+#: org/postgresql/core/UTF8Encoding.java:151
#, java-format
-msgid "No value specified for parameter {0}."
+msgid "Illegal UTF-8 sequence: final value is a surrogate value: {0}"
+msgstr ""
+
+#: org/postgresql/core/SetupQueryRunner.java:64
+msgid "An unexpected result was returned by a query."
msgstr ""
-#: org/postgresql/core/v2/QueryExecutorImpl.java:87
-#: org/postgresql/core/v2/QueryExecutorImpl.java:347
-#: org/postgresql/core/v3/QueryExecutorImpl.java:404
-#: org/postgresql/core/v3/QueryExecutorImpl.java:465
+#: org/postgresql/core/PGStream.java:486
#, java-format
-msgid "Expected command status BEGIN, got {0}."
+msgid "Premature end of input stream, expected {0} bytes, but only read {1}."
msgstr ""
-#: org/postgresql/core/v2/QueryExecutorImpl.java:92
-#: org/postgresql/core/v3/QueryExecutorImpl.java:470
-#: org/postgresql/jdbc/PgResultSet.java:1731
+#: org/postgresql/core/PGStream.java:528
#, java-format
-msgid "Unexpected command status: {0}."
+msgid "Expected an EOF from server, got: {0}"
msgstr ""
-#: org/postgresql/core/v2/QueryExecutorImpl.java:127
-#: org/postgresql/core/v2/QueryExecutorImpl.java:136
-#: org/postgresql/core/v2/QueryExecutorImpl.java:185
-#: org/postgresql/core/v2/QueryExecutorImpl.java:376
-#: org/postgresql/core/v3/QueryExecutorImpl.java:226
-#: org/postgresql/core/v3/QueryExecutorImpl.java:364
-#: org/postgresql/core/v3/QueryExecutorImpl.java:441
-#: org/postgresql/core/v3/QueryExecutorImpl.java:505
-#: org/postgresql/core/v3/QueryExecutorImpl.java:587
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2211
-#: org/postgresql/util/StreamWrapper.java:133
-msgid "An I/O error occurred while sending to the backend."
+#: org/postgresql/core/v3/CopyOperationImpl.java:54
+msgid "CommandComplete expected COPY but got: "
msgstr ""
-#: org/postgresql/core/v2/QueryExecutorImpl.java:180
-#: org/postgresql/core/v2/QueryExecutorImpl.java:235
-#: org/postgresql/core/v2/QueryExecutorImpl.java:249
-#: org/postgresql/core/v3/QueryExecutorImpl.java:582
-#: org/postgresql/core/v3/QueryExecutorImpl.java:642
-#, java-format
-msgid "Unknown Response Type {0}."
+#: org/postgresql/core/v3/CopyInImpl.java:47
+msgid "CopyIn copy direction can't receive data"
msgstr ""
-#: org/postgresql/core/v2/QueryExecutorImpl.java:453
-#: org/postgresql/core/v2/QueryExecutorImpl.java:503
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1962
-msgid "Ran out of memory retrieving query results."
+#: org/postgresql/core/v3/QueryExecutorImpl.java:161
+msgid "Tried to obtain lock while already holding it"
msgstr ""
-#: org/postgresql/core/v2/QueryExecutorImpl.java:640
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2328
-#, java-format
-msgid "Unable to interpret the update count in command completion tag: {0}."
+#: org/postgresql/core/v3/QueryExecutorImpl.java:177
+msgid "Tried to break lock on database connection"
msgstr ""
-#: org/postgresql/core/v2/QueryExecutorImpl.java:654
-msgid "Copy not implemented for protocol version 2"
+#: org/postgresql/core/v3/QueryExecutorImpl.java:195
+msgid "Interrupted while waiting to obtain lock on database connection"
msgstr ""
-#: org/postgresql/core/v2/SocketFactoryFactory.java:36
-#, java-format
-msgid "The SocketFactory class provided {0} could not be instantiated."
+#: org/postgresql/core/v3/QueryExecutorImpl.java:327
+msgid "Unable to bind parameter values for statement."
msgstr ""
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:253
-#, java-format
-msgid ""
-"Connection to {0} refused. Check that the hostname and port are correct and "
-"that the postmaster is accepting TCP/IP connections."
+#: org/postgresql/core/v3/QueryExecutorImpl.java:333
+#: org/postgresql/core/v3/QueryExecutorImpl.java:485
+#: org/postgresql/core/v3/QueryExecutorImpl.java:559
+#: org/postgresql/core/v3/QueryExecutorImpl.java:602
+#: org/postgresql/core/v3/QueryExecutorImpl.java:729
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2372
+#: org/postgresql/util/StreamWrapper.java:130
+msgid "An I/O error occurred while sending to the backend."
msgstr ""
-#: org/postgresql/core/v3/CopyOperationImpl.java:57
-msgid "CommandComplete expected COPY but got: "
+#: org/postgresql/core/v3/QueryExecutorImpl.java:534
+#: org/postgresql/core/v3/QueryExecutorImpl.java:576
+#, java-format
+msgid "Expected command status BEGIN, got {0}."
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:83
-msgid "Tried to obtain lock while already holding it"
+#: org/postgresql/core/v3/QueryExecutorImpl.java:581
+#: org/postgresql/jdbc/PgResultSet.java:1778
+#, java-format
+msgid "Unexpected command status: {0}."
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:98
-msgid "Tried to break lock on database connection"
+#: org/postgresql/core/v3/QueryExecutorImpl.java:687
+msgid "An error occurred while trying to get the socket timeout."
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:115
-msgid "Interrupted while waiting to obtain lock on database connection"
+#: org/postgresql/core/v3/QueryExecutorImpl.java:722
+#: org/postgresql/core/v3/QueryExecutorImpl.java:798
+#, java-format
+msgid "Unknown Response Type {0}."
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:220
-msgid "Unable to bind parameter values for statement."
+#: org/postgresql/core/v3/QueryExecutorImpl.java:745
+msgid "An error occurred while trying to reset the socket timeout."
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:689
+#: org/postgresql/core/v3/QueryExecutorImpl.java:843
msgid "Database connection failed when starting copy"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:724
+#: org/postgresql/core/v3/QueryExecutorImpl.java:878
msgid "Tried to cancel an inactive copy operation"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:765
+#: org/postgresql/core/v3/QueryExecutorImpl.java:917
msgid "Database connection failed when canceling copy operation"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:781
+#: org/postgresql/core/v3/QueryExecutorImpl.java:933
msgid "Missing expected error response to copy cancel request"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:785
+#: org/postgresql/core/v3/QueryExecutorImpl.java:937
#, java-format
msgid "Got {0} error responses to single copy cancel request"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:800
+#: org/postgresql/core/v3/QueryExecutorImpl.java:952
msgid "Tried to end inactive copy"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:815
+#: org/postgresql/core/v3/QueryExecutorImpl.java:967
msgid "Database connection failed when ending copy"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:833
-#: org/postgresql/core/v3/QueryExecutorImpl.java:855
+#: org/postgresql/core/v3/QueryExecutorImpl.java:985
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1005
msgid "Tried to write to an inactive copy operation"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:848
-#: org/postgresql/core/v3/QueryExecutorImpl.java:863
+#: org/postgresql/core/v3/QueryExecutorImpl.java:998
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1013
msgid "Database connection failed when writing to copy"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:877
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1028
msgid "Tried to read from inactive copy"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:884
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1035
msgid "Database connection failed when reading from copy"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:956
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1101
#, java-format
msgid "Received CommandComplete ''{0}'' without an active copy operation"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:983
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1126
#, java-format
msgid "Got CopyInResponse from server during an active {0}"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:999
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1140
#, java-format
msgid "Got CopyOutResponse from server during an active {0}"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1017
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1154
+#, java-format
+msgid "Got CopyBothResponse from server during an active {0}"
+msgstr ""
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1170
msgid "Got CopyData without an active copy operation"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1021
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1174
#, java-format
msgid "Unexpected copydata from server for {0}"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1061
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2037
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1234
+#, java-format
+msgid "Unexpected packet type during copy: {0}"
+msgstr ""
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1524
+#, java-format
+msgid ""
+"Bind message length {0} too long. This can be caused by very large or "
+"incorrect length specifications on InputStream parameters."
+msgstr ""
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2145
+msgid "Ran out of memory retrieving query results."
+msgstr ""
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2313
+msgid "The driver currently does not support COPY operations."
+msgstr ""
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2487
+#, java-format
+msgid "Unable to parse the count in command completion tag: {0}."
+msgstr ""
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2603
#, java-format
msgid ""
"The server''s client_encoding parameter was changed to {0}. The JDBC driver "
"requires client_encoding to be UTF8 for correct operation."
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1069
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2045
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2611
#, java-format
msgid ""
"The server''s DateStyle parameter was changed to {0}. The JDBC driver "
"requires DateStyle to begin with ISO for correct operation."
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1083
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2059
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2624
#, java-format
msgid ""
"The server''s standard_conforming_strings parameter was reported as {0}. The "
"JDBC driver expected on or off."
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1122
+#: org/postgresql/core/v3/SimpleParameterList.java:54
+#: org/postgresql/core/v3/SimpleParameterList.java:65
+#: org/postgresql/core/v3/CompositeParameterList.java:33
+#: org/postgresql/jdbc/PgResultSetMetaData.java:493
+#: org/postgresql/jdbc/PgResultSet.java:2751
#, java-format
-msgid "Unexpected packet type during copy: {0}"
+msgid "The column index is out of range: {0}, number of columns: {1}."
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1393
+#: org/postgresql/core/v3/SimpleParameterList.java:257
#, java-format
-msgid ""
-"Bind message length {0} too long. This can be caused by very large or "
-"incorrect length specifications on InputStream parameters."
+msgid "No value specified for parameter {0}."
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2131
-msgid "The driver currently does not support COPY operations."
+#: org/postgresql/core/v3/SimpleParameterList.java:431
+#, java-format
+msgid "Added parameters index out of range: {0}, number of columns: {1}."
msgstr ""
-#: org/postgresql/Driver.java:234
-msgid "Error loading default settings from driverconfig.properties"
+#: org/postgresql/core/v3/replication/V3ReplicationProtocol.java:133
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:257
+msgid "The connection attempt failed."
msgstr ""
-#: org/postgresql/Driver.java:247
-msgid "Properties for the driver contains a non-string value for the key "
+#: org/postgresql/core/v3/replication/V3PGReplicationStream.java:144
+#, java-format
+msgid "Unexpected packet type during replication: {0}"
msgstr ""
-#: org/postgresql/Driver.java:290
-msgid ""
-"Your security policy has prevented the connection from being attempted. You "
-"probably need to grant the connect java.net.SocketPermission to the database "
-"server host and port that you wish to connect to."
+#: org/postgresql/core/v3/replication/V3PGReplicationStream.java:269
+msgid "This replication stream has been closed."
msgstr ""
-#: org/postgresql/Driver.java:296 org/postgresql/Driver.java:362
-msgid ""
-"Something unusual has occurred to cause the driver to fail. Please report "
-"this exception."
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:109
+#, java-format
+msgid "Invalid sslmode value: {0}"
msgstr ""
-#: org/postgresql/Driver.java:370
-msgid "Connection attempt timed out."
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:124
+#, java-format
+msgid "Invalid targetServerType value: {0}"
msgstr ""
-#: org/postgresql/Driver.java:383
-msgid "Interrupted while attempting to connect."
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:246
+#, java-format
+msgid ""
+"Connection to {0} refused. Check that the hostname and port are correct and "
+"that the postmaster is accepting TCP/IP connections."
msgstr ""
-#: org/postgresql/Driver.java:645
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:272
#, java-format
-msgid "Method {0} is not yet implemented."
+msgid "Could not find a server with specified targetServerType: {0}"
msgstr ""
-#: org/postgresql/ds/common/BaseDataSource.java:1037
-#: org/postgresql/ds/common/BaseDataSource.java:1047
-#, java-format
-msgid "Unsupported property name: {0}"
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:366
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:379
+msgid "The server does not support SSL."
msgstr ""
-#: org/postgresql/ds/PGPooledConnection.java:118
-msgid "This PooledConnection has already been closed."
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:393
+msgid "An error occurred while setting up the SSL connection."
msgstr ""
-#: org/postgresql/ds/PGPooledConnection.java:313
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:494
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:521
msgid ""
-"Connection has been closed automatically because a new connection was opened "
-"for the same PooledConnection or the PooledConnection has been closed."
+"The server requested password-based authentication, but no password was "
+"provided."
msgstr ""
-#: org/postgresql/ds/PGPooledConnection.java:314
-msgid "Connection has been closed."
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:624
+msgid ""
+"SCRAM authentication is not supported by this driver. You need JDK >= 8 and "
+"pgjdbc >= 42.2.0 (not \".jre\" vesions)"
msgstr ""
-#: org/postgresql/ds/PGPooledConnection.java:418
-msgid "Statement has been closed."
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:648
+#, java-format
+msgid ""
+"The authentication type {0} is not supported. Check that you have configured "
+"the pg_hba.conf file to include the client''s IP address or subnet, and that "
+"it is using an authentication scheme supported by the driver."
msgstr ""
-#: org/postgresql/ds/PGPoolingDataSource.java:269
-msgid "Failed to setup DataSource."
+#: org/postgresql/core/ConnectionFactory.java:57
+#, java-format
+msgid "A connection could not be made using the requested protocol {0}."
msgstr ""
-#: org/postgresql/ds/PGPoolingDataSource.java:371
-msgid "DataSource has been closed."
+#: org/postgresql/core/Oid.java:116
+#, java-format
+msgid "oid type {0} not known and not a number"
msgstr ""
-#: org/postgresql/fastpath/Fastpath.java:82
-#, java-format
-msgid "Fastpath call {0} - No result was returned and we expected a numeric."
+#: org/postgresql/util/HStoreConverter.java:43
+#: org/postgresql/util/HStoreConverter.java:74
+#: org/postgresql/jdbc/PgArray.java:210
+#: org/postgresql/jdbc/PgResultSet.java:1924
+msgid ""
+"Invalid character data was found. This is most likely caused by stored data "
+"containing characters that are invalid for the character set the database "
+"was created in. The most common example of this is storing 8bit data in a "
+"SQL_ASCII database."
msgstr ""
-#: org/postgresql/fastpath/Fastpath.java:165
-#, java-format
-msgid "Fastpath call {0} - No result was returned and we expected an integer."
+#: org/postgresql/util/PGmoney.java:62
+msgid "Conversion of money failed."
msgstr ""
-#: org/postgresql/fastpath/Fastpath.java:174
-#, java-format
-msgid ""
-"Fastpath call {0} - No result was returned or wrong size while expecting an "
-"integer."
+#: org/postgresql/util/StreamWrapper.java:56
+#: org/postgresql/jdbc/PgPreparedStatement.java:1449
+msgid "Object is too large to send over the protocol."
msgstr ""
-#: org/postgresql/fastpath/Fastpath.java:191
-#, java-format
-msgid "Fastpath call {0} - No result was returned and we expected a long."
+#: org/postgresql/util/PGInterval.java:152
+msgid "Conversion of interval failed"
msgstr ""
-#: org/postgresql/fastpath/Fastpath.java:200
+#: org/postgresql/util/ServerErrorMessage.java:45
#, java-format
msgid ""
-"Fastpath call {0} - No result was returned or wrong size while expecting a "
-"long."
+" (pgjdbc: autodetected server-encoding to be {0}, if the message is not "
+"readable, please check database logs and/or host, port, dbname, user, "
+"password, pg_hba.conf)"
msgstr ""
-#: org/postgresql/fastpath/Fastpath.java:312
+#: org/postgresql/util/ServerErrorMessage.java:176
#, java-format
-msgid "The fastpath function {0} is unknown."
+msgid "Detail: {0}"
msgstr ""
-#: org/postgresql/geometric/PGbox.java:79
-#: org/postgresql/geometric/PGcircle.java:76
-#: org/postgresql/geometric/PGcircle.java:84
-#: org/postgresql/geometric/PGline.java:109
-#: org/postgresql/geometric/PGline.java:118
-#: org/postgresql/geometric/PGlseg.java:72
-#: org/postgresql/geometric/PGpoint.java:78
+#: org/postgresql/util/ServerErrorMessage.java:181
#, java-format
-msgid "Conversion to type {0} failed: {1}."
+msgid "Hint: {0}"
msgstr ""
-#: org/postgresql/geometric/PGpath.java:73
+#: org/postgresql/util/ServerErrorMessage.java:185
#, java-format
-msgid "Cannot tell if path is open or closed: {0}."
+msgid "Position: {0}"
msgstr ""
-#: org/postgresql/gss/GssAction.java:141 org/postgresql/gss/MakeGSS.java:69
-#: org/postgresql/gss/MakeGSS.java:77
-msgid "GSS Authentication failed"
+#: org/postgresql/util/ServerErrorMessage.java:189
+#, java-format
+msgid "Where: {0}"
msgstr ""
-#: org/postgresql/jdbc/AbstractBlobClob.java:89
-msgid ""
-"Truncation of large objects is only implemented in 8.3 and later servers."
+#: org/postgresql/util/ServerErrorMessage.java:195
+#, java-format
+msgid "Internal Query: {0}"
msgstr ""
-#: org/postgresql/jdbc/AbstractBlobClob.java:94
-msgid "Cannot truncate LOB to a negative length."
+#: org/postgresql/util/ServerErrorMessage.java:199
+#, java-format
+msgid "Internal Position: {0}"
msgstr ""
-#: org/postgresql/jdbc/AbstractBlobClob.java:101
-#: org/postgresql/jdbc/AbstractBlobClob.java:245
+#: org/postgresql/util/ServerErrorMessage.java:206
#, java-format
-msgid "PostgreSQL LOBs can only index to: {0}"
+msgid "Location: File: {0}, Routine: {1}, Line: {2}"
msgstr ""
-#: org/postgresql/jdbc/AbstractBlobClob.java:241
-msgid "LOB positioning offsets start at 1."
+#: org/postgresql/util/ServerErrorMessage.java:211
+#, java-format
+msgid "Server SQLState: {0}"
msgstr ""
-#: org/postgresql/jdbc/AbstractBlobClob.java:257
-msgid "free() was called on this LOB previously"
+#: org/postgresql/ds/PGPoolingDataSource.java:269
+msgid "Failed to setup DataSource."
msgstr ""
-#: org/postgresql/jdbc/BatchResultHandler.java:41
-#: org/postgresql/jdbc/PgConnection.java:474
-#: org/postgresql/jdbc/PgPreparedStatement.java:138
-#: org/postgresql/jdbc/PgStatement.java:299
-msgid "A result was returned when none was expected."
+#: org/postgresql/ds/PGPoolingDataSource.java:371
+msgid "DataSource has been closed."
msgstr ""
-#: org/postgresql/jdbc/BatchResultHandler.java:59
-msgid "Too many update results were returned."
+#: org/postgresql/ds/common/BaseDataSource.java:1132
+#: org/postgresql/ds/common/BaseDataSource.java:1142
+#, java-format
+msgid "Unsupported property name: {0}"
msgstr ""
-#: org/postgresql/jdbc/BatchResultHandler.java:88
+#: org/postgresql/ds/PGPooledConnection.java:118
+msgid "This PooledConnection has already been closed."
+msgstr ""
+
+#: org/postgresql/ds/PGPooledConnection.java:314
+msgid ""
+"Connection has been closed automatically because a new connection was opened "
+"for the same PooledConnection or the PooledConnection has been closed."
+msgstr ""
+
+#: org/postgresql/ds/PGPooledConnection.java:315
+msgid "Connection has been closed."
+msgstr ""
+
+#: org/postgresql/ds/PGPooledConnection.java:420
+msgid "Statement has been closed."
+msgstr ""
+
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:68
+msgid "No SCRAM mechanism(s) advertised by the server"
+msgstr ""
+
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:81
+msgid "Invalid or unsupported by client SCRAM mechanisms"
+msgstr ""
+
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:117
+#, java-format
+msgid "Invalid server-first-message: {0}"
+msgstr ""
+
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:147
+#, java-format
+msgid "Invalid server-final-message: {0}"
+msgstr ""
+
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:153
+#, java-format
+msgid "SCRAM authentication failed, server returned error: {0}"
+msgstr ""
+
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:160
+msgid "Invalid server SCRAM signature"
+msgstr ""
+
+#: org/postgresql/osgi/PGDataSourceFactory.java:82
#, java-format
+msgid "Unsupported properties: {0}"
+msgstr ""
+
+#: org/postgresql/Driver.java:214
+msgid "Error loading default settings from driverconfig.properties"
+msgstr ""
+
+#: org/postgresql/Driver.java:226
+msgid "Properties for the driver contains a non-string value for the key "
+msgstr ""
+
+#: org/postgresql/Driver.java:270
+msgid ""
+"Your security policy has prevented the connection from being attempted. You "
+"probably need to grant the connect java.net.SocketPermission to the database "
+"server host and port that you wish to connect to."
+msgstr ""
+
+#: org/postgresql/Driver.java:276 org/postgresql/Driver.java:408
msgid ""
-"Batch entry {0} {1} was aborted. Call getNextException to see the cause."
+"Something unusual has occurred to cause the driver to fail. Please report "
+"this exception."
+msgstr ""
+
+#: org/postgresql/Driver.java:416
+msgid "Connection attempt timed out."
msgstr ""
-#: org/postgresql/jdbc/EscapedFunctions.java:243
+#: org/postgresql/Driver.java:429
+msgid "Interrupted while attempting to connect."
+msgstr ""
+
+#: org/postgresql/Driver.java:682
#, java-format
-msgid "{0} function takes four and only four argument."
+msgid "Method {0} is not yet implemented."
msgstr ""
-#: org/postgresql/jdbc/EscapedFunctions.java:273
-#: org/postgresql/jdbc/EscapedFunctions.java:347
-#: org/postgresql/jdbc/EscapedFunctions.java:752
-#: org/postgresql/jdbc/EscapedFunctions.java:790
+#: org/postgresql/geometric/PGlseg.java:70
+#: org/postgresql/geometric/PGline.java:107
+#: org/postgresql/geometric/PGline.java:116
+#: org/postgresql/geometric/PGcircle.java:74
+#: org/postgresql/geometric/PGcircle.java:82
+#: org/postgresql/geometric/PGpoint.java:76
+#: org/postgresql/geometric/PGbox.java:77
#, java-format
-msgid "{0} function takes two and only two arguments."
+msgid "Conversion to type {0} failed: {1}."
msgstr ""
-#: org/postgresql/jdbc/EscapedFunctions.java:291
-#: org/postgresql/jdbc/EscapedFunctions.java:329
-#: org/postgresql/jdbc/EscapedFunctions.java:449
-#: org/postgresql/jdbc/EscapedFunctions.java:464
-#: org/postgresql/jdbc/EscapedFunctions.java:479
-#: org/postgresql/jdbc/EscapedFunctions.java:494
-#: org/postgresql/jdbc/EscapedFunctions.java:509
-#: org/postgresql/jdbc/EscapedFunctions.java:524
-#: org/postgresql/jdbc/EscapedFunctions.java:539
-#: org/postgresql/jdbc/EscapedFunctions.java:554
-#: org/postgresql/jdbc/EscapedFunctions.java:569
-#: org/postgresql/jdbc/EscapedFunctions.java:584
-#: org/postgresql/jdbc/EscapedFunctions.java:599
-#: org/postgresql/jdbc/EscapedFunctions.java:614
-#: org/postgresql/jdbc/EscapedFunctions.java:778
+#: org/postgresql/geometric/PGpath.java:70
#, java-format
-msgid "{0} function takes one and only one argument."
+msgid "Cannot tell if path is open or closed: {0}."
msgstr ""
-#: org/postgresql/jdbc/EscapedFunctions.java:313
-#: org/postgresql/jdbc/EscapedFunctions.java:394
+#: org/postgresql/xa/PGXAConnection.java:128
+msgid ""
+"Transaction control methods setAutoCommit(true), commit, rollback and "
+"setSavePoint not allowed while an XA transaction is active."
+msgstr ""
+
+#: org/postgresql/xa/PGXAConnection.java:177
+#: org/postgresql/xa/PGXAConnection.java:253
+#: org/postgresql/xa/PGXAConnection.java:347
#, java-format
-msgid "{0} function takes two or three arguments."
+msgid "Invalid flags {0}"
msgstr ""
-#: org/postgresql/jdbc/EscapedFunctions.java:419
-#: org/postgresql/jdbc/EscapedFunctions.java:434
-#: org/postgresql/jdbc/EscapedFunctions.java:737
-#: org/postgresql/jdbc/EscapedFunctions.java:767
+#: org/postgresql/xa/PGXAConnection.java:181
+#: org/postgresql/xa/PGXAConnection.java:257
+#: org/postgresql/xa/PGXAConnection.java:449
+msgid "xid must not be null"
+msgstr ""
+
+#: org/postgresql/xa/PGXAConnection.java:185
+msgid "Connection is busy with another transaction"
+msgstr ""
+
+#: org/postgresql/xa/PGXAConnection.java:194
+#: org/postgresql/xa/PGXAConnection.java:267
+msgid "suspend/resume not implemented"
+msgstr ""
+
+#: org/postgresql/xa/PGXAConnection.java:202
+#: org/postgresql/xa/PGXAConnection.java:209
+#: org/postgresql/xa/PGXAConnection.java:213
#, java-format
-msgid "{0} function doesn''t take any argument."
+msgid ""
+"Invalid protocol state requested. Attempted transaction interleaving is not "
+"supported. xid={0}, currentXid={1}, state={2}, flags={3}"
+msgstr ""
+
+#: org/postgresql/xa/PGXAConnection.java:224
+msgid "Error disabling autocommit"
msgstr ""
-#: org/postgresql/jdbc/EscapedFunctions.java:630
-#: org/postgresql/jdbc/EscapedFunctions.java:683
+#: org/postgresql/xa/PGXAConnection.java:261
#, java-format
-msgid "{0} function takes three and only three arguments."
+msgid ""
+"tried to call end without corresponding start call. state={0}, start "
+"xid={1}, currentXid={2}, preparedXid={3}"
msgstr ""
-#: org/postgresql/jdbc/EscapedFunctions.java:643
-#: org/postgresql/jdbc/EscapedFunctions.java:664
-#: org/postgresql/jdbc/EscapedFunctions.java:667
-#: org/postgresql/jdbc/EscapedFunctions.java:700
-#: org/postgresql/jdbc/EscapedFunctions.java:713
-#: org/postgresql/jdbc/EscapedFunctions.java:716
+#: org/postgresql/xa/PGXAConnection.java:297
#, java-format
-msgid "Interval {0} not yet implemented"
+msgid ""
+"Preparing already prepared transaction, the prepared xid {0}, prepare xid={1}"
msgstr ""
-#: org/postgresql/jdbc/PgArray.java:166 org/postgresql/jdbc/PgArray.java:822
+#: org/postgresql/xa/PGXAConnection.java:300
#, java-format
-msgid "The array index is out of range: {0}"
+msgid "Current connection does not have an associated xid. prepare xid={0}"
msgstr ""
-#: org/postgresql/jdbc/PgArray.java:183 org/postgresql/jdbc/PgArray.java:839
+#: org/postgresql/xa/PGXAConnection.java:307
#, java-format
-msgid "The array index is out of range: {0}, number of elements: {1}."
+msgid ""
+"Not implemented: Prepare must be issued using the same connection that "
+"started the transaction. currentXid={0}, prepare xid={1}"
+msgstr ""
+
+#: org/postgresql/xa/PGXAConnection.java:311
+#, java-format
+msgid "Prepare called before end. prepare xid={0}, state={1}"
+msgstr ""
+
+#: org/postgresql/xa/PGXAConnection.java:331
+#, java-format
+msgid "Error preparing transaction. prepare xid={0}"
+msgstr ""
+
+#: org/postgresql/xa/PGXAConnection.java:382
+msgid "Error during recover"
msgstr ""
-#: org/postgresql/jdbc/PgArray.java:215
-#: org/postgresql/jdbc/PgResultSet.java:1885
-#: org/postgresql/util/HStoreConverter.java:38
-#: org/postgresql/util/HStoreConverter.java:69
+#: org/postgresql/xa/PGXAConnection.java:438
+#, java-format
msgid ""
-"Invalid character data was found. This is most likely caused by stored data "
-"containing characters that are invalid for the character set the database "
-"was created in. The most common example of this is storing 8bit data in a "
-"SQL_ASCII database."
+"Error rolling back prepared transaction. rollback xid={0}, preparedXid={1}, "
+"currentXid={2}"
msgstr ""
-#: org/postgresql/jdbc/PgCallableStatement.java:90
-#: org/postgresql/jdbc/PgCallableStatement.java:96
-msgid "A CallableStatement was executed with nothing returned."
+#: org/postgresql/xa/PGXAConnection.java:471
+#, java-format
+msgid ""
+"One-phase commit called for xid {0} but connection was prepared with xid {1}"
msgstr ""
-#: org/postgresql/jdbc/PgCallableStatement.java:107
-msgid "A CallableStatement was executed with an invalid number of parameters"
+#: org/postgresql/xa/PGXAConnection.java:479
+msgid ""
+"Not implemented: one-phase commit must be issued using the same connection "
+"that was used to start it"
msgstr ""
-#: org/postgresql/jdbc/PgCallableStatement.java:139
+#: org/postgresql/xa/PGXAConnection.java:483
#, java-format
+msgid "One-phase commit with unknown xid. commit xid={0}, currentXid={1}"
+msgstr ""
+
+#: org/postgresql/xa/PGXAConnection.java:487
+#, java-format
+msgid "commit called before end. commit xid={0}, state={1}"
+msgstr ""
+
+#: org/postgresql/xa/PGXAConnection.java:498
+#, java-format
+msgid "Error during one-phase commit. commit xid={0}"
+msgstr ""
+
+#: org/postgresql/xa/PGXAConnection.java:517
msgid ""
-"A CallableStatement function was executed and the out parameter {0} was of "
-"type {1} however type {2} was registered."
+"Not implemented: 2nd phase commit must be issued using an idle connection. "
+"commit xid={0}, currentXid={1}, state={2], transactionState={3}"
msgstr ""
-#: org/postgresql/jdbc/PgCallableStatement.java:195
+#: org/postgresql/xa/PGXAConnection.java:550
+#, java-format
msgid ""
-"This statement does not declare an OUT parameter. Use '{' ?= call ... '}' "
-"to declare one."
+"Error committing prepared transaction. commit xid={0}, preparedXid={1}, "
+"currentXid={2}"
msgstr ""
-#: org/postgresql/jdbc/PgCallableStatement.java:239
-msgid "wasNull cannot be call before fetching a result."
+#: org/postgresql/xa/PGXAConnection.java:567
+#, java-format
+msgid "Heuristic commit/rollback not supported. forget xid={0}"
+msgstr ""
+
+#: org/postgresql/jdbc/PgSQLXML.java:147
+msgid "Unable to decode xml data."
msgstr ""
-#: org/postgresql/jdbc/PgCallableStatement.java:377
-#: org/postgresql/jdbc/PgCallableStatement.java:396
+#: org/postgresql/jdbc/PgSQLXML.java:150
+#, java-format
+msgid "Unknown XML Source class: {0}"
+msgstr ""
+
+#: org/postgresql/jdbc/PgSQLXML.java:193
+msgid "Unable to create SAXResult for SQLXML."
+msgstr ""
+
+#: org/postgresql/jdbc/PgSQLXML.java:208
+msgid "Unable to create StAXResult for SQLXML"
+msgstr ""
+
+#: org/postgresql/jdbc/PgSQLXML.java:213
#, java-format
+msgid "Unknown XML Result class: {0}"
+msgstr ""
+
+#: org/postgresql/jdbc/PgSQLXML.java:225
+msgid "This SQLXML object has already been freed."
+msgstr ""
+
+#: org/postgresql/jdbc/PgSQLXML.java:234
msgid ""
-"Parameter of type {0} was registered, but call to get{1} (sqltype={2}) was "
-"made."
+"This SQLXML object has not been initialized, so you cannot retrieve data "
+"from it."
+msgstr ""
+
+#: org/postgresql/jdbc/PgSQLXML.java:247
+#, java-format
+msgid "Failed to convert binary xml data to encoding: {0}."
+msgstr ""
+
+#: org/postgresql/jdbc/PgSQLXML.java:273
+msgid "Unable to convert DOMResult SQLXML data to a string."
msgstr ""
-#: org/postgresql/jdbc/PgCallableStatement.java:417
+#: org/postgresql/jdbc/PgSQLXML.java:287
msgid ""
-"A CallableStatement was declared, but no call to registerOutParameter(1, "
-"<some type>) was made."
+"This SQLXML object has already been initialized, so you cannot manipulate it "
+"further."
msgstr ""
-#: org/postgresql/jdbc/PgCallableStatement.java:423
-msgid "No function outputs were registered."
+#: org/postgresql/jdbc/PSQLSavepoint.java:37
+#: org/postgresql/jdbc/PSQLSavepoint.java:51
+#: org/postgresql/jdbc/PSQLSavepoint.java:69
+msgid "Cannot reference a savepoint after it has been released."
+msgstr ""
+
+#: org/postgresql/jdbc/PSQLSavepoint.java:42
+msgid "Cannot retrieve the id of a named savepoint."
+msgstr ""
+
+#: org/postgresql/jdbc/PSQLSavepoint.java:56
+msgid "Cannot retrieve the name of an unnamed savepoint."
+msgstr ""
+
+#: org/postgresql/jdbc/PgArray.java:157 org/postgresql/jdbc/PgArray.java:844
+#, java-format
+msgid "The array index is out of range: {0}"
+msgstr ""
+
+#: org/postgresql/jdbc/PgArray.java:178 org/postgresql/jdbc/PgArray.java:861
+#, java-format
+msgid "The array index is out of range: {0}, number of elements: {1}."
msgstr ""
-#: org/postgresql/jdbc/PgCallableStatement.java:429
+#: org/postgresql/jdbc/PgParameterMetaData.java:83
+#, java-format
+msgid "The parameter index is out of range: {0}, number of parameters: {1}."
+msgstr ""
+
+#: org/postgresql/jdbc/BatchResultHandler.java:92
+msgid "Too many update results were returned."
+msgstr ""
+
+#: org/postgresql/jdbc/BatchResultHandler.java:146
+#, java-format
msgid ""
-"Results cannot be retrieved from a CallableStatement before it is executed."
+"Batch entry {0} {1} was aborted: {2} Call getNextException to see other "
+"errors in the batch."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:312
+#: org/postgresql/jdbc/PgConnection.java:272
#, java-format
msgid "Unsupported value for stringtype parameter: {0}"
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:457
-#: org/postgresql/jdbc/PgPreparedStatement.java:115
-#: org/postgresql/jdbc/PgStatement.java:282
-#: org/postgresql/jdbc/TypeInfoCache.java:230
-#: org/postgresql/jdbc/TypeInfoCache.java:370
-#: org/postgresql/jdbc/TypeInfoCache.java:412
+#: org/postgresql/jdbc/PgConnection.java:424
+#: org/postgresql/jdbc/PgStatement.java:225
+#: org/postgresql/jdbc/TypeInfoCache.java:226
+#: org/postgresql/jdbc/TypeInfoCache.java:371
+#: org/postgresql/jdbc/TypeInfoCache.java:411
+#: org/postgresql/jdbc/TypeInfoCache.java:484
#: org/postgresql/jdbc/TypeInfoCache.java:489
-#: org/postgresql/jdbc/TypeInfoCache.java:494
-#: org/postgresql/jdbc/TypeInfoCache.java:535
-#: org/postgresql/jdbc/TypeInfoCache.java:540
+#: org/postgresql/jdbc/TypeInfoCache.java:526
+#: org/postgresql/jdbc/TypeInfoCache.java:531
+#: org/postgresql/jdbc/PgPreparedStatement.java:119
msgid "No results were returned by the query."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:578
+#: org/postgresql/jdbc/PgConnection.java:441
+#: org/postgresql/jdbc/PgStatement.java:254
+msgid "A result was returned when none was expected."
+msgstr ""
+
+#: org/postgresql/jdbc/PgConnection.java:545
msgid "Custom type maps are not supported."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:620
+#: org/postgresql/jdbc/PgConnection.java:587
#, java-format
msgid "Failed to create object for: {0}."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:672
+#: org/postgresql/jdbc/PgConnection.java:641
#, java-format
msgid "Unable to load the class {0} responsible for the datatype {1}"
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:724
+#: org/postgresql/jdbc/PgConnection.java:693
msgid ""
"Cannot change transaction read-only property in the middle of a transaction."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:775
+#: org/postgresql/jdbc/PgConnection.java:756
msgid "Cannot commit when autoCommit is enabled."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:786
-#: org/postgresql/jdbc/PgConnection.java:1358
-#: org/postgresql/jdbc/PgConnection.java:1395
+#: org/postgresql/jdbc/PgConnection.java:767
+#: org/postgresql/jdbc/PgConnection.java:1384
+#: org/postgresql/jdbc/PgConnection.java:1428
msgid "This connection has been closed."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:796
+#: org/postgresql/jdbc/PgConnection.java:777
msgid "Cannot rollback when autoCommit is enabled."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:870
+#: org/postgresql/jdbc/PgConnection.java:827
msgid ""
"Cannot change transaction isolation level in the middle of a transaction."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:876
+#: org/postgresql/jdbc/PgConnection.java:833
#, java-format
msgid "Transaction isolation level {0} not supported."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:921
+#: org/postgresql/jdbc/PgConnection.java:878
msgid "Finalizing a Connection that was never closed:"
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:1009
+#: org/postgresql/jdbc/PgConnection.java:945
msgid "Unable to translate data into the desired encoding."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:1081
-#: org/postgresql/jdbc/PgResultSet.java:1782
-#: org/postgresql/jdbc/PgStatement.java:1053
+#: org/postgresql/jdbc/PgConnection.java:1008
+#: org/postgresql/jdbc/PgStatement.java:903
+#: org/postgresql/jdbc/PgResultSet.java:1817
msgid "Fetch size must be a value greater to or equal to 0."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:1311
+#: org/postgresql/jdbc/PgConnection.java:1289
+#: org/postgresql/jdbc/PgConnection.java:1330
#, java-format
msgid "Unable to find server array type for provided name {0}."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:1327
+#: org/postgresql/jdbc/PgConnection.java:1312
+#, java-format
+msgid "Invalid elements {0}"
+msgstr ""
+
+#: org/postgresql/jdbc/PgConnection.java:1348
#, java-format
msgid "Invalid timeout ({0}<0)."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:1340
+#: org/postgresql/jdbc/PgConnection.java:1372
msgid "Validating connection."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:1375
+#: org/postgresql/jdbc/PgConnection.java:1405
#, java-format
msgid "Failed to set ClientInfo property: {0}"
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:1383
+#: org/postgresql/jdbc/PgConnection.java:1415
msgid "ClientInfo property not supported."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:1408
+#: org/postgresql/jdbc/PgConnection.java:1441
msgid "One ore more ClientInfo failed."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:1517
-#, java-format
-msgid "Unknown ResultSet holdability setting: {0}."
+#: org/postgresql/jdbc/PgConnection.java:1540
+msgid "Network timeout must be a value greater than or equal to 0."
+msgstr ""
+
+#: org/postgresql/jdbc/PgConnection.java:1552
+msgid "Unable to set network timeout."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:1531
-#: org/postgresql/jdbc/PgConnection.java:1554
-#: org/postgresql/jdbc/PgConnection.java:1576
-#: org/postgresql/jdbc/PgConnection.java:1587
-msgid "Server versions prior to 8.0 do not support savepoints."
+#: org/postgresql/jdbc/PgConnection.java:1563
+msgid "Unable to get network timeout."
+msgstr ""
+
+#: org/postgresql/jdbc/PgConnection.java:1580
+#, java-format
+msgid "Unknown ResultSet holdability setting: {0}."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:1535
-#: org/postgresql/jdbc/PgConnection.java:1558
+#: org/postgresql/jdbc/PgConnection.java:1598
+#: org/postgresql/jdbc/PgConnection.java:1619
msgid "Cannot establish a savepoint in auto-commit mode."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:1635
+#: org/postgresql/jdbc/PgConnection.java:1685
msgid "Returning autogenerated keys is not supported."
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:78
+#: org/postgresql/jdbc/PgStatement.java:235
+msgid "Multiple ResultSets were returned by the query."
+msgstr ""
+
+#: org/postgresql/jdbc/PgStatement.java:316
+msgid "Can''t use executeWithFlags(int) on a Statement."
+msgstr ""
+
+#: org/postgresql/jdbc/PgStatement.java:509
+msgid "Maximum number of rows must be a value grater than or equal to 0."
+msgstr ""
+
+#: org/postgresql/jdbc/PgStatement.java:550
+msgid "Query timeout must be a value greater than or equals to 0."
+msgstr ""
+
+#: org/postgresql/jdbc/PgStatement.java:590
+msgid "The maximum field size must be a value greater than or equal to 0."
+msgstr ""
+
+#: org/postgresql/jdbc/PgStatement.java:689
+msgid "This statement has been closed."
+msgstr ""
+
+#: org/postgresql/jdbc/PgStatement.java:895
+#: org/postgresql/jdbc/PgResultSet.java:878
+#, java-format
+msgid "Invalid fetch direction constant: {0}."
+msgstr ""
+
+#: org/postgresql/jdbc/PgStatement.java:1145
+#: org/postgresql/jdbc/PgStatement.java:1173
+msgid "Returning autogenerated keys by column index is not supported."
+msgstr ""
+
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:66
msgid ""
"Unable to determine a value for MaxIndexKeys due to missing system catalog "
"data."
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:100
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:89
msgid "Unable to find name datatype in the system catalogs."
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1117
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1028
msgid "proname"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1117
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1028
msgid "oid"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1119
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1714
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1030
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1481
msgid "typtype"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1122
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1033
msgid "proargtypes"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1732
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1499
msgid "adsrc"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1872
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1963
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1512
+msgid "attidentity"
+msgstr ""
+
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1608
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1684
msgid "rolname"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1873
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1964
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1609
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1685
msgid "relacl"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1878
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1615
msgid "attacl"
msgstr ""
-#: org/postgresql/jdbc/PgParameterMetaData.java:86
+#: org/postgresql/jdbc/AbstractBlobClob.java:78
+msgid ""
+"Truncation of large objects is only implemented in 8.3 and later servers."
+msgstr ""
+
+#: org/postgresql/jdbc/AbstractBlobClob.java:83
+msgid "Cannot truncate LOB to a negative length."
+msgstr ""
+
+#: org/postgresql/jdbc/AbstractBlobClob.java:90
+#: org/postgresql/jdbc/AbstractBlobClob.java:234
#, java-format
-msgid "The parameter index is out of range: {0}, number of parameters: {1}."
+msgid "PostgreSQL LOBs can only index to: {0}"
+msgstr ""
+
+#: org/postgresql/jdbc/AbstractBlobClob.java:230
+msgid "LOB positioning offsets start at 1."
+msgstr ""
+
+#: org/postgresql/jdbc/AbstractBlobClob.java:246
+msgid "free() was called on this LOB previously"
msgstr ""
-#: org/postgresql/jdbc/PgPreparedStatement.java:102
-#: org/postgresql/jdbc/PgPreparedStatement.java:128
-#: org/postgresql/jdbc/PgPreparedStatement.java:150
-#: org/postgresql/jdbc/PgPreparedStatement.java:1108
+#: org/postgresql/jdbc/PgPreparedStatement.java:106
+#: org/postgresql/jdbc/PgPreparedStatement.java:127
+#: org/postgresql/jdbc/PgPreparedStatement.java:139
+#: org/postgresql/jdbc/PgPreparedStatement.java:1035
msgid ""
"Can''t use query methods that take a query string on a PreparedStatement."
msgstr ""
-#: org/postgresql/jdbc/PgPreparedStatement.java:119
-#: org/postgresql/jdbc/PgStatement.java:286
-msgid "Multiple ResultSets were returned by the query."
-msgstr ""
-
-#: org/postgresql/jdbc/PgPreparedStatement.java:270
+#: org/postgresql/jdbc/PgPreparedStatement.java:249
msgid "Unknown Types value."
msgstr ""
-#: org/postgresql/jdbc/PgPreparedStatement.java:417
-#: org/postgresql/jdbc/PgPreparedStatement.java:486
-#: org/postgresql/jdbc/PgPreparedStatement.java:1251
-#: org/postgresql/jdbc/PgPreparedStatement.java:1583
+#: org/postgresql/jdbc/PgPreparedStatement.java:382
+#: org/postgresql/jdbc/PgPreparedStatement.java:439
+#: org/postgresql/jdbc/PgPreparedStatement.java:1191
+#: org/postgresql/jdbc/PgPreparedStatement.java:1490
#, java-format
msgid "Invalid stream length {0}."
msgstr ""
-#: org/postgresql/jdbc/PgPreparedStatement.java:447
+#: org/postgresql/jdbc/PgPreparedStatement.java:411
#, java-format
msgid "The JVM claims not to support the {0} encoding."
msgstr ""
-#: org/postgresql/jdbc/PgPreparedStatement.java:450
-#: org/postgresql/jdbc/PgPreparedStatement.java:519
-#: org/postgresql/jdbc/PgResultSet.java:1075
-#: org/postgresql/jdbc/PgResultSet.java:1109
+#: org/postgresql/jdbc/PgPreparedStatement.java:414
+#: org/postgresql/jdbc/PgResultSet.java:1122
+#: org/postgresql/jdbc/PgResultSet.java:1156
msgid "Provided InputStream failed."
msgstr ""
-#: org/postgresql/jdbc/PgPreparedStatement.java:536
-#: org/postgresql/jdbc/PgPreparedStatement.java:1170
+#: org/postgresql/jdbc/PgPreparedStatement.java:460
+#: org/postgresql/jdbc/PgPreparedStatement.java:1096
#, java-format
msgid "Unknown type {0}."
msgstr ""
-#: org/postgresql/jdbc/PgPreparedStatement.java:553
+#: org/postgresql/jdbc/PgPreparedStatement.java:477
msgid "No hstore extension installed."
msgstr ""
-#: org/postgresql/jdbc/PgPreparedStatement.java:683
-#: org/postgresql/jdbc/PgPreparedStatement.java:705
-#: org/postgresql/jdbc/PgPreparedStatement.java:715
-#: org/postgresql/jdbc/PgPreparedStatement.java:725
+#: org/postgresql/jdbc/PgPreparedStatement.java:619
+#: org/postgresql/jdbc/PgPreparedStatement.java:642
+#: org/postgresql/jdbc/PgPreparedStatement.java:652
+#: org/postgresql/jdbc/PgPreparedStatement.java:664
#, java-format
msgid "Cannot cast an instance of {0} to type {1}"
msgstr ""
-#: org/postgresql/jdbc/PgPreparedStatement.java:741
+#: org/postgresql/jdbc/PgPreparedStatement.java:682
#, java-format
msgid "Unsupported Types value: {0}"
msgstr ""
-#: org/postgresql/jdbc/PgPreparedStatement.java:970
+#: org/postgresql/jdbc/PgPreparedStatement.java:894
#, java-format
msgid "Cannot convert an instance of {0} to type {1}"
msgstr ""
-#: org/postgresql/jdbc/PgPreparedStatement.java:1040
+#: org/postgresql/jdbc/PgPreparedStatement.java:968
#, java-format
msgid ""
"Can''t infer the SQL type to use for an instance of {0}. Use setObject() "
"with an explicit Types value to specify the type to use."
msgstr ""
-#: org/postgresql/jdbc/PgPreparedStatement.java:1207
-#: org/postgresql/jdbc/PgPreparedStatement.java:1303
-#: org/postgresql/jdbc/PgPreparedStatement.java:1340
+#: org/postgresql/jdbc/PgPreparedStatement.java:1133
+#: org/postgresql/jdbc/PgPreparedStatement.java:1233
msgid "Unexpected error writing large object to database."
msgstr ""
-#: org/postgresql/jdbc/PgPreparedStatement.java:1278
-#: org/postgresql/jdbc/PgResultSet.java:1163
+#: org/postgresql/jdbc/PgPreparedStatement.java:1178
+#: org/postgresql/jdbc/PgResultSet.java:1210
msgid "Provided Reader failed."
msgstr ""
-#: org/postgresql/jdbc/PgPreparedStatement.java:1542
-#: org/postgresql/util/StreamWrapper.java:59
-msgid "Object is too large to send over the protocol."
+#: org/postgresql/jdbc/BooleanTypeUtil.java:99
+#, java-format
+msgid "Cannot cast to boolean: \"{0}\""
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:285
+#: org/postgresql/jdbc/PgResultSet.java:280
msgid ""
"Operation requires a scrollable ResultSet, but this ResultSet is "
"FORWARD_ONLY."
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:456
-msgid "Unexpected error while decoding character data from a large object."
-msgstr ""
-
-#: org/postgresql/jdbc/PgResultSet.java:507
-#: org/postgresql/jdbc/PgResultSet.java:537
-#: org/postgresql/jdbc/PgResultSet.java:570
-#: org/postgresql/jdbc/PgResultSet.java:2964
+#: org/postgresql/jdbc/PgResultSet.java:492
+#: org/postgresql/jdbc/PgResultSet.java:532
+#: org/postgresql/jdbc/PgResultSet.java:556
+#: org/postgresql/jdbc/PgResultSet.java:594
+#: org/postgresql/jdbc/PgResultSet.java:624
#: org/postgresql/jdbc/PgResultSet.java:3008
+#: org/postgresql/jdbc/PgResultSet.java:3052
#, java-format
msgid "Cannot convert the column of type {0} to requested type {1}."
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:789
-#: org/postgresql/jdbc/PgResultSet.java:810
-#: org/postgresql/jdbc/PgResultSet.java:1797
+#: org/postgresql/jdbc/PgResultSet.java:838
+#: org/postgresql/jdbc/PgResultSet.java:859
+#: org/postgresql/jdbc/PgResultSet.java:1832
msgid "Can''t use relative move methods while on the insert row."
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:829
-#: org/postgresql/jdbc/PgStatement.java:1045
-#, java-format
-msgid "Invalid fetch direction constant: {0}."
-msgstr ""
-
-#: org/postgresql/jdbc/PgResultSet.java:840
+#: org/postgresql/jdbc/PgResultSet.java:889
msgid "Cannot call cancelRowUpdates() when on the insert row."
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:856
+#: org/postgresql/jdbc/PgResultSet.java:905
msgid "Cannot call deleteRow() when on the insert row."
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:863
+#: org/postgresql/jdbc/PgResultSet.java:912
msgid ""
"Currently positioned before the start of the ResultSet. You cannot call "
"deleteRow() here."
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:869
+#: org/postgresql/jdbc/PgResultSet.java:918
msgid ""
"Currently positioned after the end of the ResultSet. You cannot call "
"deleteRow() here."
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:873
+#: org/postgresql/jdbc/PgResultSet.java:922
msgid "There are no rows in this ResultSet."
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:914
+#: org/postgresql/jdbc/PgResultSet.java:963
msgid "Not on the insert row."
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:916
+#: org/postgresql/jdbc/PgResultSet.java:965
msgid "You must specify at least one column value to insert a row."
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:1072
-#: org/postgresql/jdbc/PgResultSet.java:1706
-#: org/postgresql/jdbc/PgResultSet.java:2377
-#: org/postgresql/jdbc/PgResultSet.java:2402
+#: org/postgresql/jdbc/PgResultSet.java:1119
+#: org/postgresql/jdbc/PgResultSet.java:1754
+#: org/postgresql/jdbc/PgResultSet.java:2416
+#: org/postgresql/jdbc/PgResultSet.java:2437
#, java-format
msgid "The JVM claims not to support the encoding: {0}"
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:1214
+#: org/postgresql/jdbc/PgResultSet.java:1261
msgid "Can''t refresh the insert row."
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:1280
+#: org/postgresql/jdbc/PgResultSet.java:1328
msgid "Cannot call updateRow() when on the insert row."
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:1287
-#: org/postgresql/jdbc/PgResultSet.java:3025
+#: org/postgresql/jdbc/PgResultSet.java:1335
+#: org/postgresql/jdbc/PgResultSet.java:3069
msgid ""
"Cannot update the ResultSet because it is either before the start or after "
"the end of the results."
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:1486
+#: org/postgresql/jdbc/PgResultSet.java:1535
msgid "ResultSets with concurrency CONCUR_READ_ONLY cannot be updated."
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:1555
+#: org/postgresql/jdbc/PgResultSet.java:1603
#, java-format
msgid "No primary key found for table {0}."
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:1941
-#: org/postgresql/jdbc/PgResultSet.java:1946
-#: org/postgresql/jdbc/PgResultSet.java:1986
-#: org/postgresql/jdbc/PgResultSet.java:1992
-#: org/postgresql/jdbc/PgResultSet.java:2790
-#: org/postgresql/jdbc/PgResultSet.java:2796
-#: org/postgresql/jdbc/PgResultSet.java:2820
-#: org/postgresql/jdbc/PgResultSet.java:2825
-#: org/postgresql/jdbc/PgResultSet.java:2841
-#: org/postgresql/jdbc/PgResultSet.java:2862
-#: org/postgresql/jdbc/PgResultSet.java:2873
-#: org/postgresql/jdbc/PgResultSet.java:2886
-#: org/postgresql/jdbc/PgResultSet.java:3013
+#: org/postgresql/jdbc/PgResultSet.java:2011
+#: org/postgresql/jdbc/PgResultSet.java:2016
+#: org/postgresql/jdbc/PgResultSet.java:2803
+#: org/postgresql/jdbc/PgResultSet.java:2809
+#: org/postgresql/jdbc/PgResultSet.java:2834
+#: org/postgresql/jdbc/PgResultSet.java:2840
+#: org/postgresql/jdbc/PgResultSet.java:2864
+#: org/postgresql/jdbc/PgResultSet.java:2869
+#: org/postgresql/jdbc/PgResultSet.java:2885
+#: org/postgresql/jdbc/PgResultSet.java:2906
+#: org/postgresql/jdbc/PgResultSet.java:2917
+#: org/postgresql/jdbc/PgResultSet.java:2930
+#: org/postgresql/jdbc/PgResultSet.java:3057
#, java-format
msgid "Bad value for type {0} : {1}"
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:2564
+#: org/postgresql/jdbc/PgResultSet.java:2589
#, java-format
msgid "The column name {0} was not found in this ResultSet."
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:2689
+#: org/postgresql/jdbc/PgResultSet.java:2725
msgid ""
"ResultSet is not updateable. The query that generated this result set must "
"select only one table, and must select all primary keys from that table. See "
"the JDBC 2.1 API Specification, section 5.6 for more details."
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:2701
+#: org/postgresql/jdbc/PgResultSet.java:2737
msgid "This ResultSet is closed."
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:2732
+#: org/postgresql/jdbc/PgResultSet.java:2768
msgid "ResultSet not positioned properly, perhaps you need to call next."
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:3045
+#: org/postgresql/jdbc/PgResultSet.java:3089
msgid "Invalid UUID data."
msgstr ""
-#: org/postgresql/jdbc/PgSQLXML.java:150
-msgid "Unable to decode xml data."
-msgstr ""
-
-#: org/postgresql/jdbc/PgSQLXML.java:153
+#: org/postgresql/jdbc/PgResultSet.java:3178
+#: org/postgresql/jdbc/PgResultSet.java:3185
+#: org/postgresql/jdbc/PgResultSet.java:3196
+#: org/postgresql/jdbc/PgResultSet.java:3207
+#: org/postgresql/jdbc/PgResultSet.java:3218
+#: org/postgresql/jdbc/PgResultSet.java:3229
+#: org/postgresql/jdbc/PgResultSet.java:3240
+#: org/postgresql/jdbc/PgResultSet.java:3251
+#: org/postgresql/jdbc/PgResultSet.java:3262
+#: org/postgresql/jdbc/PgResultSet.java:3269
+#: org/postgresql/jdbc/PgResultSet.java:3276
+#: org/postgresql/jdbc/PgResultSet.java:3287
+#: org/postgresql/jdbc/PgResultSet.java:3304
+#: org/postgresql/jdbc/PgResultSet.java:3311
+#: org/postgresql/jdbc/PgResultSet.java:3318
+#: org/postgresql/jdbc/PgResultSet.java:3329
+#: org/postgresql/jdbc/PgResultSet.java:3336
+#: org/postgresql/jdbc/PgResultSet.java:3343
+#: org/postgresql/jdbc/PgResultSet.java:3381
+#: org/postgresql/jdbc/PgResultSet.java:3388
+#: org/postgresql/jdbc/PgResultSet.java:3395
+#: org/postgresql/jdbc/PgResultSet.java:3415
+#: org/postgresql/jdbc/PgResultSet.java:3428
+#, java-format
+msgid "conversion to {0} from {1} not supported"
+msgstr ""
+
+#: org/postgresql/jdbc/TimestampUtils.java:355
+#: org/postgresql/jdbc/TimestampUtils.java:423
#, java-format
-msgid "Unknown XML Source class: {0}"
-msgstr ""
-
-#: org/postgresql/jdbc/PgSQLXML.java:196
-msgid "Unable to create SAXResult for SQLXML."
-msgstr ""
-
-#: org/postgresql/jdbc/PgSQLXML.java:211
-msgid "Unable to create StAXResult for SQLXML"
+msgid "Bad value for type timestamp/date/time: {1}"
msgstr ""
-#: org/postgresql/jdbc/PgSQLXML.java:216
+#: org/postgresql/jdbc/TimestampUtils.java:858
+#: org/postgresql/jdbc/TimestampUtils.java:915
+#: org/postgresql/jdbc/TimestampUtils.java:961
+#: org/postgresql/jdbc/TimestampUtils.java:1010
#, java-format
-msgid "Unknown XML Result class: {0}"
+msgid "Unsupported binary encoding of {0}."
msgstr ""
-#: org/postgresql/jdbc/PgSQLXML.java:228
-msgid "This SQLXML object has already been freed."
+#: org/postgresql/jdbc/PgCallableStatement.java:86
+#: org/postgresql/jdbc/PgCallableStatement.java:96
+msgid "A CallableStatement was executed with nothing returned."
msgstr ""
-#: org/postgresql/jdbc/PgSQLXML.java:237
-msgid ""
-"This SQLXML object has not been initialized, so you cannot retrieve data "
-"from it."
+#: org/postgresql/jdbc/PgCallableStatement.java:107
+msgid "A CallableStatement was executed with an invalid number of parameters"
msgstr ""
-#: org/postgresql/jdbc/PgSQLXML.java:250
+#: org/postgresql/jdbc/PgCallableStatement.java:145
#, java-format
-msgid "Failed to convert binary xml data to encoding: {0}."
-msgstr ""
-
-#: org/postgresql/jdbc/PgSQLXML.java:276
-msgid "Unable to convert DOMResult SQLXML data to a string."
-msgstr ""
-
-#: org/postgresql/jdbc/PgSQLXML.java:290
msgid ""
-"This SQLXML object has already been initialized, so you cannot manipulate it "
-"further."
-msgstr ""
-
-#: org/postgresql/jdbc/PgStatement.java:325
-msgid "Can''t use executeWithFlags(int) on a Statement."
-msgstr ""
-
-#: org/postgresql/jdbc/PgStatement.java:484
-msgid "Maximum number of rows must be a value grater than or equal to 0."
-msgstr ""
-
-#: org/postgresql/jdbc/PgStatement.java:525
-msgid "Query timeout must be a value greater than or equals to 0."
-msgstr ""
-
-#: org/postgresql/jdbc/PgStatement.java:561
-msgid "The maximum field size must be a value greater than or equal to 0."
-msgstr ""
-
-#: org/postgresql/jdbc/PgStatement.java:871
-msgid "This statement has been closed."
+"A CallableStatement function was executed and the out parameter {0} was of "
+"type {1} however type {2} was registered."
msgstr ""
-#: org/postgresql/jdbc/PgStatement.java:1148
+#: org/postgresql/jdbc/PgCallableStatement.java:202
msgid ""
-"Returning autogenerated keys is only supported for 8.2 and later servers."
-msgstr ""
-
-#: org/postgresql/jdbc/PgStatement.java:1326
-#: org/postgresql/jdbc/PgStatement.java:1357
-msgid "Returning autogenerated keys by column index is not supported."
-msgstr ""
-
-#: org/postgresql/jdbc/PSQLSavepoint.java:40
-#: org/postgresql/jdbc/PSQLSavepoint.java:54
-#: org/postgresql/jdbc/PSQLSavepoint.java:72
-msgid "Cannot reference a savepoint after it has been released."
-msgstr ""
-
-#: org/postgresql/jdbc/PSQLSavepoint.java:45
-msgid "Cannot retrieve the id of a named savepoint."
+"This statement does not declare an OUT parameter. Use '{' ?= call ... '}' "
+"to declare one."
msgstr ""
-#: org/postgresql/jdbc/PSQLSavepoint.java:59
-msgid "Cannot retrieve the name of an unnamed savepoint."
+#: org/postgresql/jdbc/PgCallableStatement.java:246
+msgid "wasNull cannot be call before fetching a result."
msgstr ""
-#: org/postgresql/jdbc/TimestampUtils.java:298
+#: org/postgresql/jdbc/PgCallableStatement.java:384
+#: org/postgresql/jdbc/PgCallableStatement.java:403
#, java-format
-msgid "Bad value for type timestamp/date/time: {1}"
-msgstr ""
-
-#: org/postgresql/jdbc/TimestampUtils.java:359
msgid ""
-"Infinite value found for timestamp/date. This cannot be represented as time."
-msgstr ""
-
-#: org/postgresql/jdbc/TimestampUtils.java:674
-#: org/postgresql/jdbc/TimestampUtils.java:710
-#: org/postgresql/jdbc/TimestampUtils.java:757
-#, java-format
-msgid "Unsupported binary encoding of {0}."
-msgstr ""
-
-#: org/postgresql/largeobject/LargeObjectManager.java:147
-msgid "Failed to initialize LargeObject API"
-msgstr ""
-
-#: org/postgresql/largeobject/LargeObjectManager.java:265
-#: org/postgresql/largeobject/LargeObjectManager.java:308
-msgid "Large Objects may not be used in auto-commit mode."
+"Parameter of type {0} was registered, but call to get{1} (sqltype={2}) was "
+"made."
msgstr ""
-#: org/postgresql/osgi/PGDataSourceFactory.java:85
-#, java-format
-msgid "Unsupported properties: {0}"
+#: org/postgresql/jdbc/PgCallableStatement.java:424
+msgid ""
+"A CallableStatement was declared, but no call to registerOutParameter(1, "
+"<some type>) was made."
msgstr ""
-#: org/postgresql/PGProperty.java:450 org/postgresql/PGProperty.java:470
-#, java-format
-msgid "{0} parameter value must be an integer but was: {1}"
+#: org/postgresql/jdbc/PgCallableStatement.java:430
+msgid "No function outputs were registered."
msgstr ""
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:125
+#: org/postgresql/jdbc/PgCallableStatement.java:436
msgid ""
-"Could not find a java cryptographic algorithm: X.509 CertificateFactory not "
-"available."
-msgstr ""
-
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:135
-#, java-format
-msgid "Could not open SSL certificate file {0}."
+"Results cannot be retrieved from a CallableStatement before it is executed."
msgstr ""
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:140
+#: org/postgresql/jdbc/PgCallableStatement.java:703
#, java-format
-msgid "Loading the SSL certificate {0} into a KeyManager failed."
-msgstr ""
-
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:195
-msgid "Enter SSL password: "
+msgid "Unsupported type conversion to {1}."
msgstr ""
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:202
-msgid "Could not read password for SSL key file, console is not available."
-msgstr ""
-
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:207
+#: org/postgresql/jdbc/EscapedFunctions.java:240
#, java-format
-msgid "Could not read password for SSL key file by callbackhandler {0}."
+msgid "{0} function takes four and only four argument."
msgstr ""
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:226
+#: org/postgresql/jdbc/EscapedFunctions.java:270
+#: org/postgresql/jdbc/EscapedFunctions.java:344
+#: org/postgresql/jdbc/EscapedFunctions.java:749
+#: org/postgresql/jdbc/EscapedFunctions.java:787
#, java-format
-msgid "Could not decrypt SSL key file {0}."
+msgid "{0} function takes two and only two arguments."
msgstr ""
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:240
+#: org/postgresql/jdbc/EscapedFunctions.java:288
+#: org/postgresql/jdbc/EscapedFunctions.java:326
+#: org/postgresql/jdbc/EscapedFunctions.java:446
+#: org/postgresql/jdbc/EscapedFunctions.java:461
+#: org/postgresql/jdbc/EscapedFunctions.java:476
+#: org/postgresql/jdbc/EscapedFunctions.java:491
+#: org/postgresql/jdbc/EscapedFunctions.java:506
+#: org/postgresql/jdbc/EscapedFunctions.java:521
+#: org/postgresql/jdbc/EscapedFunctions.java:536
+#: org/postgresql/jdbc/EscapedFunctions.java:551
+#: org/postgresql/jdbc/EscapedFunctions.java:566
+#: org/postgresql/jdbc/EscapedFunctions.java:581
+#: org/postgresql/jdbc/EscapedFunctions.java:596
+#: org/postgresql/jdbc/EscapedFunctions.java:611
+#: org/postgresql/jdbc/EscapedFunctions.java:775
#, java-format
-msgid "Could not read SSL key file {0}."
+msgid "{0} function takes one and only one argument."
msgstr ""
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:243
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:162
+#: org/postgresql/jdbc/EscapedFunctions.java:310
+#: org/postgresql/jdbc/EscapedFunctions.java:391
#, java-format
-msgid "Could not find a java cryptographic algorithm: {0}."
+msgid "{0} function takes two or three arguments."
msgstr ""
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:90
+#: org/postgresql/jdbc/EscapedFunctions.java:416
+#: org/postgresql/jdbc/EscapedFunctions.java:431
+#: org/postgresql/jdbc/EscapedFunctions.java:734
+#: org/postgresql/jdbc/EscapedFunctions.java:764
#, java-format
-msgid "The password callback class provided {0} could not be instantiated."
+msgid "{0} function doesn''t take any argument."
msgstr ""
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:123
+#: org/postgresql/jdbc/EscapedFunctions.java:627
+#: org/postgresql/jdbc/EscapedFunctions.java:680
#, java-format
-msgid "Could not open SSL root certificate file {0}."
+msgid "{0} function takes three and only three arguments."
msgstr ""
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:139
+#: org/postgresql/jdbc/EscapedFunctions.java:640
+#: org/postgresql/jdbc/EscapedFunctions.java:661
+#: org/postgresql/jdbc/EscapedFunctions.java:664
+#: org/postgresql/jdbc/EscapedFunctions.java:697
+#: org/postgresql/jdbc/EscapedFunctions.java:710
+#: org/postgresql/jdbc/EscapedFunctions.java:713
#, java-format
-msgid "Could not read SSL root certificate file {0}."
+msgid "Interval {0} not yet implemented"
msgstr ""
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:143
+#: org/postgresql/PGProperty.java:535 org/postgresql/PGProperty.java:555
#, java-format
-msgid "Loading the SSL root certificate {0} into a TrustManager failed."
+msgid "{0} parameter value must be an integer but was: {1}"
msgstr ""
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:156
-msgid "Could not initialize SSL context."
+#: org/postgresql/largeobject/LargeObjectManager.java:144
+msgid "Failed to initialize LargeObject API"
msgstr ""
-#: org/postgresql/ssl/MakeSSL.java:52
-#, java-format
-msgid "The SSLSocketFactory class provided {0} could not be instantiated."
+#: org/postgresql/largeobject/LargeObjectManager.java:262
+#: org/postgresql/largeobject/LargeObjectManager.java:305
+msgid "Large Objects may not be used in auto-commit mode."
msgstr ""
-#: org/postgresql/ssl/MakeSSL.java:67
+#: org/postgresql/copy/PGCopyInputStream.java:51
#, java-format
-msgid "SSL error: {0}"
+msgid "Copying from database failed: {0}"
msgstr ""
-#: org/postgresql/ssl/MakeSSL.java:78
-#, java-format
-msgid "The HostnameVerifier class provided {0} could not be instantiated."
+#: org/postgresql/copy/PGCopyInputStream.java:67
+#: org/postgresql/copy/PGCopyOutputStream.java:94
+msgid "This copy stream is closed."
msgstr ""
-#: org/postgresql/ssl/MakeSSL.java:84
-#, java-format
-msgid "The hostname {0} could not be verified by hostnameverifier {1}."
+#: org/postgresql/copy/PGCopyInputStream.java:110
+msgid "Read from copy failed."
msgstr ""
-#: org/postgresql/ssl/MakeSSL.java:93
+#: org/postgresql/copy/CopyManager.java:53
#, java-format
-msgid "The hostname {0} could not be verified."
-msgstr ""
-
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:167
-msgid "The sslfactoryarg property may not be empty."
-msgstr ""
-
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:183
-msgid ""
-"The environment variable containing the server's SSL certificate must not be "
-"empty."
-msgstr ""
-
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:191
-msgid ""
-"The system property containing the server's SSL certificate must not be "
-"empty."
-msgstr ""
-
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:198
-msgid ""
-"The sslfactoryarg property must start with the prefix file:, classpath:, "
-"env:, sys:, or -----BEGIN CERTIFICATE-----."
-msgstr ""
-
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:210
-msgid "An error occurred reading the certificate"
-msgstr ""
-
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:243
-msgid "No X509TrustManager found"
-msgstr ""
-
-#: org/postgresql/util/PGInterval.java:155
-msgid "Conversion of interval failed"
-msgstr ""
-
-#: org/postgresql/util/PGmoney.java:65
-msgid "Conversion of money failed."
+msgid "Requested CopyIn but got {0}"
msgstr ""
-#: org/postgresql/util/ServerErrorMessage.java:165
+#: org/postgresql/copy/CopyManager.java:64
#, java-format
-msgid "Detail: {0}"
+msgid "Requested CopyOut but got {0}"
msgstr ""
-#: org/postgresql/util/ServerErrorMessage.java:170
+#: org/postgresql/copy/CopyManager.java:75
#, java-format
-msgid "Hint: {0}"
+msgid "Requested CopyDual but got {0}"
msgstr ""
-#: org/postgresql/util/ServerErrorMessage.java:174
+#: org/postgresql/copy/PGCopyOutputStream.java:71
#, java-format
-msgid "Position: {0}"
+msgid "Cannot write to copy a byte of value {0}"
msgstr ""
-#: org/postgresql/util/ServerErrorMessage.java:178
+#: org/postgresql/fastpath/Fastpath.java:80
#, java-format
-msgid "Where: {0}"
+msgid "Fastpath call {0} - No result was returned and we expected a numeric."
msgstr ""
-#: org/postgresql/util/ServerErrorMessage.java:184
+#: org/postgresql/fastpath/Fastpath.java:157
#, java-format
-msgid "Internal Query: {0}"
+msgid "Fastpath call {0} - No result was returned and we expected an integer."
msgstr ""
-#: org/postgresql/util/ServerErrorMessage.java:188
+#: org/postgresql/fastpath/Fastpath.java:165
#, java-format
-msgid "Internal Position: {0}"
+msgid ""
+"Fastpath call {0} - No result was returned or wrong size while expecting an "
+"integer."
msgstr ""
-#: org/postgresql/util/ServerErrorMessage.java:195
+#: org/postgresql/fastpath/Fastpath.java:182
#, java-format
-msgid "Location: File: {0}, Routine: {1}, Line: {2}"
+msgid "Fastpath call {0} - No result was returned and we expected a long."
msgstr ""
-#: org/postgresql/util/ServerErrorMessage.java:200
+#: org/postgresql/fastpath/Fastpath.java:190
#, java-format
-msgid "Server SQLState: {0}"
-msgstr ""
-
-#: org/postgresql/xa/PGXAConnection.java:148
-msgid ""
-"Transaction control methods setAutoCommit(true), commit, rollback and "
-"setSavePoint not allowed while an XA transaction is active."
-msgstr ""
-
-#: org/postgresql/xa/PGXAConnection.java:196
-#: org/postgresql/xa/PGXAConnection.java:265
-msgid "Invalid flags"
-msgstr ""
-
-#: org/postgresql/xa/PGXAConnection.java:200
-#: org/postgresql/xa/PGXAConnection.java:269
-#: org/postgresql/xa/PGXAConnection.java:437
-msgid "xid must not be null"
-msgstr ""
-
-#: org/postgresql/xa/PGXAConnection.java:204
-msgid "Connection is busy with another transaction"
-msgstr ""
-
-#: org/postgresql/xa/PGXAConnection.java:213
-#: org/postgresql/xa/PGXAConnection.java:279
-msgid "suspend/resume not implemented"
-msgstr ""
-
-#: org/postgresql/xa/PGXAConnection.java:219
-#: org/postgresql/xa/PGXAConnection.java:224
-#: org/postgresql/xa/PGXAConnection.java:228
-msgid "Transaction interleaving not implemented"
-msgstr ""
-
-#: org/postgresql/xa/PGXAConnection.java:239
-msgid "Error disabling autocommit"
-msgstr ""
-
-#: org/postgresql/xa/PGXAConnection.java:273
-msgid "tried to call end without corresponding start call"
-msgstr ""
-
-#: org/postgresql/xa/PGXAConnection.java:305
msgid ""
-"Not implemented: Prepare must be issued using the same connection that "
-"started the transaction"
-msgstr ""
-
-#: org/postgresql/xa/PGXAConnection.java:309
-msgid "Prepare called before end"
-msgstr ""
-
-#: org/postgresql/xa/PGXAConnection.java:317
-msgid "Server versions prior to 8.1 do not support two-phase commit."
-msgstr ""
-
-#: org/postgresql/xa/PGXAConnection.java:334
-msgid "Error preparing transaction"
-msgstr ""
-
-#: org/postgresql/xa/PGXAConnection.java:349
-msgid "Invalid flag"
-msgstr ""
-
-#: org/postgresql/xa/PGXAConnection.java:384
-msgid "Error during recover"
-msgstr ""
-
-#: org/postgresql/xa/PGXAConnection.java:423
-#: org/postgresql/xa/PGXAConnection.java:426
-msgid "Error rolling back prepared transaction"
-msgstr ""
-
-#: org/postgresql/xa/PGXAConnection.java:464
-msgid ""
-"Not implemented: one-phase commit must be issued using the same connection "
-"that was used to start it"
-msgstr ""
-
-#: org/postgresql/xa/PGXAConnection.java:468
-msgid "commit called before end"
-msgstr ""
-
-#: org/postgresql/xa/PGXAConnection.java:478
-msgid "Error during one-phase commit"
-msgstr ""
-
-#: org/postgresql/xa/PGXAConnection.java:497
-msgid ""
-"Not implemented: 2nd phase commit must be issued using an idle connection"
-msgstr ""
-
-#: org/postgresql/xa/PGXAConnection.java:513
-msgid "Error committing prepared transaction"
+"Fastpath call {0} - No result was returned or wrong size while expecting a "
+"long."
msgstr ""
-#: org/postgresql/xa/PGXAConnection.java:529
-msgid "Heuristic commit/rollback not supported"
+#: org/postgresql/fastpath/Fastpath.java:302
+#, java-format
+msgid "The fastpath function {0} is unknown."
msgstr ""
diff --git a/pgjdbc/src/main/java/org/postgresql/translation/nl.po b/pgjdbc/src/main/java/org/postgresql/translation/nl.po
index 7cd2ad4..768aa2d 100644
--- a/pgjdbc/src/main/java/org/postgresql/translation/nl.po
+++ b/pgjdbc/src/main/java/org/postgresql/translation/nl.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PostgreSQL JDBC Driver 8.0\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-01-07 13:37+0300\n"
+"POT-Creation-Date: 2018-03-10 23:24+0300\n"
"PO-Revision-Date: 2004-10-11 23:55-0700\n"
"Last-Translator: Arnout Kuiper <ajkuiper at wxs.nl>\n"
"Language-Team: Dutch <ajkuiper at wxs.nl>\n"
@@ -15,1539 +15,1635 @@ msgstr ""
"Content-Type: text/plain; charset=ISO-8859-1\n"
"Content-Transfer-Encoding: 8bit\n"
-#: org/postgresql/copy/CopyManager.java:57
-#, java-format
-msgid "Requested CopyIn but got {0}"
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:164
+msgid "The sslfactoryarg property may not be empty."
msgstr ""
-#: org/postgresql/copy/CopyManager.java:69
-#, java-format
-msgid "Requested CopyOut but got {0}"
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:180
+msgid ""
+"The environment variable containing the server's SSL certificate must not be "
+"empty."
msgstr ""
-#: org/postgresql/copy/PGCopyInputStream.java:54
-#, fuzzy, java-format
-msgid "Copying from database failed: {0}"
-msgstr "Conversie van lseg faalde - {0}"
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:188
+msgid ""
+"The system property containing the server's SSL certificate must not be "
+"empty."
+msgstr ""
-#: org/postgresql/copy/PGCopyInputStream.java:70
-#: org/postgresql/copy/PGCopyOutputStream.java:97
-msgid "This copy stream is closed."
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:195
+msgid ""
+"The sslfactoryarg property must start with the prefix file:, classpath:, "
+"env:, sys:, or -----BEGIN CERTIFICATE-----."
msgstr ""
-#: org/postgresql/copy/PGCopyInputStream.java:113
-msgid "Read from copy failed."
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:207
+#, fuzzy
+msgid "An error occurred reading the certificate"
+msgstr "Een fout trad op tijdens het ophalen van het authenticatie verzoek."
+
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:240
+msgid "No X509TrustManager found"
msgstr ""
-#: org/postgresql/copy/PGCopyOutputStream.java:74
-#, java-format
-msgid "Cannot write to copy a byte of value {0}"
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:133
+msgid ""
+"Could not find a java cryptographic algorithm: X.509 CertificateFactory not "
+"available."
msgstr ""
-#: org/postgresql/core/ConnectionFactory.java:74
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:143
#, java-format
-msgid "A connection could not be made using the requested protocol {0}."
+msgid "Could not open SSL certificate file {0}."
msgstr ""
-#: org/postgresql/core/Oid.java:114
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:148
#, java-format
-msgid "oid type {0} not known and not a number"
+msgid "Loading the SSL certificate {0} into a KeyManager failed."
msgstr ""
-#: org/postgresql/core/Parser.java:616
-#, java-format
-msgid "Malformed function or procedure escape syntax at offset {0}."
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:205
+msgid "Enter SSL password: "
msgstr ""
-#: org/postgresql/core/PGStream.java:497
-#, java-format
-msgid "Premature end of input stream, expected {0} bytes, but only read {1}."
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:212
+msgid "Could not read password for SSL key file, console is not available."
msgstr ""
-#: org/postgresql/core/PGStream.java:538
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:217
#, java-format
-msgid "Expected an EOF from server, got: {0}"
+msgid "Could not read password for SSL key file by callbackhandler {0}."
msgstr ""
-#: org/postgresql/core/SetupQueryRunner.java:90
-msgid "An unexpected result was returned by a query."
-msgstr "Een onverwacht resultaat werd teruggegeven door een query"
-
-#: org/postgresql/core/UTF8Encoding.java:31
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:236
#, java-format
-msgid ""
-"Illegal UTF-8 sequence: byte {0} of {1} byte sequence is not 10xxxxxx: {2}"
+msgid "Could not decrypt SSL key file {0}."
msgstr ""
-#: org/postgresql/core/UTF8Encoding.java:69
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:250
#, java-format
-msgid "Illegal UTF-8 sequence: {0} bytes used to encode a {1} byte value: {2}"
+msgid "Could not read SSL key file {0}."
msgstr ""
-#: org/postgresql/core/UTF8Encoding.java:104
-#: org/postgresql/core/UTF8Encoding.java:131
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:253
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:176
#, java-format
-msgid "Illegal UTF-8 sequence: initial byte is {0}: {1}"
+msgid "Could not find a java cryptographic algorithm: {0}."
msgstr ""
-#: org/postgresql/core/UTF8Encoding.java:137
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:99
#, java-format
-msgid "Illegal UTF-8 sequence: final value is out of range: {0}"
+msgid "The password callback class provided {0} could not be instantiated."
msgstr ""
-#: org/postgresql/core/UTF8Encoding.java:153
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:132
#, java-format
-msgid "Illegal UTF-8 sequence: final value is a surrogate value: {0}"
+msgid "Could not open SSL root certificate file {0}."
msgstr ""
-#: org/postgresql/core/Utils.java:119 org/postgresql/core/Utils.java:136
-msgid "Zero bytes may not occur in string parameters."
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:147
+#, java-format
+msgid "Could not read SSL root certificate file {0}."
msgstr ""
-#: org/postgresql/core/Utils.java:146 org/postgresql/core/Utils.java:217
-msgid "No IOException expected from StringBuffer or StringBuilder"
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:151
+#, java-format
+msgid "Loading the SSL root certificate {0} into a TrustManager failed."
msgstr ""
-#: org/postgresql/core/Utils.java:206
-msgid "Zero bytes may not occur in identifiers."
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:170
+msgid "Could not initialize SSL context."
msgstr ""
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:72
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:87
+#: org/postgresql/ssl/MakeSSL.java:52
#, java-format
-msgid "Invalid sslmode value: {0}"
+msgid "The SSLSocketFactory class provided {0} could not be instantiated."
msgstr ""
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:87
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:111
-#, fuzzy, java-format
-msgid "Invalid targetServerType value: {0}"
-msgstr "Onbekende Types waarde."
+#: org/postgresql/ssl/MakeSSL.java:67
+#, java-format
+msgid "SSL error: {0}"
+msgstr ""
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:152
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:228
+#: org/postgresql/ssl/MakeSSL.java:78
#, java-format
-msgid "Could not find a server with specified targetServerType: {0}"
+msgid "The HostnameVerifier class provided {0} could not be instantiated."
msgstr ""
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:172
-msgid ""
-"Connection refused. Check that the hostname and port are correct and that "
-"the postmaster is accepting TCP/IP connections."
+#: org/postgresql/ssl/MakeSSL.java:84
+#, java-format
+msgid "The hostname {0} could not be verified by hostnameverifier {1}."
msgstr ""
-"Verbinding geweigerd. Controleer dat de hostnaam en poort correct zijn, en "
-"dat de postmaster is opgestart met de -i vlag, welke TCP/IP networking "
-"aanzet."
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:181
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:262
-#, fuzzy
-msgid "The connection attempt failed."
-msgstr "De poging om verbinding the maken faalde omdat {0}"
+#: org/postgresql/ssl/MakeSSL.java:93
+#, java-format
+msgid "The hostname {0} could not be verified."
+msgstr ""
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:192
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:273
-#, fuzzy
-msgid "The connection url is invalid."
-msgstr "De poging om verbinding the maken faalde omdat {0}"
+#: org/postgresql/gss/GssAction.java:126
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2550
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2581
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2585
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2640
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2650
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2659
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:655
+msgid "Protocol error. Session setup failed."
+msgstr ""
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:218
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:233
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:324
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:339
-msgid "The server does not support SSL."
+#: org/postgresql/gss/GssAction.java:137 org/postgresql/gss/MakeGSS.java:66
+#: org/postgresql/gss/MakeGSS.java:74
+msgid "GSS Authentication failed"
msgstr ""
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:249
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:355
-#, fuzzy
-msgid "An error occurred while setting up the SSL connection."
-msgstr "Een fout trad op tijdens het ophalen van het authenticatie verzoek."
+#: org/postgresql/core/Parser.java:933
+#, java-format
+msgid "Malformed function or procedure escape syntax at offset {0}."
+msgstr ""
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:300
+#: org/postgresql/core/SocketFactoryFactory.java:41
#, java-format
-msgid "Connection rejected: {0}."
+msgid "The SocketFactory class provided {0} could not be instantiated."
msgstr ""
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:321
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:349
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:375
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:456
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:486
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:515
-msgid ""
-"The server requested password-based authentication, but no password was "
-"provided."
+#: org/postgresql/core/Utils.java:93 org/postgresql/core/Utils.java:110
+msgid "Zero bytes may not occur in string parameters."
msgstr ""
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:405
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:625
-#, fuzzy, java-format
-msgid ""
-"The authentication type {0} is not supported. Check that you have configured "
-"the pg_hba.conf file to include the client''s IP address or subnet, and that "
-"it is using an authentication scheme supported by the driver."
+#: org/postgresql/core/Utils.java:120 org/postgresql/core/Utils.java:170
+msgid "No IOException expected from StringBuffer or StringBuilder"
msgstr ""
-"Het authenticatie type {0} wordt niet ondersteund. Controleer dat het IP "
-"adres of subnet van de client is geconfigureerd in de pg_hba.conf file, en "
-"dat het een authenticatie protocol gebruikt dat door de driver ondersteund "
-"wordt."
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:412
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:455
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:632
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:688
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:744
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:754
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:763
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:774
-#: org/postgresql/gss/GssAction.java:130
-msgid "Protocol error. Session setup failed."
+#: org/postgresql/core/Utils.java:159
+msgid "Zero bytes may not occur in identifiers."
msgstr ""
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:443
+#: org/postgresql/core/UTF8Encoding.java:28
#, java-format
-msgid "Backend start-up failed: {0}."
+msgid ""
+"Illegal UTF-8 sequence: byte {0} of {1} byte sequence is not 10xxxxxx: {2}"
msgstr ""
-#: org/postgresql/core/v2/FastpathParameterList.java:63
-#: org/postgresql/core/v2/FastpathParameterList.java:89
-#: org/postgresql/core/v2/FastpathParameterList.java:100
-#: org/postgresql/core/v2/FastpathParameterList.java:111
-#: org/postgresql/core/v2/SimpleParameterList.java:70
-#: org/postgresql/core/v2/SimpleParameterList.java:94
-#: org/postgresql/core/v2/SimpleParameterList.java:105
-#: org/postgresql/core/v2/SimpleParameterList.java:116
-#: org/postgresql/core/v2/SimpleParameterList.java:127
-#: org/postgresql/core/v3/CompositeParameterList.java:36
-#: org/postgresql/core/v3/SimpleParameterList.java:53
-#: org/postgresql/core/v3/SimpleParameterList.java:64
-#: org/postgresql/jdbc/PgResultSet.java:2715
-#: org/postgresql/jdbc/PgResultSetMetaData.java:472
-#, fuzzy, java-format
-msgid "The column index is out of range: {0}, number of columns: {1}."
-msgstr "De kolom index is buiten bereik."
-
-#: org/postgresql/core/v2/FastpathParameterList.java:164
-#: org/postgresql/core/v2/SimpleParameterList.java:191
-#: org/postgresql/core/v3/SimpleParameterList.java:225
-#, fuzzy, java-format
-msgid "No value specified for parameter {0}."
-msgstr "Geen waarde opgegeven voor parameter {0}."
-
-#: org/postgresql/core/v2/QueryExecutorImpl.java:87
-#: org/postgresql/core/v2/QueryExecutorImpl.java:347
-#: org/postgresql/core/v3/QueryExecutorImpl.java:404
-#: org/postgresql/core/v3/QueryExecutorImpl.java:465
+#: org/postgresql/core/UTF8Encoding.java:66
#, java-format
-msgid "Expected command status BEGIN, got {0}."
+msgid "Illegal UTF-8 sequence: {0} bytes used to encode a {1} byte value: {2}"
msgstr ""
-#: org/postgresql/core/v2/QueryExecutorImpl.java:92
-#: org/postgresql/core/v3/QueryExecutorImpl.java:470
-#: org/postgresql/jdbc/PgResultSet.java:1731
+#: org/postgresql/core/UTF8Encoding.java:102
+#: org/postgresql/core/UTF8Encoding.java:129
#, java-format
-msgid "Unexpected command status: {0}."
+msgid "Illegal UTF-8 sequence: initial byte is {0}: {1}"
msgstr ""
-#: org/postgresql/core/v2/QueryExecutorImpl.java:127
-#: org/postgresql/core/v2/QueryExecutorImpl.java:136
-#: org/postgresql/core/v2/QueryExecutorImpl.java:185
-#: org/postgresql/core/v2/QueryExecutorImpl.java:376
-#: org/postgresql/core/v3/QueryExecutorImpl.java:226
-#: org/postgresql/core/v3/QueryExecutorImpl.java:364
-#: org/postgresql/core/v3/QueryExecutorImpl.java:441
-#: org/postgresql/core/v3/QueryExecutorImpl.java:505
-#: org/postgresql/core/v3/QueryExecutorImpl.java:587
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2211
-#: org/postgresql/util/StreamWrapper.java:133
-#, fuzzy
-msgid "An I/O error occurred while sending to the backend."
-msgstr "Een I/O fout trad op tijdens het zenden naar de achterkant - {0}"
-
-#: org/postgresql/core/v2/QueryExecutorImpl.java:180
-#: org/postgresql/core/v2/QueryExecutorImpl.java:235
-#: org/postgresql/core/v2/QueryExecutorImpl.java:249
-#: org/postgresql/core/v3/QueryExecutorImpl.java:582
-#: org/postgresql/core/v3/QueryExecutorImpl.java:642
-#, fuzzy, java-format
-msgid "Unknown Response Type {0}."
-msgstr "Onbekend antwoord type {0}"
-
-#: org/postgresql/core/v2/QueryExecutorImpl.java:453
-#: org/postgresql/core/v2/QueryExecutorImpl.java:503
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1962
-msgid "Ran out of memory retrieving query results."
+#: org/postgresql/core/UTF8Encoding.java:135
+#, java-format
+msgid "Illegal UTF-8 sequence: final value is out of range: {0}"
msgstr ""
-#: org/postgresql/core/v2/QueryExecutorImpl.java:640
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2328
+#: org/postgresql/core/UTF8Encoding.java:151
#, java-format
-msgid "Unable to interpret the update count in command completion tag: {0}."
+msgid "Illegal UTF-8 sequence: final value is a surrogate value: {0}"
msgstr ""
-#: org/postgresql/core/v2/QueryExecutorImpl.java:654
-msgid "Copy not implemented for protocol version 2"
-msgstr ""
+#: org/postgresql/core/SetupQueryRunner.java:64
+msgid "An unexpected result was returned by a query."
+msgstr "Een onverwacht resultaat werd teruggegeven door een query"
-#: org/postgresql/core/v2/SocketFactoryFactory.java:36
+#: org/postgresql/core/PGStream.java:486
#, java-format
-msgid "The SocketFactory class provided {0} could not be instantiated."
+msgid "Premature end of input stream, expected {0} bytes, but only read {1}."
msgstr ""
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:253
-#, fuzzy, java-format
-msgid ""
-"Connection to {0} refused. Check that the hostname and port are correct and "
-"that the postmaster is accepting TCP/IP connections."
+#: org/postgresql/core/PGStream.java:528
+#, java-format
+msgid "Expected an EOF from server, got: {0}"
msgstr ""
-"Verbinding geweigerd. Controleer dat de hostnaam en poort correct zijn, en "
-"dat de postmaster is opgestart met de -i vlag, welke TCP/IP networking "
-"aanzet."
-#: org/postgresql/core/v3/CopyOperationImpl.java:57
+#: org/postgresql/core/v3/CopyOperationImpl.java:54
msgid "CommandComplete expected COPY but got: "
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:83
+#: org/postgresql/core/v3/CopyInImpl.java:47
+msgid "CopyIn copy direction can't receive data"
+msgstr ""
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:161
msgid "Tried to obtain lock while already holding it"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:98
+#: org/postgresql/core/v3/QueryExecutorImpl.java:177
msgid "Tried to break lock on database connection"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:115
+#: org/postgresql/core/v3/QueryExecutorImpl.java:195
msgid "Interrupted while waiting to obtain lock on database connection"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:220
+#: org/postgresql/core/v3/QueryExecutorImpl.java:327
msgid "Unable to bind parameter values for statement."
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:689
+#: org/postgresql/core/v3/QueryExecutorImpl.java:333
+#: org/postgresql/core/v3/QueryExecutorImpl.java:485
+#: org/postgresql/core/v3/QueryExecutorImpl.java:559
+#: org/postgresql/core/v3/QueryExecutorImpl.java:602
+#: org/postgresql/core/v3/QueryExecutorImpl.java:729
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2372
+#: org/postgresql/util/StreamWrapper.java:130
+#, fuzzy
+msgid "An I/O error occurred while sending to the backend."
+msgstr "Een I/O fout trad op tijdens het zenden naar de achterkant - {0}"
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:534
+#: org/postgresql/core/v3/QueryExecutorImpl.java:576
+#, java-format
+msgid "Expected command status BEGIN, got {0}."
+msgstr ""
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:581
+#: org/postgresql/jdbc/PgResultSet.java:1778
+#, java-format
+msgid "Unexpected command status: {0}."
+msgstr ""
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:687
+#, fuzzy
+msgid "An error occurred while trying to get the socket timeout."
+msgstr "Een I/O fout trad op tijdens het zenden naar de achterkant - {0}"
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:722
+#: org/postgresql/core/v3/QueryExecutorImpl.java:798
+#, fuzzy, java-format
+msgid "Unknown Response Type {0}."
+msgstr "Onbekend antwoord type {0}"
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:745
+#, fuzzy
+msgid "An error occurred while trying to reset the socket timeout."
+msgstr "Een I/O fout trad op tijdens het zenden naar de achterkant - {0}"
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:843
msgid "Database connection failed when starting copy"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:724
+#: org/postgresql/core/v3/QueryExecutorImpl.java:878
msgid "Tried to cancel an inactive copy operation"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:765
+#: org/postgresql/core/v3/QueryExecutorImpl.java:917
msgid "Database connection failed when canceling copy operation"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:781
+#: org/postgresql/core/v3/QueryExecutorImpl.java:933
msgid "Missing expected error response to copy cancel request"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:785
+#: org/postgresql/core/v3/QueryExecutorImpl.java:937
#, java-format
msgid "Got {0} error responses to single copy cancel request"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:800
+#: org/postgresql/core/v3/QueryExecutorImpl.java:952
msgid "Tried to end inactive copy"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:815
+#: org/postgresql/core/v3/QueryExecutorImpl.java:967
msgid "Database connection failed when ending copy"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:833
-#: org/postgresql/core/v3/QueryExecutorImpl.java:855
+#: org/postgresql/core/v3/QueryExecutorImpl.java:985
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1005
msgid "Tried to write to an inactive copy operation"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:848
-#: org/postgresql/core/v3/QueryExecutorImpl.java:863
+#: org/postgresql/core/v3/QueryExecutorImpl.java:998
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1013
msgid "Database connection failed when writing to copy"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:877
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1028
msgid "Tried to read from inactive copy"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:884
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1035
msgid "Database connection failed when reading from copy"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:956
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1101
#, java-format
msgid "Received CommandComplete ''{0}'' without an active copy operation"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:983
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1126
#, java-format
msgid "Got CopyInResponse from server during an active {0}"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:999
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1140
#, java-format
msgid "Got CopyOutResponse from server during an active {0}"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1017
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1154
+#, java-format
+msgid "Got CopyBothResponse from server during an active {0}"
+msgstr ""
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1170
msgid "Got CopyData without an active copy operation"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1021
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1174
#, java-format
msgid "Unexpected copydata from server for {0}"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1061
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2037
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1234
+#, java-format
+msgid "Unexpected packet type during copy: {0}"
+msgstr ""
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1524
+#, java-format
+msgid ""
+"Bind message length {0} too long. This can be caused by very large or "
+"incorrect length specifications on InputStream parameters."
+msgstr ""
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2145
+msgid "Ran out of memory retrieving query results."
+msgstr ""
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2313
+msgid "The driver currently does not support COPY operations."
+msgstr ""
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2487
+#, java-format
+msgid "Unable to parse the count in command completion tag: {0}."
+msgstr ""
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2603
#, java-format
msgid ""
"The server''s client_encoding parameter was changed to {0}. The JDBC driver "
"requires client_encoding to be UTF8 for correct operation."
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1069
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2045
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2611
#, java-format
msgid ""
"The server''s DateStyle parameter was changed to {0}. The JDBC driver "
"requires DateStyle to begin with ISO for correct operation."
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1083
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2059
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2624
#, java-format
msgid ""
"The server''s standard_conforming_strings parameter was reported as {0}. The "
"JDBC driver expected on or off."
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1122
+#: org/postgresql/core/v3/SimpleParameterList.java:54
+#: org/postgresql/core/v3/SimpleParameterList.java:65
+#: org/postgresql/core/v3/CompositeParameterList.java:33
+#: org/postgresql/jdbc/PgResultSetMetaData.java:493
+#: org/postgresql/jdbc/PgResultSet.java:2751
+#, fuzzy, java-format
+msgid "The column index is out of range: {0}, number of columns: {1}."
+msgstr "De kolom index is buiten bereik."
+
+#: org/postgresql/core/v3/SimpleParameterList.java:257
+#, fuzzy, java-format
+msgid "No value specified for parameter {0}."
+msgstr "Geen waarde opgegeven voor parameter {0}."
+
+#: org/postgresql/core/v3/SimpleParameterList.java:431
+#, fuzzy, java-format
+msgid "Added parameters index out of range: {0}, number of columns: {1}."
+msgstr "De kolom index is buiten bereik."
+
+#: org/postgresql/core/v3/replication/V3ReplicationProtocol.java:133
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:257
+#, fuzzy
+msgid "The connection attempt failed."
+msgstr "De poging om verbinding the maken faalde omdat {0}"
+
+#: org/postgresql/core/v3/replication/V3PGReplicationStream.java:144
#, java-format
-msgid "Unexpected packet type during copy: {0}"
+msgid "Unexpected packet type during replication: {0}"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1393
+#: org/postgresql/core/v3/replication/V3PGReplicationStream.java:269
+#, fuzzy
+msgid "This replication stream has been closed."
+msgstr "De poging om verbinding the maken faalde omdat {0}"
+
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:109
#, java-format
-msgid ""
-"Bind message length {0} too long. This can be caused by very large or "
-"incorrect length specifications on InputStream parameters."
+msgid "Invalid sslmode value: {0}"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2131
-msgid "The driver currently does not support COPY operations."
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:124
+#, fuzzy, java-format
+msgid "Invalid targetServerType value: {0}"
+msgstr "Onbekende Types waarde."
+
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:246
+#, fuzzy, java-format
+msgid ""
+"Connection to {0} refused. Check that the hostname and port are correct and "
+"that the postmaster is accepting TCP/IP connections."
msgstr ""
+"Verbinding geweigerd. Controleer dat de hostnaam en poort correct zijn, en "
+"dat de postmaster is opgestart met de -i vlag, welke TCP/IP networking "
+"aanzet."
-#: org/postgresql/Driver.java:234
-msgid "Error loading default settings from driverconfig.properties"
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:272
+#, java-format
+msgid "Could not find a server with specified targetServerType: {0}"
msgstr ""
-#: org/postgresql/Driver.java:247
-msgid "Properties for the driver contains a non-string value for the key "
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:366
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:379
+msgid "The server does not support SSL."
msgstr ""
-#: org/postgresql/Driver.java:290
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:393
+#, fuzzy
+msgid "An error occurred while setting up the SSL connection."
+msgstr "Een fout trad op tijdens het ophalen van het authenticatie verzoek."
+
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:494
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:521
msgid ""
-"Your security policy has prevented the connection from being attempted. You "
-"probably need to grant the connect java.net.SocketPermission to the database "
-"server host and port that you wish to connect to."
+"The server requested password-based authentication, but no password was "
+"provided."
msgstr ""
-#: org/postgresql/Driver.java:296 org/postgresql/Driver.java:362
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:624
msgid ""
-"Something unusual has occurred to cause the driver to fail. Please report "
-"this exception."
+"SCRAM authentication is not supported by this driver. You need JDK >= 8 and "
+"pgjdbc >= 42.2.0 (not \".jre\" vesions)"
msgstr ""
-"Iets ongewoons is opgetreden, wat deze driver doet falen. Rapporteer deze "
-"fout AUB: {0}"
-
-#: org/postgresql/Driver.java:370
-#, fuzzy
-msgid "Connection attempt timed out."
-msgstr "De poging om verbinding the maken faalde omdat {0}"
-
-#: org/postgresql/Driver.java:383
-#, fuzzy
-msgid "Interrupted while attempting to connect."
-msgstr "Een fout trad op tijdens het ophalen van het authenticatie verzoek."
-#: org/postgresql/Driver.java:645
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:648
#, fuzzy, java-format
-msgid "Method {0} is not yet implemented."
-msgstr "Deze methode is nog niet geimplementeerd"
+msgid ""
+"The authentication type {0} is not supported. Check that you have configured "
+"the pg_hba.conf file to include the client''s IP address or subnet, and that "
+"it is using an authentication scheme supported by the driver."
+msgstr ""
+"Het authenticatie type {0} wordt niet ondersteund. Controleer dat het IP "
+"adres of subnet van de client is geconfigureerd in de pg_hba.conf file, en "
+"dat het een authenticatie protocol gebruikt dat door de driver ondersteund "
+"wordt."
-#: org/postgresql/ds/common/BaseDataSource.java:1037
-#: org/postgresql/ds/common/BaseDataSource.java:1047
-#, fuzzy, java-format
-msgid "Unsupported property name: {0}"
-msgstr "Onbekende Types waarde."
+#: org/postgresql/core/ConnectionFactory.java:57
+#, java-format
+msgid "A connection could not be made using the requested protocol {0}."
+msgstr ""
-#: org/postgresql/ds/PGPooledConnection.java:118
-msgid "This PooledConnection has already been closed."
+#: org/postgresql/core/Oid.java:116
+#, java-format
+msgid "oid type {0} not known and not a number"
msgstr ""
-#: org/postgresql/ds/PGPooledConnection.java:313
+#: org/postgresql/util/HStoreConverter.java:43
+#: org/postgresql/util/HStoreConverter.java:74
+#: org/postgresql/jdbc/PgArray.java:210
+#: org/postgresql/jdbc/PgResultSet.java:1924
msgid ""
-"Connection has been closed automatically because a new connection was opened "
-"for the same PooledConnection or the PooledConnection has been closed."
+"Invalid character data was found. This is most likely caused by stored data "
+"containing characters that are invalid for the character set the database "
+"was created in. The most common example of this is storing 8bit data in a "
+"SQL_ASCII database."
msgstr ""
-#: org/postgresql/ds/PGPooledConnection.java:314
-msgid "Connection has been closed."
+#: org/postgresql/util/PGmoney.java:62
+#, fuzzy
+msgid "Conversion of money failed."
+msgstr "Conversie van money faalde - {0}."
+
+#: org/postgresql/util/StreamWrapper.java:56
+#: org/postgresql/jdbc/PgPreparedStatement.java:1449
+msgid "Object is too large to send over the protocol."
msgstr ""
-#: org/postgresql/ds/PGPooledConnection.java:418
-msgid "Statement has been closed."
+#: org/postgresql/util/PGInterval.java:152
+#, fuzzy
+msgid "Conversion of interval failed"
+msgstr "Conversie van money faalde - {0}."
+
+#: org/postgresql/util/ServerErrorMessage.java:45
+#, java-format
+msgid ""
+" (pgjdbc: autodetected server-encoding to be {0}, if the message is not "
+"readable, please check database logs and/or host, port, dbname, user, "
+"password, pg_hba.conf)"
msgstr ""
-#: org/postgresql/ds/PGPoolingDataSource.java:269
-msgid "Failed to setup DataSource."
+#: org/postgresql/util/ServerErrorMessage.java:176
+#, java-format
+msgid "Detail: {0}"
msgstr ""
-#: org/postgresql/ds/PGPoolingDataSource.java:371
-msgid "DataSource has been closed."
+#: org/postgresql/util/ServerErrorMessage.java:181
+#, java-format
+msgid "Hint: {0}"
msgstr ""
-#: org/postgresql/fastpath/Fastpath.java:82
-#, fuzzy, java-format
-msgid "Fastpath call {0} - No result was returned and we expected a numeric."
+#: org/postgresql/util/ServerErrorMessage.java:185
+#, java-format
+msgid "Position: {0}"
msgstr ""
-"Fastpath aanroep {0} - Geen resultaat werd teruggegeven, terwijl we een "
-"integer verwacht hadden."
-#: org/postgresql/fastpath/Fastpath.java:165
+#: org/postgresql/util/ServerErrorMessage.java:189
#, java-format
-msgid "Fastpath call {0} - No result was returned and we expected an integer."
+msgid "Where: {0}"
msgstr ""
-"Fastpath aanroep {0} - Geen resultaat werd teruggegeven, terwijl we een "
-"integer verwacht hadden."
-#: org/postgresql/fastpath/Fastpath.java:174
-#, fuzzy, java-format
-msgid ""
-"Fastpath call {0} - No result was returned or wrong size while expecting an "
-"integer."
+#: org/postgresql/util/ServerErrorMessage.java:195
+#, java-format
+msgid "Internal Query: {0}"
msgstr ""
-"Fastpath aanroep {0} - Geen resultaat werd teruggegeven, terwijl we een "
-"integer verwacht hadden."
-#: org/postgresql/fastpath/Fastpath.java:191
-#, fuzzy, java-format
-msgid "Fastpath call {0} - No result was returned and we expected a long."
+#: org/postgresql/util/ServerErrorMessage.java:199
+#, java-format
+msgid "Internal Position: {0}"
msgstr ""
-"Fastpath aanroep {0} - Geen resultaat werd teruggegeven, terwijl we een "
-"integer verwacht hadden."
-#: org/postgresql/fastpath/Fastpath.java:200
-#, fuzzy, java-format
-msgid ""
-"Fastpath call {0} - No result was returned or wrong size while expecting a "
-"long."
+#: org/postgresql/util/ServerErrorMessage.java:206
+#, java-format
+msgid "Location: File: {0}, Routine: {1}, Line: {2}"
msgstr ""
-"Fastpath aanroep {0} - Geen resultaat werd teruggegeven, terwijl we een "
-"integer verwacht hadden."
-#: org/postgresql/fastpath/Fastpath.java:312
+#: org/postgresql/util/ServerErrorMessage.java:211
#, java-format
-msgid "The fastpath function {0} is unknown."
-msgstr "De fastpath functie {0} is onbekend."
+msgid "Server SQLState: {0}"
+msgstr ""
-#: org/postgresql/geometric/PGbox.java:79
-#: org/postgresql/geometric/PGcircle.java:76
-#: org/postgresql/geometric/PGcircle.java:84
-#: org/postgresql/geometric/PGline.java:109
-#: org/postgresql/geometric/PGline.java:118
-#: org/postgresql/geometric/PGlseg.java:72
-#: org/postgresql/geometric/PGpoint.java:78
-#, fuzzy, java-format
-msgid "Conversion to type {0} failed: {1}."
-msgstr "Conversie van line faalde - {0}"
+#: org/postgresql/ds/PGPoolingDataSource.java:269
+msgid "Failed to setup DataSource."
+msgstr ""
+
+#: org/postgresql/ds/PGPoolingDataSource.java:371
+msgid "DataSource has been closed."
+msgstr ""
-#: org/postgresql/geometric/PGpath.java:73
+#: org/postgresql/ds/common/BaseDataSource.java:1132
+#: org/postgresql/ds/common/BaseDataSource.java:1142
#, fuzzy, java-format
-msgid "Cannot tell if path is open or closed: {0}."
-msgstr "Kan niet zeggen of path open of gesloten is."
+msgid "Unsupported property name: {0}"
+msgstr "Onbekende Types waarde."
-#: org/postgresql/gss/GssAction.java:141 org/postgresql/gss/MakeGSS.java:69
-#: org/postgresql/gss/MakeGSS.java:77
-msgid "GSS Authentication failed"
+#: org/postgresql/ds/PGPooledConnection.java:118
+msgid "This PooledConnection has already been closed."
msgstr ""
-#: org/postgresql/jdbc/AbstractBlobClob.java:89
+#: org/postgresql/ds/PGPooledConnection.java:314
msgid ""
-"Truncation of large objects is only implemented in 8.3 and later servers."
-msgstr ""
-
-#: org/postgresql/jdbc/AbstractBlobClob.java:94
-msgid "Cannot truncate LOB to a negative length."
+"Connection has been closed automatically because a new connection was opened "
+"for the same PooledConnection or the PooledConnection has been closed."
msgstr ""
-#: org/postgresql/jdbc/AbstractBlobClob.java:101
-#: org/postgresql/jdbc/AbstractBlobClob.java:245
-#, java-format
-msgid "PostgreSQL LOBs can only index to: {0}"
+#: org/postgresql/ds/PGPooledConnection.java:315
+msgid "Connection has been closed."
msgstr ""
-#: org/postgresql/jdbc/AbstractBlobClob.java:241
-msgid "LOB positioning offsets start at 1."
+#: org/postgresql/ds/PGPooledConnection.java:420
+msgid "Statement has been closed."
msgstr ""
-#: org/postgresql/jdbc/AbstractBlobClob.java:257
-msgid "free() was called on this LOB previously"
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:68
+msgid "No SCRAM mechanism(s) advertised by the server"
msgstr ""
-#: org/postgresql/jdbc/BatchResultHandler.java:41
-#: org/postgresql/jdbc/PgConnection.java:474
-#: org/postgresql/jdbc/PgPreparedStatement.java:138
-#: org/postgresql/jdbc/PgStatement.java:299
-msgid "A result was returned when none was expected."
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:81
+msgid "Invalid or unsupported by client SCRAM mechanisms"
msgstr ""
-#: org/postgresql/jdbc/BatchResultHandler.java:59
-#, fuzzy
-msgid "Too many update results were returned."
-msgstr "Geen resultaten werden teruggegeven door de query."
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:117
+#, fuzzy, java-format
+msgid "Invalid server-first-message: {0}"
+msgstr "Onbekende Types waarde."
-#: org/postgresql/jdbc/BatchResultHandler.java:88
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:147
#, fuzzy, java-format
-msgid ""
-"Batch entry {0} {1} was aborted. Call getNextException to see the cause."
-msgstr "Batch invoer {0} {1} werd afgebroken."
+msgid "Invalid server-final-message: {0}"
+msgstr "Onbekende Types waarde."
-#: org/postgresql/jdbc/EscapedFunctions.java:243
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:153
#, java-format
-msgid "{0} function takes four and only four argument."
+msgid "SCRAM authentication failed, server returned error: {0}"
msgstr ""
-#: org/postgresql/jdbc/EscapedFunctions.java:273
-#: org/postgresql/jdbc/EscapedFunctions.java:347
-#: org/postgresql/jdbc/EscapedFunctions.java:752
-#: org/postgresql/jdbc/EscapedFunctions.java:790
-#, java-format
-msgid "{0} function takes two and only two arguments."
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:160
+msgid "Invalid server SCRAM signature"
msgstr ""
-#: org/postgresql/jdbc/EscapedFunctions.java:291
-#: org/postgresql/jdbc/EscapedFunctions.java:329
-#: org/postgresql/jdbc/EscapedFunctions.java:449
-#: org/postgresql/jdbc/EscapedFunctions.java:464
-#: org/postgresql/jdbc/EscapedFunctions.java:479
-#: org/postgresql/jdbc/EscapedFunctions.java:494
-#: org/postgresql/jdbc/EscapedFunctions.java:509
-#: org/postgresql/jdbc/EscapedFunctions.java:524
-#: org/postgresql/jdbc/EscapedFunctions.java:539
-#: org/postgresql/jdbc/EscapedFunctions.java:554
-#: org/postgresql/jdbc/EscapedFunctions.java:569
-#: org/postgresql/jdbc/EscapedFunctions.java:584
-#: org/postgresql/jdbc/EscapedFunctions.java:599
-#: org/postgresql/jdbc/EscapedFunctions.java:614
-#: org/postgresql/jdbc/EscapedFunctions.java:778
-#, java-format
-msgid "{0} function takes one and only one argument."
+#: org/postgresql/osgi/PGDataSourceFactory.java:82
+#, fuzzy, java-format
+msgid "Unsupported properties: {0}"
+msgstr "Onbekende Types waarde."
+
+#: org/postgresql/Driver.java:214
+msgid "Error loading default settings from driverconfig.properties"
msgstr ""
-#: org/postgresql/jdbc/EscapedFunctions.java:313
-#: org/postgresql/jdbc/EscapedFunctions.java:394
-#, java-format
-msgid "{0} function takes two or three arguments."
+#: org/postgresql/Driver.java:226
+msgid "Properties for the driver contains a non-string value for the key "
msgstr ""
-#: org/postgresql/jdbc/EscapedFunctions.java:419
-#: org/postgresql/jdbc/EscapedFunctions.java:434
-#: org/postgresql/jdbc/EscapedFunctions.java:737
-#: org/postgresql/jdbc/EscapedFunctions.java:767
-#, java-format
-msgid "{0} function doesn''t take any argument."
+#: org/postgresql/Driver.java:270
+msgid ""
+"Your security policy has prevented the connection from being attempted. You "
+"probably need to grant the connect java.net.SocketPermission to the database "
+"server host and port that you wish to connect to."
msgstr ""
-#: org/postgresql/jdbc/EscapedFunctions.java:630
-#: org/postgresql/jdbc/EscapedFunctions.java:683
-#, java-format
-msgid "{0} function takes three and only three arguments."
+#: org/postgresql/Driver.java:276 org/postgresql/Driver.java:408
+msgid ""
+"Something unusual has occurred to cause the driver to fail. Please report "
+"this exception."
msgstr ""
+"Iets ongewoons is opgetreden, wat deze driver doet falen. Rapporteer deze "
+"fout AUB: {0}"
-#: org/postgresql/jdbc/EscapedFunctions.java:643
-#: org/postgresql/jdbc/EscapedFunctions.java:664
-#: org/postgresql/jdbc/EscapedFunctions.java:667
-#: org/postgresql/jdbc/EscapedFunctions.java:700
-#: org/postgresql/jdbc/EscapedFunctions.java:713
-#: org/postgresql/jdbc/EscapedFunctions.java:716
+#: org/postgresql/Driver.java:416
+#, fuzzy
+msgid "Connection attempt timed out."
+msgstr "De poging om verbinding the maken faalde omdat {0}"
+
+#: org/postgresql/Driver.java:429
+#, fuzzy
+msgid "Interrupted while attempting to connect."
+msgstr "Een fout trad op tijdens het ophalen van het authenticatie verzoek."
+
+#: org/postgresql/Driver.java:682
#, fuzzy, java-format
-msgid "Interval {0} not yet implemented"
+msgid "Method {0} is not yet implemented."
msgstr "Deze methode is nog niet geimplementeerd"
-#: org/postgresql/jdbc/PgArray.java:166 org/postgresql/jdbc/PgArray.java:822
+#: org/postgresql/geometric/PGlseg.java:70
+#: org/postgresql/geometric/PGline.java:107
+#: org/postgresql/geometric/PGline.java:116
+#: org/postgresql/geometric/PGcircle.java:74
+#: org/postgresql/geometric/PGcircle.java:82
+#: org/postgresql/geometric/PGpoint.java:76
+#: org/postgresql/geometric/PGbox.java:77
#, fuzzy, java-format
-msgid "The array index is out of range: {0}"
-msgstr "De kolom index is buiten bereik."
+msgid "Conversion to type {0} failed: {1}."
+msgstr "Conversie van line faalde - {0}"
+
+#: org/postgresql/geometric/PGpath.java:70
+#, fuzzy, java-format
+msgid "Cannot tell if path is open or closed: {0}."
+msgstr "Kan niet zeggen of path open of gesloten is."
+
+#: org/postgresql/xa/PGXAConnection.java:128
+msgid ""
+"Transaction control methods setAutoCommit(true), commit, rollback and "
+"setSavePoint not allowed while an XA transaction is active."
+msgstr ""
-#: org/postgresql/jdbc/PgArray.java:183 org/postgresql/jdbc/PgArray.java:839
+#: org/postgresql/xa/PGXAConnection.java:177
+#: org/postgresql/xa/PGXAConnection.java:253
+#: org/postgresql/xa/PGXAConnection.java:347
#, java-format
-msgid "The array index is out of range: {0}, number of elements: {1}."
+msgid "Invalid flags {0}"
msgstr ""
-#: org/postgresql/jdbc/PgArray.java:215
-#: org/postgresql/jdbc/PgResultSet.java:1885
-#: org/postgresql/util/HStoreConverter.java:38
-#: org/postgresql/util/HStoreConverter.java:69
-msgid ""
-"Invalid character data was found. This is most likely caused by stored data "
-"containing characters that are invalid for the character set the database "
-"was created in. The most common example of this is storing 8bit data in a "
-"SQL_ASCII database."
+#: org/postgresql/xa/PGXAConnection.java:181
+#: org/postgresql/xa/PGXAConnection.java:257
+#: org/postgresql/xa/PGXAConnection.java:449
+msgid "xid must not be null"
msgstr ""
-#: org/postgresql/jdbc/PgCallableStatement.java:90
-#: org/postgresql/jdbc/PgCallableStatement.java:96
-#, fuzzy
-msgid "A CallableStatement was executed with nothing returned."
-msgstr "Callable Statements worden op dit moment niet ondersteund."
+#: org/postgresql/xa/PGXAConnection.java:185
+msgid "Connection is busy with another transaction"
+msgstr ""
-#: org/postgresql/jdbc/PgCallableStatement.java:107
+#: org/postgresql/xa/PGXAConnection.java:194
+#: org/postgresql/xa/PGXAConnection.java:267
#, fuzzy
-msgid "A CallableStatement was executed with an invalid number of parameters"
-msgstr "Callable Statements worden op dit moment niet ondersteund."
+msgid "suspend/resume not implemented"
+msgstr "Deze methode is nog niet geimplementeerd"
-#: org/postgresql/jdbc/PgCallableStatement.java:139
+#: org/postgresql/xa/PGXAConnection.java:202
+#: org/postgresql/xa/PGXAConnection.java:209
+#: org/postgresql/xa/PGXAConnection.java:213
#, java-format
msgid ""
-"A CallableStatement function was executed and the out parameter {0} was of "
-"type {1} however type {2} was registered."
+"Invalid protocol state requested. Attempted transaction interleaving is not "
+"supported. xid={0}, currentXid={1}, state={2}, flags={3}"
msgstr ""
-#: org/postgresql/jdbc/PgCallableStatement.java:195
-msgid ""
-"This statement does not declare an OUT parameter. Use '{' ?= call ... '}' "
-"to declare one."
-msgstr ""
-
-#: org/postgresql/jdbc/PgCallableStatement.java:239
-msgid "wasNull cannot be call before fetching a result."
+#: org/postgresql/xa/PGXAConnection.java:224
+msgid "Error disabling autocommit"
msgstr ""
-#: org/postgresql/jdbc/PgCallableStatement.java:377
-#: org/postgresql/jdbc/PgCallableStatement.java:396
+#: org/postgresql/xa/PGXAConnection.java:261
#, java-format
msgid ""
-"Parameter of type {0} was registered, but call to get{1} (sqltype={2}) was "
-"made."
+"tried to call end without corresponding start call. state={0}, start "
+"xid={1}, currentXid={2}, preparedXid={3}"
msgstr ""
-#: org/postgresql/jdbc/PgCallableStatement.java:417
+#: org/postgresql/xa/PGXAConnection.java:297
+#, java-format
msgid ""
-"A CallableStatement was declared, but no call to registerOutParameter(1, "
-"<some type>) was made."
+"Preparing already prepared transaction, the prepared xid {0}, prepare xid={1}"
msgstr ""
-#: org/postgresql/jdbc/PgCallableStatement.java:423
-msgid "No function outputs were registered."
+#: org/postgresql/xa/PGXAConnection.java:300
+#, java-format
+msgid "Current connection does not have an associated xid. prepare xid={0}"
msgstr ""
-#: org/postgresql/jdbc/PgCallableStatement.java:429
+#: org/postgresql/xa/PGXAConnection.java:307
+#, java-format
msgid ""
-"Results cannot be retrieved from a CallableStatement before it is executed."
+"Not implemented: Prepare must be issued using the same connection that "
+"started the transaction. currentXid={0}, prepare xid={1}"
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:312
+#: org/postgresql/xa/PGXAConnection.java:311
#, java-format
-msgid "Unsupported value for stringtype parameter: {0}"
-msgstr ""
-
-#: org/postgresql/jdbc/PgConnection.java:457
-#: org/postgresql/jdbc/PgPreparedStatement.java:115
-#: org/postgresql/jdbc/PgStatement.java:282
-#: org/postgresql/jdbc/TypeInfoCache.java:230
-#: org/postgresql/jdbc/TypeInfoCache.java:370
-#: org/postgresql/jdbc/TypeInfoCache.java:412
-#: org/postgresql/jdbc/TypeInfoCache.java:489
-#: org/postgresql/jdbc/TypeInfoCache.java:494
-#: org/postgresql/jdbc/TypeInfoCache.java:535
-#: org/postgresql/jdbc/TypeInfoCache.java:540
-msgid "No results were returned by the query."
-msgstr "Geen resultaten werden teruggegeven door de query."
-
-#: org/postgresql/jdbc/PgConnection.java:578
-msgid "Custom type maps are not supported."
+msgid "Prepare called before end. prepare xid={0}, state={1}"
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:620
-#, fuzzy, java-format
-msgid "Failed to create object for: {0}."
-msgstr "Kon geen object aanmaken voor {0} {1}"
-
-#: org/postgresql/jdbc/PgConnection.java:672
+#: org/postgresql/xa/PGXAConnection.java:331
#, java-format
-msgid "Unable to load the class {0} responsible for the datatype {1}"
+msgid "Error preparing transaction. prepare xid={0}"
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:724
-msgid ""
-"Cannot change transaction read-only property in the middle of a transaction."
+#: org/postgresql/xa/PGXAConnection.java:382
+msgid "Error during recover"
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:775
-msgid "Cannot commit when autoCommit is enabled."
+#: org/postgresql/xa/PGXAConnection.java:438
+#, java-format
+msgid ""
+"Error rolling back prepared transaction. rollback xid={0}, preparedXid={1}, "
+"currentXid={2}"
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:786
-#: org/postgresql/jdbc/PgConnection.java:1358
-#: org/postgresql/jdbc/PgConnection.java:1395
-#, fuzzy
-msgid "This connection has been closed."
-msgstr "De poging om verbinding the maken faalde omdat {0}"
-
-#: org/postgresql/jdbc/PgConnection.java:796
-msgid "Cannot rollback when autoCommit is enabled."
+#: org/postgresql/xa/PGXAConnection.java:471
+#, java-format
+msgid ""
+"One-phase commit called for xid {0} but connection was prepared with xid {1}"
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:870
+#: org/postgresql/xa/PGXAConnection.java:479
msgid ""
-"Cannot change transaction isolation level in the middle of a transaction."
+"Not implemented: one-phase commit must be issued using the same connection "
+"that was used to start it"
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:876
+#: org/postgresql/xa/PGXAConnection.java:483
#, java-format
-msgid "Transaction isolation level {0} not supported."
+msgid "One-phase commit with unknown xid. commit xid={0}, currentXid={1}"
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:921
-msgid "Finalizing a Connection that was never closed:"
+#: org/postgresql/xa/PGXAConnection.java:487
+#, java-format
+msgid "commit called before end. commit xid={0}, state={1}"
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:1009
-msgid "Unable to translate data into the desired encoding."
+#: org/postgresql/xa/PGXAConnection.java:498
+#, java-format
+msgid "Error during one-phase commit. commit xid={0}"
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:1081
-#: org/postgresql/jdbc/PgResultSet.java:1782
-#: org/postgresql/jdbc/PgStatement.java:1053
-msgid "Fetch size must be a value greater to or equal to 0."
+#: org/postgresql/xa/PGXAConnection.java:517
+msgid ""
+"Not implemented: 2nd phase commit must be issued using an idle connection. "
+"commit xid={0}, currentXid={1}, state={2], transactionState={3}"
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:1311
+#: org/postgresql/xa/PGXAConnection.java:550
#, java-format
-msgid "Unable to find server array type for provided name {0}."
+msgid ""
+"Error committing prepared transaction. commit xid={0}, preparedXid={1}, "
+"currentXid={2}"
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:1327
+#: org/postgresql/xa/PGXAConnection.java:567
#, java-format
-msgid "Invalid timeout ({0}<0)."
+msgid "Heuristic commit/rollback not supported. forget xid={0}"
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:1340
-msgid "Validating connection."
-msgstr ""
-
-#: org/postgresql/jdbc/PgConnection.java:1375
-#, fuzzy, java-format
-msgid "Failed to set ClientInfo property: {0}"
-msgstr "Kon geen object aanmaken voor {0} {1}"
-
-#: org/postgresql/jdbc/PgConnection.java:1383
-msgid "ClientInfo property not supported."
-msgstr ""
-
-#: org/postgresql/jdbc/PgConnection.java:1408
-msgid "One ore more ClientInfo failed."
+#: org/postgresql/jdbc/PgSQLXML.java:147
+msgid "Unable to decode xml data."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:1517
+#: org/postgresql/jdbc/PgSQLXML.java:150
#, java-format
-msgid "Unknown ResultSet holdability setting: {0}."
+msgid "Unknown XML Source class: {0}"
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:1531
-#: org/postgresql/jdbc/PgConnection.java:1554
-#: org/postgresql/jdbc/PgConnection.java:1576
-#: org/postgresql/jdbc/PgConnection.java:1587
-msgid "Server versions prior to 8.0 do not support savepoints."
-msgstr ""
+#: org/postgresql/jdbc/PgSQLXML.java:193
+#, fuzzy
+msgid "Unable to create SAXResult for SQLXML."
+msgstr "Kon geen object aanmaken voor {0} {1}"
-#: org/postgresql/jdbc/PgConnection.java:1535
-#: org/postgresql/jdbc/PgConnection.java:1558
-msgid "Cannot establish a savepoint in auto-commit mode."
+#: org/postgresql/jdbc/PgSQLXML.java:208
+msgid "Unable to create StAXResult for SQLXML"
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:1635
-msgid "Returning autogenerated keys is not supported."
+#: org/postgresql/jdbc/PgSQLXML.java:213
+#, java-format
+msgid "Unknown XML Result class: {0}"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:78
-msgid ""
-"Unable to determine a value for MaxIndexKeys due to missing system catalog "
-"data."
+#: org/postgresql/jdbc/PgSQLXML.java:225
+msgid "This SQLXML object has already been freed."
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:100
-msgid "Unable to find name datatype in the system catalogs."
+#: org/postgresql/jdbc/PgSQLXML.java:234
+msgid ""
+"This SQLXML object has not been initialized, so you cannot retrieve data "
+"from it."
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1117
-msgid "proname"
+#: org/postgresql/jdbc/PgSQLXML.java:247
+#, java-format
+msgid "Failed to convert binary xml data to encoding: {0}."
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1117
-msgid "oid"
+#: org/postgresql/jdbc/PgSQLXML.java:273
+msgid "Unable to convert DOMResult SQLXML data to a string."
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1119
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1714
-msgid "typtype"
+#: org/postgresql/jdbc/PgSQLXML.java:287
+msgid ""
+"This SQLXML object has already been initialized, so you cannot manipulate it "
+"further."
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1122
-msgid "proargtypes"
+#: org/postgresql/jdbc/PSQLSavepoint.java:37
+#: org/postgresql/jdbc/PSQLSavepoint.java:51
+#: org/postgresql/jdbc/PSQLSavepoint.java:69
+msgid "Cannot reference a savepoint after it has been released."
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1732
-msgid "adsrc"
+#: org/postgresql/jdbc/PSQLSavepoint.java:42
+msgid "Cannot retrieve the id of a named savepoint."
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1872
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1963
-msgid "rolname"
+#: org/postgresql/jdbc/PSQLSavepoint.java:56
+msgid "Cannot retrieve the name of an unnamed savepoint."
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1873
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1964
-msgid "relacl"
-msgstr ""
+#: org/postgresql/jdbc/PgArray.java:157 org/postgresql/jdbc/PgArray.java:844
+#, fuzzy, java-format
+msgid "The array index is out of range: {0}"
+msgstr "De kolom index is buiten bereik."
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1878
-msgid "attacl"
+#: org/postgresql/jdbc/PgArray.java:178 org/postgresql/jdbc/PgArray.java:861
+#, java-format
+msgid "The array index is out of range: {0}, number of elements: {1}."
msgstr ""
-#: org/postgresql/jdbc/PgParameterMetaData.java:86
+#: org/postgresql/jdbc/PgParameterMetaData.java:83
#, fuzzy, java-format
msgid "The parameter index is out of range: {0}, number of parameters: {1}."
msgstr "De kolom index is buiten bereik."
-#: org/postgresql/jdbc/PgPreparedStatement.java:102
-#: org/postgresql/jdbc/PgPreparedStatement.java:128
-#: org/postgresql/jdbc/PgPreparedStatement.java:150
-#: org/postgresql/jdbc/PgPreparedStatement.java:1108
-msgid ""
-"Can''t use query methods that take a query string on a PreparedStatement."
-msgstr ""
-
-#: org/postgresql/jdbc/PgPreparedStatement.java:119
-#: org/postgresql/jdbc/PgStatement.java:286
+#: org/postgresql/jdbc/BatchResultHandler.java:92
#, fuzzy
-msgid "Multiple ResultSets were returned by the query."
+msgid "Too many update results were returned."
msgstr "Geen resultaten werden teruggegeven door de query."
-#: org/postgresql/jdbc/PgPreparedStatement.java:270
-msgid "Unknown Types value."
-msgstr "Onbekende Types waarde."
+#: org/postgresql/jdbc/BatchResultHandler.java:146
+#, fuzzy, java-format
+msgid ""
+"Batch entry {0} {1} was aborted: {2} Call getNextException to see other "
+"errors in the batch."
+msgstr "Batch invoer {0} {1} werd afgebroken."
-#: org/postgresql/jdbc/PgPreparedStatement.java:417
-#: org/postgresql/jdbc/PgPreparedStatement.java:486
-#: org/postgresql/jdbc/PgPreparedStatement.java:1251
-#: org/postgresql/jdbc/PgPreparedStatement.java:1583
+#: org/postgresql/jdbc/PgConnection.java:272
#, java-format
-msgid "Invalid stream length {0}."
+msgid "Unsupported value for stringtype parameter: {0}"
msgstr ""
-#: org/postgresql/jdbc/PgPreparedStatement.java:447
-#, java-format
-msgid "The JVM claims not to support the {0} encoding."
+#: org/postgresql/jdbc/PgConnection.java:424
+#: org/postgresql/jdbc/PgStatement.java:225
+#: org/postgresql/jdbc/TypeInfoCache.java:226
+#: org/postgresql/jdbc/TypeInfoCache.java:371
+#: org/postgresql/jdbc/TypeInfoCache.java:411
+#: org/postgresql/jdbc/TypeInfoCache.java:484
+#: org/postgresql/jdbc/TypeInfoCache.java:489
+#: org/postgresql/jdbc/TypeInfoCache.java:526
+#: org/postgresql/jdbc/TypeInfoCache.java:531
+#: org/postgresql/jdbc/PgPreparedStatement.java:119
+msgid "No results were returned by the query."
+msgstr "Geen resultaten werden teruggegeven door de query."
+
+#: org/postgresql/jdbc/PgConnection.java:441
+#: org/postgresql/jdbc/PgStatement.java:254
+msgid "A result was returned when none was expected."
msgstr ""
-#: org/postgresql/jdbc/PgPreparedStatement.java:450
-#: org/postgresql/jdbc/PgPreparedStatement.java:519
-#: org/postgresql/jdbc/PgResultSet.java:1075
-#: org/postgresql/jdbc/PgResultSet.java:1109
-msgid "Provided InputStream failed."
+#: org/postgresql/jdbc/PgConnection.java:545
+msgid "Custom type maps are not supported."
msgstr ""
-#: org/postgresql/jdbc/PgPreparedStatement.java:536
-#: org/postgresql/jdbc/PgPreparedStatement.java:1170
+#: org/postgresql/jdbc/PgConnection.java:587
#, fuzzy, java-format
-msgid "Unknown type {0}."
-msgstr "Onbekend antwoord type {0}"
+msgid "Failed to create object for: {0}."
+msgstr "Kon geen object aanmaken voor {0} {1}"
-#: org/postgresql/jdbc/PgPreparedStatement.java:553
-msgid "No hstore extension installed."
+#: org/postgresql/jdbc/PgConnection.java:641
+#, java-format
+msgid "Unable to load the class {0} responsible for the datatype {1}"
msgstr ""
-#: org/postgresql/jdbc/PgPreparedStatement.java:683
-#: org/postgresql/jdbc/PgPreparedStatement.java:705
-#: org/postgresql/jdbc/PgPreparedStatement.java:715
-#: org/postgresql/jdbc/PgPreparedStatement.java:725
-#, java-format
-msgid "Cannot cast an instance of {0} to type {1}"
+#: org/postgresql/jdbc/PgConnection.java:693
+msgid ""
+"Cannot change transaction read-only property in the middle of a transaction."
msgstr ""
-#: org/postgresql/jdbc/PgPreparedStatement.java:741
-#, fuzzy, java-format
-msgid "Unsupported Types value: {0}"
-msgstr "Onbekende Types waarde."
+#: org/postgresql/jdbc/PgConnection.java:756
+msgid "Cannot commit when autoCommit is enabled."
+msgstr ""
-#: org/postgresql/jdbc/PgPreparedStatement.java:970
-#, java-format
-msgid "Cannot convert an instance of {0} to type {1}"
+#: org/postgresql/jdbc/PgConnection.java:767
+#: org/postgresql/jdbc/PgConnection.java:1384
+#: org/postgresql/jdbc/PgConnection.java:1428
+#, fuzzy
+msgid "This connection has been closed."
+msgstr "De poging om verbinding the maken faalde omdat {0}"
+
+#: org/postgresql/jdbc/PgConnection.java:777
+msgid "Cannot rollback when autoCommit is enabled."
msgstr ""
-#: org/postgresql/jdbc/PgPreparedStatement.java:1040
-#, java-format
+#: org/postgresql/jdbc/PgConnection.java:827
msgid ""
-"Can''t infer the SQL type to use for an instance of {0}. Use setObject() "
-"with an explicit Types value to specify the type to use."
+"Cannot change transaction isolation level in the middle of a transaction."
msgstr ""
-#: org/postgresql/jdbc/PgPreparedStatement.java:1207
-#: org/postgresql/jdbc/PgPreparedStatement.java:1303
-#: org/postgresql/jdbc/PgPreparedStatement.java:1340
-msgid "Unexpected error writing large object to database."
+#: org/postgresql/jdbc/PgConnection.java:833
+#, java-format
+msgid "Transaction isolation level {0} not supported."
msgstr ""
-#: org/postgresql/jdbc/PgPreparedStatement.java:1278
-#: org/postgresql/jdbc/PgResultSet.java:1163
-msgid "Provided Reader failed."
+#: org/postgresql/jdbc/PgConnection.java:878
+msgid "Finalizing a Connection that was never closed:"
msgstr ""
-#: org/postgresql/jdbc/PgPreparedStatement.java:1542
-#: org/postgresql/util/StreamWrapper.java:59
-msgid "Object is too large to send over the protocol."
+#: org/postgresql/jdbc/PgConnection.java:945
+msgid "Unable to translate data into the desired encoding."
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:285
-msgid ""
-"Operation requires a scrollable ResultSet, but this ResultSet is "
-"FORWARD_ONLY."
+#: org/postgresql/jdbc/PgConnection.java:1008
+#: org/postgresql/jdbc/PgStatement.java:903
+#: org/postgresql/jdbc/PgResultSet.java:1817
+msgid "Fetch size must be a value greater to or equal to 0."
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:456
-msgid "Unexpected error while decoding character data from a large object."
+#: org/postgresql/jdbc/PgConnection.java:1289
+#: org/postgresql/jdbc/PgConnection.java:1330
+#, java-format
+msgid "Unable to find server array type for provided name {0}."
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:507
-#: org/postgresql/jdbc/PgResultSet.java:537
-#: org/postgresql/jdbc/PgResultSet.java:570
-#: org/postgresql/jdbc/PgResultSet.java:2964
-#: org/postgresql/jdbc/PgResultSet.java:3008
+#: org/postgresql/jdbc/PgConnection.java:1312
#, java-format
-msgid "Cannot convert the column of type {0} to requested type {1}."
+msgid "Invalid elements {0}"
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:789
-#: org/postgresql/jdbc/PgResultSet.java:810
-#: org/postgresql/jdbc/PgResultSet.java:1797
-msgid "Can''t use relative move methods while on the insert row."
+#: org/postgresql/jdbc/PgConnection.java:1348
+#, java-format
+msgid "Invalid timeout ({0}<0)."
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:829
-#: org/postgresql/jdbc/PgStatement.java:1045
-#, java-format
-msgid "Invalid fetch direction constant: {0}."
+#: org/postgresql/jdbc/PgConnection.java:1372
+msgid "Validating connection."
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:840
-msgid "Cannot call cancelRowUpdates() when on the insert row."
+#: org/postgresql/jdbc/PgConnection.java:1405
+#, fuzzy, java-format
+msgid "Failed to set ClientInfo property: {0}"
+msgstr "Kon geen object aanmaken voor {0} {1}"
+
+#: org/postgresql/jdbc/PgConnection.java:1415
+msgid "ClientInfo property not supported."
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:856
-msgid "Cannot call deleteRow() when on the insert row."
+#: org/postgresql/jdbc/PgConnection.java:1441
+msgid "One ore more ClientInfo failed."
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:863
-msgid ""
-"Currently positioned before the start of the ResultSet. You cannot call "
-"deleteRow() here."
+#: org/postgresql/jdbc/PgConnection.java:1540
+msgid "Network timeout must be a value greater than or equal to 0."
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:869
-msgid ""
-"Currently positioned after the end of the ResultSet. You cannot call "
-"deleteRow() here."
+#: org/postgresql/jdbc/PgConnection.java:1552
+msgid "Unable to set network timeout."
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:873
-#, fuzzy
-msgid "There are no rows in this ResultSet."
-msgstr "De kolom naam {0} is niet gevonden."
+#: org/postgresql/jdbc/PgConnection.java:1563
+msgid "Unable to get network timeout."
+msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:914
-msgid "Not on the insert row."
+#: org/postgresql/jdbc/PgConnection.java:1580
+#, java-format
+msgid "Unknown ResultSet holdability setting: {0}."
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:916
-msgid "You must specify at least one column value to insert a row."
+#: org/postgresql/jdbc/PgConnection.java:1598
+#: org/postgresql/jdbc/PgConnection.java:1619
+msgid "Cannot establish a savepoint in auto-commit mode."
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:1072
-#: org/postgresql/jdbc/PgResultSet.java:1706
-#: org/postgresql/jdbc/PgResultSet.java:2377
-#: org/postgresql/jdbc/PgResultSet.java:2402
-#, java-format
-msgid "The JVM claims not to support the encoding: {0}"
+#: org/postgresql/jdbc/PgConnection.java:1685
+msgid "Returning autogenerated keys is not supported."
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:1214
-msgid "Can''t refresh the insert row."
+#: org/postgresql/jdbc/PgStatement.java:235
+#, fuzzy
+msgid "Multiple ResultSets were returned by the query."
+msgstr "Geen resultaten werden teruggegeven door de query."
+
+#: org/postgresql/jdbc/PgStatement.java:316
+msgid "Can''t use executeWithFlags(int) on a Statement."
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:1280
-msgid "Cannot call updateRow() when on the insert row."
+#: org/postgresql/jdbc/PgStatement.java:509
+msgid "Maximum number of rows must be a value grater than or equal to 0."
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:1287
-#: org/postgresql/jdbc/PgResultSet.java:3025
-msgid ""
-"Cannot update the ResultSet because it is either before the start or after "
-"the end of the results."
+#: org/postgresql/jdbc/PgStatement.java:550
+msgid "Query timeout must be a value greater than or equals to 0."
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:1486
-msgid "ResultSets with concurrency CONCUR_READ_ONLY cannot be updated."
+#: org/postgresql/jdbc/PgStatement.java:590
+msgid "The maximum field size must be a value greater than or equal to 0."
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:1555
-#, java-format
-msgid "No primary key found for table {0}."
+#: org/postgresql/jdbc/PgStatement.java:689
+msgid "This statement has been closed."
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:1941
-#: org/postgresql/jdbc/PgResultSet.java:1946
-#: org/postgresql/jdbc/PgResultSet.java:1986
-#: org/postgresql/jdbc/PgResultSet.java:1992
-#: org/postgresql/jdbc/PgResultSet.java:2790
-#: org/postgresql/jdbc/PgResultSet.java:2796
-#: org/postgresql/jdbc/PgResultSet.java:2820
-#: org/postgresql/jdbc/PgResultSet.java:2825
-#: org/postgresql/jdbc/PgResultSet.java:2841
-#: org/postgresql/jdbc/PgResultSet.java:2862
-#: org/postgresql/jdbc/PgResultSet.java:2873
-#: org/postgresql/jdbc/PgResultSet.java:2886
-#: org/postgresql/jdbc/PgResultSet.java:3013
+#: org/postgresql/jdbc/PgStatement.java:895
+#: org/postgresql/jdbc/PgResultSet.java:878
#, java-format
-msgid "Bad value for type {0} : {1}"
+msgid "Invalid fetch direction constant: {0}."
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:2564
-#, fuzzy, java-format
-msgid "The column name {0} was not found in this ResultSet."
-msgstr "De kolom naam {0} is niet gevonden."
+#: org/postgresql/jdbc/PgStatement.java:1145
+#: org/postgresql/jdbc/PgStatement.java:1173
+msgid "Returning autogenerated keys by column index is not supported."
+msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:2689
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:66
msgid ""
-"ResultSet is not updateable. The query that generated this result set must "
-"select only one table, and must select all primary keys from that table. See "
-"the JDBC 2.1 API Specification, section 5.6 for more details."
+"Unable to determine a value for MaxIndexKeys due to missing system catalog "
+"data."
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:2701
-msgid "This ResultSet is closed."
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:89
+msgid "Unable to find name datatype in the system catalogs."
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:2732
-msgid "ResultSet not positioned properly, perhaps you need to call next."
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1028
+msgid "proname"
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:3045
-msgid "Invalid UUID data."
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1028
+msgid "oid"
msgstr ""
-#: org/postgresql/jdbc/PgSQLXML.java:150
-msgid "Unable to decode xml data."
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1030
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1481
+msgid "typtype"
msgstr ""
-#: org/postgresql/jdbc/PgSQLXML.java:153
-#, java-format
-msgid "Unknown XML Source class: {0}"
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1033
+msgid "proargtypes"
msgstr ""
-#: org/postgresql/jdbc/PgSQLXML.java:196
-#, fuzzy
-msgid "Unable to create SAXResult for SQLXML."
-msgstr "Kon geen object aanmaken voor {0} {1}"
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1499
+msgid "adsrc"
+msgstr ""
-#: org/postgresql/jdbc/PgSQLXML.java:211
-msgid "Unable to create StAXResult for SQLXML"
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1512
+msgid "attidentity"
msgstr ""
-#: org/postgresql/jdbc/PgSQLXML.java:216
-#, java-format
-msgid "Unknown XML Result class: {0}"
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1608
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1684
+msgid "rolname"
msgstr ""
-#: org/postgresql/jdbc/PgSQLXML.java:228
-msgid "This SQLXML object has already been freed."
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1609
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1685
+msgid "relacl"
+msgstr ""
+
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1615
+msgid "attacl"
msgstr ""
-#: org/postgresql/jdbc/PgSQLXML.java:237
+#: org/postgresql/jdbc/AbstractBlobClob.java:78
msgid ""
-"This SQLXML object has not been initialized, so you cannot retrieve data "
-"from it."
+"Truncation of large objects is only implemented in 8.3 and later servers."
+msgstr ""
+
+#: org/postgresql/jdbc/AbstractBlobClob.java:83
+msgid "Cannot truncate LOB to a negative length."
msgstr ""
-#: org/postgresql/jdbc/PgSQLXML.java:250
+#: org/postgresql/jdbc/AbstractBlobClob.java:90
+#: org/postgresql/jdbc/AbstractBlobClob.java:234
#, java-format
-msgid "Failed to convert binary xml data to encoding: {0}."
+msgid "PostgreSQL LOBs can only index to: {0}"
msgstr ""
-#: org/postgresql/jdbc/PgSQLXML.java:276
-msgid "Unable to convert DOMResult SQLXML data to a string."
+#: org/postgresql/jdbc/AbstractBlobClob.java:230
+msgid "LOB positioning offsets start at 1."
msgstr ""
-#: org/postgresql/jdbc/PgSQLXML.java:290
+#: org/postgresql/jdbc/AbstractBlobClob.java:246
+msgid "free() was called on this LOB previously"
+msgstr ""
+
+#: org/postgresql/jdbc/PgPreparedStatement.java:106
+#: org/postgresql/jdbc/PgPreparedStatement.java:127
+#: org/postgresql/jdbc/PgPreparedStatement.java:139
+#: org/postgresql/jdbc/PgPreparedStatement.java:1035
msgid ""
-"This SQLXML object has already been initialized, so you cannot manipulate it "
-"further."
+"Can''t use query methods that take a query string on a PreparedStatement."
msgstr ""
-#: org/postgresql/jdbc/PgStatement.java:325
-msgid "Can''t use executeWithFlags(int) on a Statement."
+#: org/postgresql/jdbc/PgPreparedStatement.java:249
+msgid "Unknown Types value."
+msgstr "Onbekende Types waarde."
+
+#: org/postgresql/jdbc/PgPreparedStatement.java:382
+#: org/postgresql/jdbc/PgPreparedStatement.java:439
+#: org/postgresql/jdbc/PgPreparedStatement.java:1191
+#: org/postgresql/jdbc/PgPreparedStatement.java:1490
+#, java-format
+msgid "Invalid stream length {0}."
msgstr ""
-#: org/postgresql/jdbc/PgStatement.java:484
-msgid "Maximum number of rows must be a value grater than or equal to 0."
+#: org/postgresql/jdbc/PgPreparedStatement.java:411
+#, java-format
+msgid "The JVM claims not to support the {0} encoding."
msgstr ""
-#: org/postgresql/jdbc/PgStatement.java:525
-msgid "Query timeout must be a value greater than or equals to 0."
+#: org/postgresql/jdbc/PgPreparedStatement.java:414
+#: org/postgresql/jdbc/PgResultSet.java:1122
+#: org/postgresql/jdbc/PgResultSet.java:1156
+msgid "Provided InputStream failed."
msgstr ""
-#: org/postgresql/jdbc/PgStatement.java:561
-msgid "The maximum field size must be a value greater than or equal to 0."
-msgstr ""
+#: org/postgresql/jdbc/PgPreparedStatement.java:460
+#: org/postgresql/jdbc/PgPreparedStatement.java:1096
+#, fuzzy, java-format
+msgid "Unknown type {0}."
+msgstr "Onbekend antwoord type {0}"
-#: org/postgresql/jdbc/PgStatement.java:871
-msgid "This statement has been closed."
+#: org/postgresql/jdbc/PgPreparedStatement.java:477
+msgid "No hstore extension installed."
msgstr ""
-#: org/postgresql/jdbc/PgStatement.java:1148
-msgid ""
-"Returning autogenerated keys is only supported for 8.2 and later servers."
+#: org/postgresql/jdbc/PgPreparedStatement.java:619
+#: org/postgresql/jdbc/PgPreparedStatement.java:642
+#: org/postgresql/jdbc/PgPreparedStatement.java:652
+#: org/postgresql/jdbc/PgPreparedStatement.java:664
+#, java-format
+msgid "Cannot cast an instance of {0} to type {1}"
msgstr ""
-#: org/postgresql/jdbc/PgStatement.java:1326
-#: org/postgresql/jdbc/PgStatement.java:1357
-msgid "Returning autogenerated keys by column index is not supported."
+#: org/postgresql/jdbc/PgPreparedStatement.java:682
+#, fuzzy, java-format
+msgid "Unsupported Types value: {0}"
+msgstr "Onbekende Types waarde."
+
+#: org/postgresql/jdbc/PgPreparedStatement.java:894
+#, java-format
+msgid "Cannot convert an instance of {0} to type {1}"
msgstr ""
-#: org/postgresql/jdbc/PSQLSavepoint.java:40
-#: org/postgresql/jdbc/PSQLSavepoint.java:54
-#: org/postgresql/jdbc/PSQLSavepoint.java:72
-msgid "Cannot reference a savepoint after it has been released."
+#: org/postgresql/jdbc/PgPreparedStatement.java:968
+#, java-format
+msgid ""
+"Can''t infer the SQL type to use for an instance of {0}. Use setObject() "
+"with an explicit Types value to specify the type to use."
msgstr ""
-#: org/postgresql/jdbc/PSQLSavepoint.java:45
-msgid "Cannot retrieve the id of a named savepoint."
+#: org/postgresql/jdbc/PgPreparedStatement.java:1133
+#: org/postgresql/jdbc/PgPreparedStatement.java:1233
+msgid "Unexpected error writing large object to database."
msgstr ""
-#: org/postgresql/jdbc/PSQLSavepoint.java:59
-msgid "Cannot retrieve the name of an unnamed savepoint."
+#: org/postgresql/jdbc/PgPreparedStatement.java:1178
+#: org/postgresql/jdbc/PgResultSet.java:1210
+msgid "Provided Reader failed."
msgstr ""
-#: org/postgresql/jdbc/TimestampUtils.java:298
+#: org/postgresql/jdbc/BooleanTypeUtil.java:99
#, java-format
-msgid "Bad value for type timestamp/date/time: {1}"
+msgid "Cannot cast to boolean: \"{0}\""
msgstr ""
-#: org/postgresql/jdbc/TimestampUtils.java:359
+#: org/postgresql/jdbc/PgResultSet.java:280
msgid ""
-"Infinite value found for timestamp/date. This cannot be represented as time."
+"Operation requires a scrollable ResultSet, but this ResultSet is "
+"FORWARD_ONLY."
msgstr ""
-#: org/postgresql/jdbc/TimestampUtils.java:674
-#: org/postgresql/jdbc/TimestampUtils.java:710
-#: org/postgresql/jdbc/TimestampUtils.java:757
+#: org/postgresql/jdbc/PgResultSet.java:492
+#: org/postgresql/jdbc/PgResultSet.java:532
+#: org/postgresql/jdbc/PgResultSet.java:556
+#: org/postgresql/jdbc/PgResultSet.java:594
+#: org/postgresql/jdbc/PgResultSet.java:624
+#: org/postgresql/jdbc/PgResultSet.java:3008
+#: org/postgresql/jdbc/PgResultSet.java:3052
#, java-format
-msgid "Unsupported binary encoding of {0}."
+msgid "Cannot convert the column of type {0} to requested type {1}."
msgstr ""
-#: org/postgresql/largeobject/LargeObjectManager.java:147
-#, fuzzy
-msgid "Failed to initialize LargeObject API"
-msgstr "Kon LargeObject API niet initialiseren"
-
-#: org/postgresql/largeobject/LargeObjectManager.java:265
-#: org/postgresql/largeobject/LargeObjectManager.java:308
-msgid "Large Objects may not be used in auto-commit mode."
+#: org/postgresql/jdbc/PgResultSet.java:838
+#: org/postgresql/jdbc/PgResultSet.java:859
+#: org/postgresql/jdbc/PgResultSet.java:1832
+msgid "Can''t use relative move methods while on the insert row."
msgstr ""
-#: org/postgresql/osgi/PGDataSourceFactory.java:85
-#, fuzzy, java-format
-msgid "Unsupported properties: {0}"
-msgstr "Onbekende Types waarde."
+#: org/postgresql/jdbc/PgResultSet.java:889
+msgid "Cannot call cancelRowUpdates() when on the insert row."
+msgstr ""
-#: org/postgresql/PGProperty.java:450 org/postgresql/PGProperty.java:470
-#, java-format
-msgid "{0} parameter value must be an integer but was: {1}"
+#: org/postgresql/jdbc/PgResultSet.java:905
+msgid "Cannot call deleteRow() when on the insert row."
msgstr ""
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:125
+#: org/postgresql/jdbc/PgResultSet.java:912
msgid ""
-"Could not find a java cryptographic algorithm: X.509 CertificateFactory not "
-"available."
+"Currently positioned before the start of the ResultSet. You cannot call "
+"deleteRow() here."
msgstr ""
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:135
-#, java-format
-msgid "Could not open SSL certificate file {0}."
+#: org/postgresql/jdbc/PgResultSet.java:918
+msgid ""
+"Currently positioned after the end of the ResultSet. You cannot call "
+"deleteRow() here."
msgstr ""
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:140
-#, java-format
-msgid "Loading the SSL certificate {0} into a KeyManager failed."
-msgstr ""
+#: org/postgresql/jdbc/PgResultSet.java:922
+#, fuzzy
+msgid "There are no rows in this ResultSet."
+msgstr "De kolom naam {0} is niet gevonden."
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:195
-msgid "Enter SSL password: "
+#: org/postgresql/jdbc/PgResultSet.java:963
+msgid "Not on the insert row."
msgstr ""
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:202
-msgid "Could not read password for SSL key file, console is not available."
+#: org/postgresql/jdbc/PgResultSet.java:965
+msgid "You must specify at least one column value to insert a row."
msgstr ""
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:207
+#: org/postgresql/jdbc/PgResultSet.java:1119
+#: org/postgresql/jdbc/PgResultSet.java:1754
+#: org/postgresql/jdbc/PgResultSet.java:2416
+#: org/postgresql/jdbc/PgResultSet.java:2437
#, java-format
-msgid "Could not read password for SSL key file by callbackhandler {0}."
+msgid "The JVM claims not to support the encoding: {0}"
msgstr ""
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:226
-#, java-format
-msgid "Could not decrypt SSL key file {0}."
+#: org/postgresql/jdbc/PgResultSet.java:1261
+msgid "Can''t refresh the insert row."
msgstr ""
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:240
-#, java-format
-msgid "Could not read SSL key file {0}."
+#: org/postgresql/jdbc/PgResultSet.java:1328
+msgid "Cannot call updateRow() when on the insert row."
msgstr ""
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:243
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:162
-#, java-format
-msgid "Could not find a java cryptographic algorithm: {0}."
+#: org/postgresql/jdbc/PgResultSet.java:1335
+#: org/postgresql/jdbc/PgResultSet.java:3069
+msgid ""
+"Cannot update the ResultSet because it is either before the start or after "
+"the end of the results."
msgstr ""
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:90
-#, java-format
-msgid "The password callback class provided {0} could not be instantiated."
+#: org/postgresql/jdbc/PgResultSet.java:1535
+msgid "ResultSets with concurrency CONCUR_READ_ONLY cannot be updated."
msgstr ""
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:123
+#: org/postgresql/jdbc/PgResultSet.java:1603
#, java-format
-msgid "Could not open SSL root certificate file {0}."
+msgid "No primary key found for table {0}."
msgstr ""
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:139
+#: org/postgresql/jdbc/PgResultSet.java:2011
+#: org/postgresql/jdbc/PgResultSet.java:2016
+#: org/postgresql/jdbc/PgResultSet.java:2803
+#: org/postgresql/jdbc/PgResultSet.java:2809
+#: org/postgresql/jdbc/PgResultSet.java:2834
+#: org/postgresql/jdbc/PgResultSet.java:2840
+#: org/postgresql/jdbc/PgResultSet.java:2864
+#: org/postgresql/jdbc/PgResultSet.java:2869
+#: org/postgresql/jdbc/PgResultSet.java:2885
+#: org/postgresql/jdbc/PgResultSet.java:2906
+#: org/postgresql/jdbc/PgResultSet.java:2917
+#: org/postgresql/jdbc/PgResultSet.java:2930
+#: org/postgresql/jdbc/PgResultSet.java:3057
#, java-format
-msgid "Could not read SSL root certificate file {0}."
+msgid "Bad value for type {0} : {1}"
msgstr ""
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:143
-#, java-format
-msgid "Loading the SSL root certificate {0} into a TrustManager failed."
-msgstr ""
+#: org/postgresql/jdbc/PgResultSet.java:2589
+#, fuzzy, java-format
+msgid "The column name {0} was not found in this ResultSet."
+msgstr "De kolom naam {0} is niet gevonden."
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:156
-msgid "Could not initialize SSL context."
+#: org/postgresql/jdbc/PgResultSet.java:2725
+msgid ""
+"ResultSet is not updateable. The query that generated this result set must "
+"select only one table, and must select all primary keys from that table. See "
+"the JDBC 2.1 API Specification, section 5.6 for more details."
msgstr ""
-#: org/postgresql/ssl/MakeSSL.java:52
-#, java-format
-msgid "The SSLSocketFactory class provided {0} could not be instantiated."
+#: org/postgresql/jdbc/PgResultSet.java:2737
+msgid "This ResultSet is closed."
msgstr ""
-#: org/postgresql/ssl/MakeSSL.java:67
-#, java-format
-msgid "SSL error: {0}"
+#: org/postgresql/jdbc/PgResultSet.java:2768
+msgid "ResultSet not positioned properly, perhaps you need to call next."
msgstr ""
-#: org/postgresql/ssl/MakeSSL.java:78
-#, java-format
-msgid "The HostnameVerifier class provided {0} could not be instantiated."
+#: org/postgresql/jdbc/PgResultSet.java:3089
+msgid "Invalid UUID data."
msgstr ""
-#: org/postgresql/ssl/MakeSSL.java:84
+#: org/postgresql/jdbc/PgResultSet.java:3178
+#: org/postgresql/jdbc/PgResultSet.java:3185
+#: org/postgresql/jdbc/PgResultSet.java:3196
+#: org/postgresql/jdbc/PgResultSet.java:3207
+#: org/postgresql/jdbc/PgResultSet.java:3218
+#: org/postgresql/jdbc/PgResultSet.java:3229
+#: org/postgresql/jdbc/PgResultSet.java:3240
+#: org/postgresql/jdbc/PgResultSet.java:3251
+#: org/postgresql/jdbc/PgResultSet.java:3262
+#: org/postgresql/jdbc/PgResultSet.java:3269
+#: org/postgresql/jdbc/PgResultSet.java:3276
+#: org/postgresql/jdbc/PgResultSet.java:3287
+#: org/postgresql/jdbc/PgResultSet.java:3304
+#: org/postgresql/jdbc/PgResultSet.java:3311
+#: org/postgresql/jdbc/PgResultSet.java:3318
+#: org/postgresql/jdbc/PgResultSet.java:3329
+#: org/postgresql/jdbc/PgResultSet.java:3336
+#: org/postgresql/jdbc/PgResultSet.java:3343
+#: org/postgresql/jdbc/PgResultSet.java:3381
+#: org/postgresql/jdbc/PgResultSet.java:3388
+#: org/postgresql/jdbc/PgResultSet.java:3395
+#: org/postgresql/jdbc/PgResultSet.java:3415
+#: org/postgresql/jdbc/PgResultSet.java:3428
+#, java-format
+msgid "conversion to {0} from {1} not supported"
+msgstr ""
+
+#: org/postgresql/jdbc/TimestampUtils.java:355
+#: org/postgresql/jdbc/TimestampUtils.java:423
#, java-format
-msgid "The hostname {0} could not be verified by hostnameverifier {1}."
+msgid "Bad value for type timestamp/date/time: {1}"
msgstr ""
-#: org/postgresql/ssl/MakeSSL.java:93
+#: org/postgresql/jdbc/TimestampUtils.java:858
+#: org/postgresql/jdbc/TimestampUtils.java:915
+#: org/postgresql/jdbc/TimestampUtils.java:961
+#: org/postgresql/jdbc/TimestampUtils.java:1010
#, java-format
-msgid "The hostname {0} could not be verified."
+msgid "Unsupported binary encoding of {0}."
msgstr ""
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:167
-msgid "The sslfactoryarg property may not be empty."
-msgstr ""
+#: org/postgresql/jdbc/PgCallableStatement.java:86
+#: org/postgresql/jdbc/PgCallableStatement.java:96
+#, fuzzy
+msgid "A CallableStatement was executed with nothing returned."
+msgstr "Callable Statements worden op dit moment niet ondersteund."
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:183
-msgid ""
-"The environment variable containing the server's SSL certificate must not be "
-"empty."
-msgstr ""
+#: org/postgresql/jdbc/PgCallableStatement.java:107
+#, fuzzy
+msgid "A CallableStatement was executed with an invalid number of parameters"
+msgstr "Callable Statements worden op dit moment niet ondersteund."
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:191
+#: org/postgresql/jdbc/PgCallableStatement.java:145
+#, java-format
msgid ""
-"The system property containing the server's SSL certificate must not be "
-"empty."
+"A CallableStatement function was executed and the out parameter {0} was of "
+"type {1} however type {2} was registered."
msgstr ""
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:198
+#: org/postgresql/jdbc/PgCallableStatement.java:202
msgid ""
-"The sslfactoryarg property must start with the prefix file:, classpath:, "
-"env:, sys:, or -----BEGIN CERTIFICATE-----."
+"This statement does not declare an OUT parameter. Use '{' ?= call ... '}' "
+"to declare one."
msgstr ""
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:210
-#, fuzzy
-msgid "An error occurred reading the certificate"
-msgstr "Een fout trad op tijdens het ophalen van het authenticatie verzoek."
-
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:243
-msgid "No X509TrustManager found"
+#: org/postgresql/jdbc/PgCallableStatement.java:246
+msgid "wasNull cannot be call before fetching a result."
msgstr ""
-#: org/postgresql/util/PGInterval.java:155
-#, fuzzy
-msgid "Conversion of interval failed"
-msgstr "Conversie van money faalde - {0}."
-
-#: org/postgresql/util/PGmoney.java:65
-#, fuzzy
-msgid "Conversion of money failed."
-msgstr "Conversie van money faalde - {0}."
-
-#: org/postgresql/util/ServerErrorMessage.java:165
+#: org/postgresql/jdbc/PgCallableStatement.java:384
+#: org/postgresql/jdbc/PgCallableStatement.java:403
#, java-format
-msgid "Detail: {0}"
+msgid ""
+"Parameter of type {0} was registered, but call to get{1} (sqltype={2}) was "
+"made."
msgstr ""
-#: org/postgresql/util/ServerErrorMessage.java:170
-#, java-format
-msgid "Hint: {0}"
+#: org/postgresql/jdbc/PgCallableStatement.java:424
+msgid ""
+"A CallableStatement was declared, but no call to registerOutParameter(1, "
+"<some type>) was made."
msgstr ""
-#: org/postgresql/util/ServerErrorMessage.java:174
-#, java-format
-msgid "Position: {0}"
+#: org/postgresql/jdbc/PgCallableStatement.java:430
+msgid "No function outputs were registered."
msgstr ""
-#: org/postgresql/util/ServerErrorMessage.java:178
-#, java-format
-msgid "Where: {0}"
+#: org/postgresql/jdbc/PgCallableStatement.java:436
+msgid ""
+"Results cannot be retrieved from a CallableStatement before it is executed."
msgstr ""
-#: org/postgresql/util/ServerErrorMessage.java:184
+#: org/postgresql/jdbc/PgCallableStatement.java:703
+#, fuzzy, java-format
+msgid "Unsupported type conversion to {1}."
+msgstr "Onbekende Types waarde."
+
+#: org/postgresql/jdbc/EscapedFunctions.java:240
#, java-format
-msgid "Internal Query: {0}"
+msgid "{0} function takes four and only four argument."
msgstr ""
-#: org/postgresql/util/ServerErrorMessage.java:188
+#: org/postgresql/jdbc/EscapedFunctions.java:270
+#: org/postgresql/jdbc/EscapedFunctions.java:344
+#: org/postgresql/jdbc/EscapedFunctions.java:749
+#: org/postgresql/jdbc/EscapedFunctions.java:787
#, java-format
-msgid "Internal Position: {0}"
+msgid "{0} function takes two and only two arguments."
msgstr ""
-#: org/postgresql/util/ServerErrorMessage.java:195
+#: org/postgresql/jdbc/EscapedFunctions.java:288
+#: org/postgresql/jdbc/EscapedFunctions.java:326
+#: org/postgresql/jdbc/EscapedFunctions.java:446
+#: org/postgresql/jdbc/EscapedFunctions.java:461
+#: org/postgresql/jdbc/EscapedFunctions.java:476
+#: org/postgresql/jdbc/EscapedFunctions.java:491
+#: org/postgresql/jdbc/EscapedFunctions.java:506
+#: org/postgresql/jdbc/EscapedFunctions.java:521
+#: org/postgresql/jdbc/EscapedFunctions.java:536
+#: org/postgresql/jdbc/EscapedFunctions.java:551
+#: org/postgresql/jdbc/EscapedFunctions.java:566
+#: org/postgresql/jdbc/EscapedFunctions.java:581
+#: org/postgresql/jdbc/EscapedFunctions.java:596
+#: org/postgresql/jdbc/EscapedFunctions.java:611
+#: org/postgresql/jdbc/EscapedFunctions.java:775
#, java-format
-msgid "Location: File: {0}, Routine: {1}, Line: {2}"
+msgid "{0} function takes one and only one argument."
msgstr ""
-#: org/postgresql/util/ServerErrorMessage.java:200
+#: org/postgresql/jdbc/EscapedFunctions.java:310
+#: org/postgresql/jdbc/EscapedFunctions.java:391
#, java-format
-msgid "Server SQLState: {0}"
+msgid "{0} function takes two or three arguments."
msgstr ""
-#: org/postgresql/xa/PGXAConnection.java:148
-msgid ""
-"Transaction control methods setAutoCommit(true), commit, rollback and "
-"setSavePoint not allowed while an XA transaction is active."
+#: org/postgresql/jdbc/EscapedFunctions.java:416
+#: org/postgresql/jdbc/EscapedFunctions.java:431
+#: org/postgresql/jdbc/EscapedFunctions.java:734
+#: org/postgresql/jdbc/EscapedFunctions.java:764
+#, java-format
+msgid "{0} function doesn''t take any argument."
msgstr ""
-#: org/postgresql/xa/PGXAConnection.java:196
-#: org/postgresql/xa/PGXAConnection.java:265
-msgid "Invalid flags"
+#: org/postgresql/jdbc/EscapedFunctions.java:627
+#: org/postgresql/jdbc/EscapedFunctions.java:680
+#, java-format
+msgid "{0} function takes three and only three arguments."
msgstr ""
-#: org/postgresql/xa/PGXAConnection.java:200
-#: org/postgresql/xa/PGXAConnection.java:269
-#: org/postgresql/xa/PGXAConnection.java:437
-msgid "xid must not be null"
-msgstr ""
+#: org/postgresql/jdbc/EscapedFunctions.java:640
+#: org/postgresql/jdbc/EscapedFunctions.java:661
+#: org/postgresql/jdbc/EscapedFunctions.java:664
+#: org/postgresql/jdbc/EscapedFunctions.java:697
+#: org/postgresql/jdbc/EscapedFunctions.java:710
+#: org/postgresql/jdbc/EscapedFunctions.java:713
+#, fuzzy, java-format
+msgid "Interval {0} not yet implemented"
+msgstr "Deze methode is nog niet geimplementeerd"
-#: org/postgresql/xa/PGXAConnection.java:204
-msgid "Connection is busy with another transaction"
+#: org/postgresql/PGProperty.java:535 org/postgresql/PGProperty.java:555
+#, java-format
+msgid "{0} parameter value must be an integer but was: {1}"
msgstr ""
-#: org/postgresql/xa/PGXAConnection.java:213
-#: org/postgresql/xa/PGXAConnection.java:279
+#: org/postgresql/largeobject/LargeObjectManager.java:144
#, fuzzy
-msgid "suspend/resume not implemented"
-msgstr "Deze methode is nog niet geimplementeerd"
+msgid "Failed to initialize LargeObject API"
+msgstr "Kon LargeObject API niet initialiseren"
-#: org/postgresql/xa/PGXAConnection.java:219
-#: org/postgresql/xa/PGXAConnection.java:224
-#: org/postgresql/xa/PGXAConnection.java:228
-msgid "Transaction interleaving not implemented"
+#: org/postgresql/largeobject/LargeObjectManager.java:262
+#: org/postgresql/largeobject/LargeObjectManager.java:305
+msgid "Large Objects may not be used in auto-commit mode."
msgstr ""
-#: org/postgresql/xa/PGXAConnection.java:239
-msgid "Error disabling autocommit"
-msgstr ""
+#: org/postgresql/copy/PGCopyInputStream.java:51
+#, fuzzy, java-format
+msgid "Copying from database failed: {0}"
+msgstr "Conversie van lseg faalde - {0}"
-#: org/postgresql/xa/PGXAConnection.java:273
-msgid "tried to call end without corresponding start call"
+#: org/postgresql/copy/PGCopyInputStream.java:67
+#: org/postgresql/copy/PGCopyOutputStream.java:94
+msgid "This copy stream is closed."
msgstr ""
-#: org/postgresql/xa/PGXAConnection.java:305
-msgid ""
-"Not implemented: Prepare must be issued using the same connection that "
-"started the transaction"
+#: org/postgresql/copy/PGCopyInputStream.java:110
+msgid "Read from copy failed."
msgstr ""
-#: org/postgresql/xa/PGXAConnection.java:309
-msgid "Prepare called before end"
+#: org/postgresql/copy/CopyManager.java:53
+#, java-format
+msgid "Requested CopyIn but got {0}"
msgstr ""
-#: org/postgresql/xa/PGXAConnection.java:317
-msgid "Server versions prior to 8.1 do not support two-phase commit."
+#: org/postgresql/copy/CopyManager.java:64
+#, java-format
+msgid "Requested CopyOut but got {0}"
msgstr ""
-#: org/postgresql/xa/PGXAConnection.java:334
-msgid "Error preparing transaction"
+#: org/postgresql/copy/CopyManager.java:75
+#, java-format
+msgid "Requested CopyDual but got {0}"
msgstr ""
-#: org/postgresql/xa/PGXAConnection.java:349
-msgid "Invalid flag"
+#: org/postgresql/copy/PGCopyOutputStream.java:71
+#, java-format
+msgid "Cannot write to copy a byte of value {0}"
msgstr ""
-#: org/postgresql/xa/PGXAConnection.java:384
-msgid "Error during recover"
+#: org/postgresql/fastpath/Fastpath.java:80
+#, fuzzy, java-format
+msgid "Fastpath call {0} - No result was returned and we expected a numeric."
msgstr ""
+"Fastpath aanroep {0} - Geen resultaat werd teruggegeven, terwijl we een "
+"integer verwacht hadden."
-#: org/postgresql/xa/PGXAConnection.java:423
-#: org/postgresql/xa/PGXAConnection.java:426
-msgid "Error rolling back prepared transaction"
+#: org/postgresql/fastpath/Fastpath.java:157
+#, java-format
+msgid "Fastpath call {0} - No result was returned and we expected an integer."
msgstr ""
+"Fastpath aanroep {0} - Geen resultaat werd teruggegeven, terwijl we een "
+"integer verwacht hadden."
-#: org/postgresql/xa/PGXAConnection.java:464
+#: org/postgresql/fastpath/Fastpath.java:165
+#, fuzzy, java-format
msgid ""
-"Not implemented: one-phase commit must be issued using the same connection "
-"that was used to start it"
-msgstr ""
-
-#: org/postgresql/xa/PGXAConnection.java:468
-msgid "commit called before end"
+"Fastpath call {0} - No result was returned or wrong size while expecting an "
+"integer."
msgstr ""
+"Fastpath aanroep {0} - Geen resultaat werd teruggegeven, terwijl we een "
+"integer verwacht hadden."
-#: org/postgresql/xa/PGXAConnection.java:478
-msgid "Error during one-phase commit"
+#: org/postgresql/fastpath/Fastpath.java:182
+#, fuzzy, java-format
+msgid "Fastpath call {0} - No result was returned and we expected a long."
msgstr ""
+"Fastpath aanroep {0} - Geen resultaat werd teruggegeven, terwijl we een "
+"integer verwacht hadden."
-#: org/postgresql/xa/PGXAConnection.java:497
+#: org/postgresql/fastpath/Fastpath.java:190
+#, fuzzy, java-format
msgid ""
-"Not implemented: 2nd phase commit must be issued using an idle connection"
+"Fastpath call {0} - No result was returned or wrong size while expecting a "
+"long."
msgstr ""
+"Fastpath aanroep {0} - Geen resultaat werd teruggegeven, terwijl we een "
+"integer verwacht hadden."
-#: org/postgresql/xa/PGXAConnection.java:513
-msgid "Error committing prepared transaction"
-msgstr ""
+#: org/postgresql/fastpath/Fastpath.java:302
+#, java-format
+msgid "The fastpath function {0} is unknown."
+msgstr "De fastpath functie {0} is onbekend."
-#: org/postgresql/xa/PGXAConnection.java:529
-msgid "Heuristic commit/rollback not supported"
-msgstr ""
+#~ msgid ""
+#~ "Connection refused. Check that the hostname and port are correct and that "
+#~ "the postmaster is accepting TCP/IP connections."
+#~ msgstr ""
+#~ "Verbinding geweigerd. Controleer dat de hostnaam en poort correct zijn, "
+#~ "en dat de postmaster is opgestart met de -i vlag, welke TCP/IP networking "
+#~ "aanzet."
+
+#, fuzzy
+#~ msgid "The connection url is invalid."
+#~ msgstr "De poging om verbinding the maken faalde omdat {0}"
#, fuzzy
#~ msgid "Conversion of box failed: {0}."
diff --git a/pgjdbc/src/main/java/org/postgresql/translation/pl.po b/pgjdbc/src/main/java/org/postgresql/translation/pl.po
index a760b68..5bc61e3 100644
--- a/pgjdbc/src/main/java/org/postgresql/translation/pl.po
+++ b/pgjdbc/src/main/java/org/postgresql/translation/pl.po
@@ -10,7 +10,7 @@ msgid ""
msgstr ""
"Project-Id-Version: head-pl\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-01-07 13:37+0300\n"
+"POT-Creation-Date: 2018-03-10 23:24+0300\n"
"PO-Revision-Date: 2005-05-22 03:01+0200\n"
"Last-Translator: Jarosław Jan Pyszny <jarek at pyszny.net>\n"
"Language-Team: <pl at li.org>\n"
@@ -22,465 +22,588 @@ msgstr ""
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n"
"%100<10 || n%100>=20) ? 1 : 2);\n"
-#: org/postgresql/copy/CopyManager.java:57
-#, java-format
-msgid "Requested CopyIn but got {0}"
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:164
+msgid "The sslfactoryarg property may not be empty."
msgstr ""
-#: org/postgresql/copy/CopyManager.java:69
-#, java-format
-msgid "Requested CopyOut but got {0}"
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:180
+msgid ""
+"The environment variable containing the server's SSL certificate must not be "
+"empty."
msgstr ""
-#: org/postgresql/copy/PGCopyInputStream.java:54
-#, java-format
-msgid "Copying from database failed: {0}"
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:188
+msgid ""
+"The system property containing the server's SSL certificate must not be "
+"empty."
+msgstr ""
+
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:195
+msgid ""
+"The sslfactoryarg property must start with the prefix file:, classpath:, "
+"env:, sys:, or -----BEGIN CERTIFICATE-----."
msgstr ""
-#: org/postgresql/copy/PGCopyInputStream.java:70
-#: org/postgresql/copy/PGCopyOutputStream.java:97
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:207
#, fuzzy
-msgid "This copy stream is closed."
-msgstr "Ten ResultSet jest zamknięty."
+msgid "An error occurred reading the certificate"
+msgstr "Wystąpił błąd podczas ustanawiania połączenia SSL."
-#: org/postgresql/copy/PGCopyInputStream.java:113
-msgid "Read from copy failed."
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:240
+msgid "No X509TrustManager found"
msgstr ""
-#: org/postgresql/copy/PGCopyOutputStream.java:74
-#, java-format
-msgid "Cannot write to copy a byte of value {0}"
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:133
+msgid ""
+"Could not find a java cryptographic algorithm: X.509 CertificateFactory not "
+"available."
msgstr ""
-#: org/postgresql/core/ConnectionFactory.java:74
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:143
#, java-format
-msgid "A connection could not be made using the requested protocol {0}."
-msgstr "Nie można było nawiązać połączenia stosując żądany protokołu {0}."
+msgid "Could not open SSL certificate file {0}."
+msgstr ""
-#: org/postgresql/core/Oid.java:114
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:148
#, java-format
-msgid "oid type {0} not known and not a number"
+msgid "Loading the SSL certificate {0} into a KeyManager failed."
msgstr ""
-#: org/postgresql/core/Parser.java:616
-#, java-format
-msgid "Malformed function or procedure escape syntax at offset {0}."
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:205
+msgid "Enter SSL password: "
msgstr ""
-#: org/postgresql/core/PGStream.java:497
-#, java-format
-msgid "Premature end of input stream, expected {0} bytes, but only read {1}."
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:212
+msgid "Could not read password for SSL key file, console is not available."
msgstr ""
-"Przedwczesny koniec strumienia wejściowego, oczekiwano {0} bajtów, odczytano "
-"tylko {1}."
-#: org/postgresql/core/PGStream.java:538
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:217
#, java-format
-msgid "Expected an EOF from server, got: {0}"
+msgid "Could not read password for SSL key file by callbackhandler {0}."
msgstr ""
-#: org/postgresql/core/SetupQueryRunner.java:90
-msgid "An unexpected result was returned by a query."
-msgstr "Zapytanie zwróciło nieoczekiwany wynik."
-
-#: org/postgresql/core/UTF8Encoding.java:31
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:236
#, java-format
-msgid ""
-"Illegal UTF-8 sequence: byte {0} of {1} byte sequence is not 10xxxxxx: {2}"
+msgid "Could not decrypt SSL key file {0}."
msgstr ""
-#: org/postgresql/core/UTF8Encoding.java:69
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:250
#, java-format
-msgid "Illegal UTF-8 sequence: {0} bytes used to encode a {1} byte value: {2}"
+msgid "Could not read SSL key file {0}."
msgstr ""
-#: org/postgresql/core/UTF8Encoding.java:104
-#: org/postgresql/core/UTF8Encoding.java:131
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:253
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:176
#, java-format
-msgid "Illegal UTF-8 sequence: initial byte is {0}: {1}"
+msgid "Could not find a java cryptographic algorithm: {0}."
msgstr ""
-#: org/postgresql/core/UTF8Encoding.java:137
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:99
#, java-format
-msgid "Illegal UTF-8 sequence: final value is out of range: {0}"
+msgid "The password callback class provided {0} could not be instantiated."
msgstr ""
-#: org/postgresql/core/UTF8Encoding.java:153
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:132
#, java-format
-msgid "Illegal UTF-8 sequence: final value is a surrogate value: {0}"
+msgid "Could not open SSL root certificate file {0}."
msgstr ""
-#: org/postgresql/core/Utils.java:119 org/postgresql/core/Utils.java:136
-msgid "Zero bytes may not occur in string parameters."
-msgstr "Zerowe bajty nie mogą pojawiać się w parametrach typu łańcuch znakowy."
-
-#: org/postgresql/core/Utils.java:146 org/postgresql/core/Utils.java:217
-msgid "No IOException expected from StringBuffer or StringBuilder"
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:147
+#, java-format
+msgid "Could not read SSL root certificate file {0}."
msgstr ""
-#: org/postgresql/core/Utils.java:206
-#, fuzzy
-msgid "Zero bytes may not occur in identifiers."
-msgstr "Zerowe bajty nie mogą pojawiać się w parametrach typu łańcuch znakowy."
-
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:72
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:87
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:151
#, java-format
-msgid "Invalid sslmode value: {0}"
+msgid "Loading the SSL root certificate {0} into a TrustManager failed."
msgstr ""
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:87
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:111
-#, fuzzy, java-format
-msgid "Invalid targetServerType value: {0}"
-msgstr "Nieznana wartość Types: {0}"
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:170
+msgid "Could not initialize SSL context."
+msgstr ""
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:152
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:228
+#: org/postgresql/ssl/MakeSSL.java:52
#, java-format
-msgid "Could not find a server with specified targetServerType: {0}"
+msgid "The SSLSocketFactory class provided {0} could not be instantiated."
msgstr ""
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:172
-msgid ""
-"Connection refused. Check that the hostname and port are correct and that "
-"the postmaster is accepting TCP/IP connections."
+#: org/postgresql/ssl/MakeSSL.java:67
+#, java-format
+msgid "SSL error: {0}"
msgstr ""
-"Połączenie odrzucone. Sprawdź, czy prawidłowo ustawiłeś nazwę hosta oraz "
-"port i upewnij się, czy postmaster przyjmuje połączenia TCP/IP."
-
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:181
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:262
-msgid "The connection attempt failed."
-msgstr "Próba nawiązania połączenia nie powiodła się."
-
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:192
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:273
-#, fuzzy
-msgid "The connection url is invalid."
-msgstr "Próba nawiązania połączenia nie powiodła się."
-
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:218
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:233
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:324
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:339
-msgid "The server does not support SSL."
-msgstr "Serwer nie obsługuje SSL."
-
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:249
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:355
-msgid "An error occurred while setting up the SSL connection."
-msgstr "Wystąpił błąd podczas ustanawiania połączenia SSL."
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:300
+#: org/postgresql/ssl/MakeSSL.java:78
#, java-format
-msgid "Connection rejected: {0}."
-msgstr "Połączenie odrzucone: {0}."
+msgid "The HostnameVerifier class provided {0} could not be instantiated."
+msgstr ""
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:321
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:349
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:375
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:456
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:486
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:515
-msgid ""
-"The server requested password-based authentication, but no password was "
-"provided."
+#: org/postgresql/ssl/MakeSSL.java:84
+#, java-format
+msgid "The hostname {0} could not be verified by hostnameverifier {1}."
msgstr ""
-"Serwer zażądał uwierzytelnienia opartego na haśle, ale żadne hasło nie "
-"zostało dostarczone."
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:405
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:625
+#: org/postgresql/ssl/MakeSSL.java:93
#, java-format
-msgid ""
-"The authentication type {0} is not supported. Check that you have configured "
-"the pg_hba.conf file to include the client''s IP address or subnet, and that "
-"it is using an authentication scheme supported by the driver."
+msgid "The hostname {0} could not be verified."
msgstr ""
-"Uwierzytelnienie typu {0} nie jest obsługiwane. Upewnij się, że "
-"skonfigurowałeś plik pg_hba.conf tak, że zawiera on adres IP lub podsieć "
-"klienta oraz że użyta metoda uwierzytelnienia jest wspierana przez ten "
-"sterownik."
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:412
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:455
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:632
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:688
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:744
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:754
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:763
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:774
-#: org/postgresql/gss/GssAction.java:130
+#: org/postgresql/gss/GssAction.java:126
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2550
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2581
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2585
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2640
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2650
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2659
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:655
msgid "Protocol error. Session setup failed."
msgstr "Błąd protokołu. Nie udało się utworzyć sesji."
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:443
-#, java-format
-msgid "Backend start-up failed: {0}."
-msgstr "Start serwera się nie powiódł: {0}."
-
-#: org/postgresql/core/v2/FastpathParameterList.java:63
-#: org/postgresql/core/v2/FastpathParameterList.java:89
-#: org/postgresql/core/v2/FastpathParameterList.java:100
-#: org/postgresql/core/v2/FastpathParameterList.java:111
-#: org/postgresql/core/v2/SimpleParameterList.java:70
-#: org/postgresql/core/v2/SimpleParameterList.java:94
-#: org/postgresql/core/v2/SimpleParameterList.java:105
-#: org/postgresql/core/v2/SimpleParameterList.java:116
-#: org/postgresql/core/v2/SimpleParameterList.java:127
-#: org/postgresql/core/v3/CompositeParameterList.java:36
-#: org/postgresql/core/v3/SimpleParameterList.java:53
-#: org/postgresql/core/v3/SimpleParameterList.java:64
-#: org/postgresql/jdbc/PgResultSet.java:2715
-#: org/postgresql/jdbc/PgResultSetMetaData.java:472
-#, java-format
-msgid "The column index is out of range: {0}, number of columns: {1}."
-msgstr "Indeks kolumny jest poza zakresem: {0}, liczba kolumn: {1}."
+#: org/postgresql/gss/GssAction.java:137 org/postgresql/gss/MakeGSS.java:66
+#: org/postgresql/gss/MakeGSS.java:74
+msgid "GSS Authentication failed"
+msgstr ""
-#: org/postgresql/core/v2/FastpathParameterList.java:164
-#: org/postgresql/core/v2/SimpleParameterList.java:191
-#: org/postgresql/core/v3/SimpleParameterList.java:225
+#: org/postgresql/core/Parser.java:933
#, java-format
-msgid "No value specified for parameter {0}."
-msgstr "Nie podano wartości dla parametru {0}."
+msgid "Malformed function or procedure escape syntax at offset {0}."
+msgstr ""
-#: org/postgresql/core/v2/QueryExecutorImpl.java:87
-#: org/postgresql/core/v2/QueryExecutorImpl.java:347
-#: org/postgresql/core/v3/QueryExecutorImpl.java:404
-#: org/postgresql/core/v3/QueryExecutorImpl.java:465
+#: org/postgresql/core/SocketFactoryFactory.java:41
#, java-format
-msgid "Expected command status BEGIN, got {0}."
-msgstr "Spodziewano się statusu komendy BEGIN, otrzymano {0}."
+msgid "The SocketFactory class provided {0} could not be instantiated."
+msgstr ""
-#: org/postgresql/core/v2/QueryExecutorImpl.java:92
-#: org/postgresql/core/v3/QueryExecutorImpl.java:470
-#: org/postgresql/jdbc/PgResultSet.java:1731
-#, java-format
-msgid "Unexpected command status: {0}."
-msgstr "Nieoczekiwany status komendy: {0}."
+#: org/postgresql/core/Utils.java:93 org/postgresql/core/Utils.java:110
+msgid "Zero bytes may not occur in string parameters."
+msgstr "Zerowe bajty nie mogą pojawiać się w parametrach typu łańcuch znakowy."
-#: org/postgresql/core/v2/QueryExecutorImpl.java:127
-#: org/postgresql/core/v2/QueryExecutorImpl.java:136
-#: org/postgresql/core/v2/QueryExecutorImpl.java:185
-#: org/postgresql/core/v2/QueryExecutorImpl.java:376
-#: org/postgresql/core/v3/QueryExecutorImpl.java:226
-#: org/postgresql/core/v3/QueryExecutorImpl.java:364
-#: org/postgresql/core/v3/QueryExecutorImpl.java:441
-#: org/postgresql/core/v3/QueryExecutorImpl.java:505
-#: org/postgresql/core/v3/QueryExecutorImpl.java:587
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2211
-#: org/postgresql/util/StreamWrapper.java:133
+#: org/postgresql/core/Utils.java:120 org/postgresql/core/Utils.java:170
+msgid "No IOException expected from StringBuffer or StringBuilder"
+msgstr ""
+
+#: org/postgresql/core/Utils.java:159
#, fuzzy
-msgid "An I/O error occurred while sending to the backend."
-msgstr "Wystąpił błąd We/Wy podczas wysyłania do serwera."
+msgid "Zero bytes may not occur in identifiers."
+msgstr "Zerowe bajty nie mogą pojawiać się w parametrach typu łańcuch znakowy."
-#: org/postgresql/core/v2/QueryExecutorImpl.java:180
-#: org/postgresql/core/v2/QueryExecutorImpl.java:235
-#: org/postgresql/core/v2/QueryExecutorImpl.java:249
-#: org/postgresql/core/v3/QueryExecutorImpl.java:582
-#: org/postgresql/core/v3/QueryExecutorImpl.java:642
+#: org/postgresql/core/UTF8Encoding.java:28
#, java-format
-msgid "Unknown Response Type {0}."
-msgstr "Nieznany typ odpowiedzi {0}."
+msgid ""
+"Illegal UTF-8 sequence: byte {0} of {1} byte sequence is not 10xxxxxx: {2}"
+msgstr ""
-#: org/postgresql/core/v2/QueryExecutorImpl.java:453
-#: org/postgresql/core/v2/QueryExecutorImpl.java:503
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1962
-msgid "Ran out of memory retrieving query results."
+#: org/postgresql/core/UTF8Encoding.java:66
+#, java-format
+msgid "Illegal UTF-8 sequence: {0} bytes used to encode a {1} byte value: {2}"
msgstr ""
-#: org/postgresql/core/v2/QueryExecutorImpl.java:640
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2328
+#: org/postgresql/core/UTF8Encoding.java:102
+#: org/postgresql/core/UTF8Encoding.java:129
#, java-format
-msgid "Unable to interpret the update count in command completion tag: {0}."
+msgid "Illegal UTF-8 sequence: initial byte is {0}: {1}"
msgstr ""
-#: org/postgresql/core/v2/QueryExecutorImpl.java:654
-msgid "Copy not implemented for protocol version 2"
+#: org/postgresql/core/UTF8Encoding.java:135
+#, java-format
+msgid "Illegal UTF-8 sequence: final value is out of range: {0}"
msgstr ""
-#: org/postgresql/core/v2/SocketFactoryFactory.java:36
+#: org/postgresql/core/UTF8Encoding.java:151
#, java-format
-msgid "The SocketFactory class provided {0} could not be instantiated."
+msgid "Illegal UTF-8 sequence: final value is a surrogate value: {0}"
msgstr ""
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:253
-#, fuzzy, java-format
-msgid ""
-"Connection to {0} refused. Check that the hostname and port are correct and "
-"that the postmaster is accepting TCP/IP connections."
+#: org/postgresql/core/SetupQueryRunner.java:64
+msgid "An unexpected result was returned by a query."
+msgstr "Zapytanie zwróciło nieoczekiwany wynik."
+
+#: org/postgresql/core/PGStream.java:486
+#, java-format
+msgid "Premature end of input stream, expected {0} bytes, but only read {1}."
+msgstr ""
+"Przedwczesny koniec strumienia wejściowego, oczekiwano {0} bajtów, odczytano "
+"tylko {1}."
+
+#: org/postgresql/core/PGStream.java:528
+#, java-format
+msgid "Expected an EOF from server, got: {0}"
msgstr ""
-"Połączenie odrzucone. Sprawdź, czy prawidłowo ustawiłeś nazwę hosta oraz "
-"port i upewnij się, czy postmaster przyjmuje połączenia TCP/IP."
-#: org/postgresql/core/v3/CopyOperationImpl.java:57
+#: org/postgresql/core/v3/CopyOperationImpl.java:54
msgid "CommandComplete expected COPY but got: "
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:83
+#: org/postgresql/core/v3/CopyInImpl.java:47
+msgid "CopyIn copy direction can't receive data"
+msgstr ""
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:161
msgid "Tried to obtain lock while already holding it"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:98
+#: org/postgresql/core/v3/QueryExecutorImpl.java:177
msgid "Tried to break lock on database connection"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:115
+#: org/postgresql/core/v3/QueryExecutorImpl.java:195
msgid "Interrupted while waiting to obtain lock on database connection"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:220
+#: org/postgresql/core/v3/QueryExecutorImpl.java:327
msgid "Unable to bind parameter values for statement."
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:689
+#: org/postgresql/core/v3/QueryExecutorImpl.java:333
+#: org/postgresql/core/v3/QueryExecutorImpl.java:485
+#: org/postgresql/core/v3/QueryExecutorImpl.java:559
+#: org/postgresql/core/v3/QueryExecutorImpl.java:602
+#: org/postgresql/core/v3/QueryExecutorImpl.java:729
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2372
+#: org/postgresql/util/StreamWrapper.java:130
+#, fuzzy
+msgid "An I/O error occurred while sending to the backend."
+msgstr "Wystąpił błąd We/Wy podczas wysyłania do serwera."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:534
+#: org/postgresql/core/v3/QueryExecutorImpl.java:576
+#, java-format
+msgid "Expected command status BEGIN, got {0}."
+msgstr "Spodziewano się statusu komendy BEGIN, otrzymano {0}."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:581
+#: org/postgresql/jdbc/PgResultSet.java:1778
+#, java-format
+msgid "Unexpected command status: {0}."
+msgstr "Nieoczekiwany status komendy: {0}."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:687
+#, fuzzy
+msgid "An error occurred while trying to get the socket timeout."
+msgstr "Wystąpił błąd We/Wy podczas wysyłania do serwera."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:722
+#: org/postgresql/core/v3/QueryExecutorImpl.java:798
+#, java-format
+msgid "Unknown Response Type {0}."
+msgstr "Nieznany typ odpowiedzi {0}."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:745
+#, fuzzy
+msgid "An error occurred while trying to reset the socket timeout."
+msgstr "Wystąpił błąd We/Wy podczas wysyłania do serwera."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:843
msgid "Database connection failed when starting copy"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:724
+#: org/postgresql/core/v3/QueryExecutorImpl.java:878
msgid "Tried to cancel an inactive copy operation"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:765
+#: org/postgresql/core/v3/QueryExecutorImpl.java:917
msgid "Database connection failed when canceling copy operation"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:781
+#: org/postgresql/core/v3/QueryExecutorImpl.java:933
msgid "Missing expected error response to copy cancel request"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:785
+#: org/postgresql/core/v3/QueryExecutorImpl.java:937
#, java-format
msgid "Got {0} error responses to single copy cancel request"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:800
+#: org/postgresql/core/v3/QueryExecutorImpl.java:952
msgid "Tried to end inactive copy"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:815
+#: org/postgresql/core/v3/QueryExecutorImpl.java:967
msgid "Database connection failed when ending copy"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:833
-#: org/postgresql/core/v3/QueryExecutorImpl.java:855
+#: org/postgresql/core/v3/QueryExecutorImpl.java:985
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1005
msgid "Tried to write to an inactive copy operation"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:848
-#: org/postgresql/core/v3/QueryExecutorImpl.java:863
+#: org/postgresql/core/v3/QueryExecutorImpl.java:998
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1013
msgid "Database connection failed when writing to copy"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:877
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1028
msgid "Tried to read from inactive copy"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:884
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1035
msgid "Database connection failed when reading from copy"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:956
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1101
#, java-format
msgid "Received CommandComplete ''{0}'' without an active copy operation"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:983
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1126
#, java-format
msgid "Got CopyInResponse from server during an active {0}"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:999
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1140
#, java-format
msgid "Got CopyOutResponse from server during an active {0}"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1017
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1154
+#, java-format
+msgid "Got CopyBothResponse from server during an active {0}"
+msgstr ""
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1170
msgid "Got CopyData without an active copy operation"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1021
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1174
#, fuzzy, java-format
msgid "Unexpected copydata from server for {0}"
msgstr "Nieoczekiwany status komendy: {0}."
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1061
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2037
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1234
+#, java-format
+msgid "Unexpected packet type during copy: {0}"
+msgstr ""
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1524
+#, java-format
+msgid ""
+"Bind message length {0} too long. This can be caused by very large or "
+"incorrect length specifications on InputStream parameters."
+msgstr ""
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2145
+msgid "Ran out of memory retrieving query results."
+msgstr ""
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2313
+msgid "The driver currently does not support COPY operations."
+msgstr "Sterownik nie obsługuje aktualnie operacji COPY."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2487
+#, java-format
+msgid "Unable to parse the count in command completion tag: {0}."
+msgstr ""
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2603
#, java-format
msgid ""
"The server''s client_encoding parameter was changed to {0}. The JDBC driver "
"requires client_encoding to be UTF8 for correct operation."
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1069
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2045
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2611
#, java-format
msgid ""
"The server''s DateStyle parameter was changed to {0}. The JDBC driver "
"requires DateStyle to begin with ISO for correct operation."
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1083
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2059
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2624
#, java-format
msgid ""
"The server''s standard_conforming_strings parameter was reported as {0}. The "
"JDBC driver expected on or off."
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1122
+#: org/postgresql/core/v3/SimpleParameterList.java:54
+#: org/postgresql/core/v3/SimpleParameterList.java:65
+#: org/postgresql/core/v3/CompositeParameterList.java:33
+#: org/postgresql/jdbc/PgResultSetMetaData.java:493
+#: org/postgresql/jdbc/PgResultSet.java:2751
#, java-format
-msgid "Unexpected packet type during copy: {0}"
-msgstr ""
+msgid "The column index is out of range: {0}, number of columns: {1}."
+msgstr "Indeks kolumny jest poza zakresem: {0}, liczba kolumn: {1}."
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1393
+#: org/postgresql/core/v3/SimpleParameterList.java:257
#, java-format
-msgid ""
-"Bind message length {0} too long. This can be caused by very large or "
-"incorrect length specifications on InputStream parameters."
-msgstr ""
-
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2131
-msgid "The driver currently does not support COPY operations."
-msgstr "Sterownik nie obsługuje aktualnie operacji COPY."
+msgid "No value specified for parameter {0}."
+msgstr "Nie podano wartości dla parametru {0}."
-#: org/postgresql/Driver.java:234
-msgid "Error loading default settings from driverconfig.properties"
-msgstr "Błąd podczas wczytywania ustawień domyślnych z driverconfig.properties"
+#: org/postgresql/core/v3/SimpleParameterList.java:431
+#, fuzzy, java-format
+msgid "Added parameters index out of range: {0}, number of columns: {1}."
+msgstr "Indeks parametru jest poza zakresem: {0}, liczba parametrów: {1}."
-#: org/postgresql/Driver.java:247
-msgid "Properties for the driver contains a non-string value for the key "
-msgstr ""
+#: org/postgresql/core/v3/replication/V3ReplicationProtocol.java:133
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:257
+msgid "The connection attempt failed."
+msgstr "Próba nawiązania połączenia nie powiodła się."
-#: org/postgresql/Driver.java:290
-msgid ""
-"Your security policy has prevented the connection from being attempted. You "
-"probably need to grant the connect java.net.SocketPermission to the database "
-"server host and port that you wish to connect to."
+#: org/postgresql/core/v3/replication/V3PGReplicationStream.java:144
+#, java-format
+msgid "Unexpected packet type during replication: {0}"
msgstr ""
-#: org/postgresql/Driver.java:296 org/postgresql/Driver.java:362
-msgid ""
-"Something unusual has occurred to cause the driver to fail. Please report "
-"this exception."
-msgstr "Coś niezwykłego spowodowało pad sterownika. Proszę, zgłoś ten wyjątek."
+#: org/postgresql/core/v3/replication/V3PGReplicationStream.java:269
+#, fuzzy
+msgid "This replication stream has been closed."
+msgstr "Połączenie zostało zamknięte."
-#: org/postgresql/Driver.java:370
-msgid "Connection attempt timed out."
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:109
+#, java-format
+msgid "Invalid sslmode value: {0}"
msgstr ""
-#: org/postgresql/Driver.java:383
-msgid "Interrupted while attempting to connect."
-msgstr ""
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:124
+#, fuzzy, java-format
+msgid "Invalid targetServerType value: {0}"
+msgstr "Nieznana wartość Types: {0}"
+
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:246
+#, fuzzy, java-format
+msgid ""
+"Connection to {0} refused. Check that the hostname and port are correct and "
+"that the postmaster is accepting TCP/IP connections."
+msgstr ""
+"Połączenie odrzucone. Sprawdź, czy prawidłowo ustawiłeś nazwę hosta oraz "
+"port i upewnij się, czy postmaster przyjmuje połączenia TCP/IP."
-#: org/postgresql/Driver.java:645
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:272
#, java-format
-msgid "Method {0} is not yet implemented."
-msgstr "Metoda {0}nie jest jeszcze obsługiwana."
+msgid "Could not find a server with specified targetServerType: {0}"
+msgstr ""
+
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:366
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:379
+msgid "The server does not support SSL."
+msgstr "Serwer nie obsługuje SSL."
+
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:393
+msgid "An error occurred while setting up the SSL connection."
+msgstr "Wystąpił błąd podczas ustanawiania połączenia SSL."
+
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:494
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:521
+msgid ""
+"The server requested password-based authentication, but no password was "
+"provided."
+msgstr ""
+"Serwer zażądał uwierzytelnienia opartego na haśle, ale żadne hasło nie "
+"zostało dostarczone."
+
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:624
+msgid ""
+"SCRAM authentication is not supported by this driver. You need JDK >= 8 and "
+"pgjdbc >= 42.2.0 (not \".jre\" vesions)"
+msgstr ""
+
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:648
+#, java-format
+msgid ""
+"The authentication type {0} is not supported. Check that you have configured "
+"the pg_hba.conf file to include the client''s IP address or subnet, and that "
+"it is using an authentication scheme supported by the driver."
+msgstr ""
+"Uwierzytelnienie typu {0} nie jest obsługiwane. Upewnij się, że "
+"skonfigurowałeś plik pg_hba.conf tak, że zawiera on adres IP lub podsieć "
+"klienta oraz że użyta metoda uwierzytelnienia jest wspierana przez ten "
+"sterownik."
+
+#: org/postgresql/core/ConnectionFactory.java:57
+#, java-format
+msgid "A connection could not be made using the requested protocol {0}."
+msgstr "Nie można było nawiązać połączenia stosując żądany protokołu {0}."
+
+#: org/postgresql/core/Oid.java:116
+#, java-format
+msgid "oid type {0} not known and not a number"
+msgstr ""
+
+#: org/postgresql/util/HStoreConverter.java:43
+#: org/postgresql/util/HStoreConverter.java:74
+#: org/postgresql/jdbc/PgArray.java:210
+#: org/postgresql/jdbc/PgResultSet.java:1924
+msgid ""
+"Invalid character data was found. This is most likely caused by stored data "
+"containing characters that are invalid for the character set the database "
+"was created in. The most common example of this is storing 8bit data in a "
+"SQL_ASCII database."
+msgstr ""
+"Znaleziono nieprawidłowy znak. Najprawdopodobniej jest to spowodowane "
+"przechowywaniem w bazie znaków, które nie pasują do zestawu znaków wybranego "
+"podczas tworzenia bazy danych. Najczęstszy przykład to przechowywanie 8-"
+"bitowych znaków w bazie o kodowaniu SQL_ASCII."
+
+#: org/postgresql/util/PGmoney.java:62
+msgid "Conversion of money failed."
+msgstr "Konwersja typu money nie powiodła się."
+
+#: org/postgresql/util/StreamWrapper.java:56
+#: org/postgresql/jdbc/PgPreparedStatement.java:1449
+msgid "Object is too large to send over the protocol."
+msgstr ""
+
+#: org/postgresql/util/PGInterval.java:152
+msgid "Conversion of interval failed"
+msgstr "Konwersja typu interval nie powiodła się"
+
+#: org/postgresql/util/ServerErrorMessage.java:45
+#, java-format
+msgid ""
+" (pgjdbc: autodetected server-encoding to be {0}, if the message is not "
+"readable, please check database logs and/or host, port, dbname, user, "
+"password, pg_hba.conf)"
+msgstr ""
+
+#: org/postgresql/util/ServerErrorMessage.java:176
+#, java-format
+msgid "Detail: {0}"
+msgstr "Szczegóły: {0}"
+
+#: org/postgresql/util/ServerErrorMessage.java:181
+#, java-format
+msgid "Hint: {0}"
+msgstr "Wskazówka: {0}"
+
+#: org/postgresql/util/ServerErrorMessage.java:185
+#, java-format
+msgid "Position: {0}"
+msgstr "Pozycja: {0}"
+
+#: org/postgresql/util/ServerErrorMessage.java:189
+#, java-format
+msgid "Where: {0}"
+msgstr "Gdzie: {0}"
+
+#: org/postgresql/util/ServerErrorMessage.java:195
+#, java-format
+msgid "Internal Query: {0}"
+msgstr "Wewnętrzne Zapytanie: {0}"
+
+#: org/postgresql/util/ServerErrorMessage.java:199
+#, java-format
+msgid "Internal Position: {0}"
+msgstr "Wewnętrzna Pozycja: {0}"
-#: org/postgresql/ds/common/BaseDataSource.java:1037
-#: org/postgresql/ds/common/BaseDataSource.java:1047
+#: org/postgresql/util/ServerErrorMessage.java:206
+#, java-format
+msgid "Location: File: {0}, Routine: {1}, Line: {2}"
+msgstr "Lokalizacja: Plik: {0}, Procedura: {1}, Linia: {2}"
+
+#: org/postgresql/util/ServerErrorMessage.java:211
+#, java-format
+msgid "Server SQLState: {0}"
+msgstr "Serwer SQLState: {0}"
+
+#: org/postgresql/ds/PGPoolingDataSource.java:269
+msgid "Failed to setup DataSource."
+msgstr ""
+
+#: org/postgresql/ds/PGPoolingDataSource.java:371
+msgid "DataSource has been closed."
+msgstr "DataSource zostało zamknięte."
+
+#: org/postgresql/ds/common/BaseDataSource.java:1132
+#: org/postgresql/ds/common/BaseDataSource.java:1142
#, fuzzy, java-format
msgid "Unsupported property name: {0}"
msgstr "Nieznana wartość Types: {0}"
@@ -489,7 +612,7 @@ msgstr "Nieznana wartość Types: {0}"
msgid "This PooledConnection has already been closed."
msgstr "To PooledConnection zostało już zamknięte."
-#: org/postgresql/ds/PGPooledConnection.java:313
+#: org/postgresql/ds/PGPooledConnection.java:314
msgid ""
"Connection has been closed automatically because a new connection was opened "
"for the same PooledConnection or the PooledConnection has been closed."
@@ -498,1072 +621,1053 @@ msgstr ""
"otwarte dla tego samego PooledConnection lub PooledConnection zostało "
"zamknięte."
-#: org/postgresql/ds/PGPooledConnection.java:314
+#: org/postgresql/ds/PGPooledConnection.java:315
msgid "Connection has been closed."
msgstr "Połączenie zostało zamknięte."
-#: org/postgresql/ds/PGPooledConnection.java:418
+#: org/postgresql/ds/PGPooledConnection.java:420
msgid "Statement has been closed."
msgstr ""
-#: org/postgresql/ds/PGPoolingDataSource.java:269
-msgid "Failed to setup DataSource."
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:68
+msgid "No SCRAM mechanism(s) advertised by the server"
msgstr ""
-#: org/postgresql/ds/PGPoolingDataSource.java:371
-msgid "DataSource has been closed."
-msgstr "DataSource zostało zamknięte."
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:81
+msgid "Invalid or unsupported by client SCRAM mechanisms"
+msgstr ""
-#: org/postgresql/fastpath/Fastpath.java:82
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:117
#, fuzzy, java-format
-msgid "Fastpath call {0} - No result was returned and we expected a numeric."
-msgstr ""
-"Wywołanie fastpath {0} - Nie otrzymano żadnego wyniku, a oczekiwano liczby "
-"całkowitej."
+msgid "Invalid server-first-message: {0}"
+msgstr "Nieznana wartość Types: {0}"
-#: org/postgresql/fastpath/Fastpath.java:165
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:147
+#, fuzzy, java-format
+msgid "Invalid server-final-message: {0}"
+msgstr "Nieznana wartość Types: {0}"
+
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:153
#, java-format
-msgid "Fastpath call {0} - No result was returned and we expected an integer."
+msgid "SCRAM authentication failed, server returned error: {0}"
msgstr ""
-"Wywołanie fastpath {0} - Nie otrzymano żadnego wyniku, a oczekiwano liczby "
-"całkowitej."
-#: org/postgresql/fastpath/Fastpath.java:174
-#, fuzzy, java-format
-msgid ""
-"Fastpath call {0} - No result was returned or wrong size while expecting an "
-"integer."
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:160
+msgid "Invalid server SCRAM signature"
msgstr ""
-"Wywołanie fastpath {0} - Nie otrzymano żadnego wyniku, a oczekiwano liczby "
-"całkowitej."
-#: org/postgresql/fastpath/Fastpath.java:191
+#: org/postgresql/osgi/PGDataSourceFactory.java:82
#, fuzzy, java-format
-msgid "Fastpath call {0} - No result was returned and we expected a long."
+msgid "Unsupported properties: {0}"
+msgstr "Nieznana wartość Types: {0}"
+
+#: org/postgresql/Driver.java:214
+msgid "Error loading default settings from driverconfig.properties"
+msgstr "Błąd podczas wczytywania ustawień domyślnych z driverconfig.properties"
+
+#: org/postgresql/Driver.java:226
+msgid "Properties for the driver contains a non-string value for the key "
msgstr ""
-"Wywołanie fastpath {0} - Nie otrzymano żadnego wyniku, a oczekiwano liczby "
-"całkowitej."
-#: org/postgresql/fastpath/Fastpath.java:200
-#, fuzzy, java-format
+#: org/postgresql/Driver.java:270
msgid ""
-"Fastpath call {0} - No result was returned or wrong size while expecting a "
-"long."
+"Your security policy has prevented the connection from being attempted. You "
+"probably need to grant the connect java.net.SocketPermission to the database "
+"server host and port that you wish to connect to."
+msgstr ""
+
+#: org/postgresql/Driver.java:276 org/postgresql/Driver.java:408
+msgid ""
+"Something unusual has occurred to cause the driver to fail. Please report "
+"this exception."
+msgstr "Coś niezwykłego spowodowało pad sterownika. Proszę, zgłoś ten wyjątek."
+
+#: org/postgresql/Driver.java:416
+msgid "Connection attempt timed out."
+msgstr ""
+
+#: org/postgresql/Driver.java:429
+msgid "Interrupted while attempting to connect."
msgstr ""
-"Wywołanie fastpath {0} - Nie otrzymano żadnego wyniku, a oczekiwano liczby "
-"całkowitej."
-#: org/postgresql/fastpath/Fastpath.java:312
+#: org/postgresql/Driver.java:682
#, java-format
-msgid "The fastpath function {0} is unknown."
-msgstr "Funkcja fastpath {0} jest nieznana."
+msgid "Method {0} is not yet implemented."
+msgstr "Metoda {0}nie jest jeszcze obsługiwana."
-#: org/postgresql/geometric/PGbox.java:79
-#: org/postgresql/geometric/PGcircle.java:76
-#: org/postgresql/geometric/PGcircle.java:84
-#: org/postgresql/geometric/PGline.java:109
-#: org/postgresql/geometric/PGline.java:118
-#: org/postgresql/geometric/PGlseg.java:72
-#: org/postgresql/geometric/PGpoint.java:78
+#: org/postgresql/geometric/PGlseg.java:70
+#: org/postgresql/geometric/PGline.java:107
+#: org/postgresql/geometric/PGline.java:116
+#: org/postgresql/geometric/PGcircle.java:74
+#: org/postgresql/geometric/PGcircle.java:82
+#: org/postgresql/geometric/PGpoint.java:76
+#: org/postgresql/geometric/PGbox.java:77
#, java-format
msgid "Conversion to type {0} failed: {1}."
msgstr "Konwersja do typu {0} nie powiodła się: {1}."
-#: org/postgresql/geometric/PGpath.java:73
+#: org/postgresql/geometric/PGpath.java:70
#, java-format
msgid "Cannot tell if path is open or closed: {0}."
msgstr "Nie można stwierdzić, czy ścieżka jest otwarta czy zamknięta: {0}."
-#: org/postgresql/gss/GssAction.java:141 org/postgresql/gss/MakeGSS.java:69
-#: org/postgresql/gss/MakeGSS.java:77
-msgid "GSS Authentication failed"
-msgstr ""
-
-#: org/postgresql/jdbc/AbstractBlobClob.java:89
+#: org/postgresql/xa/PGXAConnection.java:128
msgid ""
-"Truncation of large objects is only implemented in 8.3 and later servers."
+"Transaction control methods setAutoCommit(true), commit, rollback and "
+"setSavePoint not allowed while an XA transaction is active."
msgstr ""
-#: org/postgresql/jdbc/AbstractBlobClob.java:94
-msgid "Cannot truncate LOB to a negative length."
+#: org/postgresql/xa/PGXAConnection.java:177
+#: org/postgresql/xa/PGXAConnection.java:253
+#: org/postgresql/xa/PGXAConnection.java:347
+#, java-format
+msgid "Invalid flags {0}"
msgstr ""
-#: org/postgresql/jdbc/AbstractBlobClob.java:101
-#: org/postgresql/jdbc/AbstractBlobClob.java:245
-#, java-format
-msgid "PostgreSQL LOBs can only index to: {0}"
+#: org/postgresql/xa/PGXAConnection.java:181
+#: org/postgresql/xa/PGXAConnection.java:257
+#: org/postgresql/xa/PGXAConnection.java:449
+msgid "xid must not be null"
msgstr ""
-#: org/postgresql/jdbc/AbstractBlobClob.java:241
-msgid "LOB positioning offsets start at 1."
+#: org/postgresql/xa/PGXAConnection.java:185
+msgid "Connection is busy with another transaction"
msgstr ""
-#: org/postgresql/jdbc/AbstractBlobClob.java:257
-msgid "free() was called on this LOB previously"
+#: org/postgresql/xa/PGXAConnection.java:194
+#: org/postgresql/xa/PGXAConnection.java:267
+msgid "suspend/resume not implemented"
msgstr ""
-#: org/postgresql/jdbc/BatchResultHandler.java:41
-#: org/postgresql/jdbc/PgConnection.java:474
-#: org/postgresql/jdbc/PgPreparedStatement.java:138
-#: org/postgresql/jdbc/PgStatement.java:299
-msgid "A result was returned when none was expected."
-msgstr "Zwrócono wynik zapytania, choć nie był on oczekiwany."
+#: org/postgresql/xa/PGXAConnection.java:202
+#: org/postgresql/xa/PGXAConnection.java:209
+#: org/postgresql/xa/PGXAConnection.java:213
+#, fuzzy, java-format
+msgid ""
+"Invalid protocol state requested. Attempted transaction interleaving is not "
+"supported. xid={0}, currentXid={1}, state={2}, flags={3}"
+msgstr ""
+"Poziom izolacji transakcji {0} nie jest obsługiwany. xid={0}, "
+"currentXid={1}, state={2}, flags={3}"
-#: org/postgresql/jdbc/BatchResultHandler.java:59
-msgid "Too many update results were returned."
-msgstr "Zapytanie nie zwróciło żadnych wyników."
+#: org/postgresql/xa/PGXAConnection.java:224
+msgid "Error disabling autocommit"
+msgstr ""
-#: org/postgresql/jdbc/BatchResultHandler.java:88
+#: org/postgresql/xa/PGXAConnection.java:261
#, java-format
msgid ""
-"Batch entry {0} {1} was aborted. Call getNextException to see the cause."
+"tried to call end without corresponding start call. state={0}, start "
+"xid={1}, currentXid={2}, preparedXid={3}"
msgstr ""
-"Zadanie wsadowe {0} {1} zostało przerwane. Wywołaj getNextException by "
-"poznać przyczynę."
-#: org/postgresql/jdbc/EscapedFunctions.java:243
+#: org/postgresql/xa/PGXAConnection.java:297
#, java-format
-msgid "{0} function takes four and only four argument."
+msgid ""
+"Preparing already prepared transaction, the prepared xid {0}, prepare xid={1}"
msgstr ""
-#: org/postgresql/jdbc/EscapedFunctions.java:273
-#: org/postgresql/jdbc/EscapedFunctions.java:347
-#: org/postgresql/jdbc/EscapedFunctions.java:752
-#: org/postgresql/jdbc/EscapedFunctions.java:790
+#: org/postgresql/xa/PGXAConnection.java:300
#, java-format
-msgid "{0} function takes two and only two arguments."
+msgid "Current connection does not have an associated xid. prepare xid={0}"
msgstr ""
-#: org/postgresql/jdbc/EscapedFunctions.java:291
-#: org/postgresql/jdbc/EscapedFunctions.java:329
-#: org/postgresql/jdbc/EscapedFunctions.java:449
-#: org/postgresql/jdbc/EscapedFunctions.java:464
-#: org/postgresql/jdbc/EscapedFunctions.java:479
-#: org/postgresql/jdbc/EscapedFunctions.java:494
-#: org/postgresql/jdbc/EscapedFunctions.java:509
-#: org/postgresql/jdbc/EscapedFunctions.java:524
-#: org/postgresql/jdbc/EscapedFunctions.java:539
-#: org/postgresql/jdbc/EscapedFunctions.java:554
-#: org/postgresql/jdbc/EscapedFunctions.java:569
-#: org/postgresql/jdbc/EscapedFunctions.java:584
-#: org/postgresql/jdbc/EscapedFunctions.java:599
-#: org/postgresql/jdbc/EscapedFunctions.java:614
-#: org/postgresql/jdbc/EscapedFunctions.java:778
+#: org/postgresql/xa/PGXAConnection.java:307
#, java-format
-msgid "{0} function takes one and only one argument."
+msgid ""
+"Not implemented: Prepare must be issued using the same connection that "
+"started the transaction. currentXid={0}, prepare xid={1}"
msgstr ""
-#: org/postgresql/jdbc/EscapedFunctions.java:313
-#: org/postgresql/jdbc/EscapedFunctions.java:394
+#: org/postgresql/xa/PGXAConnection.java:311
#, java-format
-msgid "{0} function takes two or three arguments."
+msgid "Prepare called before end. prepare xid={0}, state={1}"
msgstr ""
-#: org/postgresql/jdbc/EscapedFunctions.java:419
-#: org/postgresql/jdbc/EscapedFunctions.java:434
-#: org/postgresql/jdbc/EscapedFunctions.java:737
-#: org/postgresql/jdbc/EscapedFunctions.java:767
+#: org/postgresql/xa/PGXAConnection.java:331
#, java-format
-msgid "{0} function doesn''t take any argument."
+msgid "Error preparing transaction. prepare xid={0}"
msgstr ""
-#: org/postgresql/jdbc/EscapedFunctions.java:630
-#: org/postgresql/jdbc/EscapedFunctions.java:683
-#, java-format
-msgid "{0} function takes three and only three arguments."
+#: org/postgresql/xa/PGXAConnection.java:382
+msgid "Error during recover"
msgstr ""
-#: org/postgresql/jdbc/EscapedFunctions.java:643
-#: org/postgresql/jdbc/EscapedFunctions.java:664
-#: org/postgresql/jdbc/EscapedFunctions.java:667
-#: org/postgresql/jdbc/EscapedFunctions.java:700
-#: org/postgresql/jdbc/EscapedFunctions.java:713
-#: org/postgresql/jdbc/EscapedFunctions.java:716
-#, fuzzy, java-format
-msgid "Interval {0} not yet implemented"
-msgstr "Metoda {0}nie jest jeszcze obsługiwana."
-
-#: org/postgresql/jdbc/PgArray.java:166 org/postgresql/jdbc/PgArray.java:822
+#: org/postgresql/xa/PGXAConnection.java:438
#, java-format
-msgid "The array index is out of range: {0}"
-msgstr "Indeks tablicy jest poza zakresem: {0}"
+msgid ""
+"Error rolling back prepared transaction. rollback xid={0}, preparedXid={1}, "
+"currentXid={2}"
+msgstr ""
-#: org/postgresql/jdbc/PgArray.java:183 org/postgresql/jdbc/PgArray.java:839
+#: org/postgresql/xa/PGXAConnection.java:471
#, java-format
-msgid "The array index is out of range: {0}, number of elements: {1}."
-msgstr "Indeks tablicy jest poza zakresem: {0}, liczba elementów: {1}."
+msgid ""
+"One-phase commit called for xid {0} but connection was prepared with xid {1}"
+msgstr ""
-#: org/postgresql/jdbc/PgArray.java:215
-#: org/postgresql/jdbc/PgResultSet.java:1885
-#: org/postgresql/util/HStoreConverter.java:38
-#: org/postgresql/util/HStoreConverter.java:69
+#: org/postgresql/xa/PGXAConnection.java:479
msgid ""
-"Invalid character data was found. This is most likely caused by stored data "
-"containing characters that are invalid for the character set the database "
-"was created in. The most common example of this is storing 8bit data in a "
-"SQL_ASCII database."
+"Not implemented: one-phase commit must be issued using the same connection "
+"that was used to start it"
msgstr ""
-"Znaleziono nieprawidłowy znak. Najprawdopodobniej jest to spowodowane "
-"przechowywaniem w bazie znaków, które nie pasują do zestawu znaków wybranego "
-"podczas tworzenia bazy danych. Najczęstszy przykład to przechowywanie 8-"
-"bitowych znaków w bazie o kodowaniu SQL_ASCII."
-#: org/postgresql/jdbc/PgCallableStatement.java:90
-#: org/postgresql/jdbc/PgCallableStatement.java:96
-msgid "A CallableStatement was executed with nothing returned."
+#: org/postgresql/xa/PGXAConnection.java:483
+#, java-format
+msgid "One-phase commit with unknown xid. commit xid={0}, currentXid={1}"
msgstr ""
-#: org/postgresql/jdbc/PgCallableStatement.java:107
-msgid "A CallableStatement was executed with an invalid number of parameters"
+#: org/postgresql/xa/PGXAConnection.java:487
+#, java-format
+msgid "commit called before end. commit xid={0}, state={1}"
msgstr ""
-#: org/postgresql/jdbc/PgCallableStatement.java:139
+#: org/postgresql/xa/PGXAConnection.java:498
#, java-format
+msgid "Error during one-phase commit. commit xid={0}"
+msgstr ""
+
+#: org/postgresql/xa/PGXAConnection.java:517
msgid ""
-"A CallableStatement function was executed and the out parameter {0} was of "
-"type {1} however type {2} was registered."
+"Not implemented: 2nd phase commit must be issued using an idle connection. "
+"commit xid={0}, currentXid={1}, state={2], transactionState={3}"
msgstr ""
-#: org/postgresql/jdbc/PgCallableStatement.java:195
+#: org/postgresql/xa/PGXAConnection.java:550
+#, java-format
msgid ""
-"This statement does not declare an OUT parameter. Use '{' ?= call ... '}' "
-"to declare one."
+"Error committing prepared transaction. commit xid={0}, preparedXid={1}, "
+"currentXid={2}"
msgstr ""
-#: org/postgresql/jdbc/PgCallableStatement.java:239
-msgid "wasNull cannot be call before fetching a result."
+#: org/postgresql/xa/PGXAConnection.java:567
+#, java-format
+msgid "Heuristic commit/rollback not supported. forget xid={0}"
msgstr ""
-#: org/postgresql/jdbc/PgCallableStatement.java:377
-#: org/postgresql/jdbc/PgCallableStatement.java:396
+#: org/postgresql/jdbc/PgSQLXML.java:147
+msgid "Unable to decode xml data."
+msgstr ""
+
+#: org/postgresql/jdbc/PgSQLXML.java:150
#, java-format
+msgid "Unknown XML Source class: {0}"
+msgstr ""
+
+#: org/postgresql/jdbc/PgSQLXML.java:193
+#, fuzzy
+msgid "Unable to create SAXResult for SQLXML."
+msgstr "Nie powiodło się utworzenie obiektu dla: {0}."
+
+#: org/postgresql/jdbc/PgSQLXML.java:208
+msgid "Unable to create StAXResult for SQLXML"
+msgstr ""
+
+#: org/postgresql/jdbc/PgSQLXML.java:213
+#, java-format
+msgid "Unknown XML Result class: {0}"
+msgstr ""
+
+#: org/postgresql/jdbc/PgSQLXML.java:225
+#, fuzzy
+msgid "This SQLXML object has already been freed."
+msgstr "To PooledConnection zostało już zamknięte."
+
+#: org/postgresql/jdbc/PgSQLXML.java:234
msgid ""
-"Parameter of type {0} was registered, but call to get{1} (sqltype={2}) was "
-"made."
+"This SQLXML object has not been initialized, so you cannot retrieve data "
+"from it."
+msgstr ""
+
+#: org/postgresql/jdbc/PgSQLXML.java:247
+#, java-format
+msgid "Failed to convert binary xml data to encoding: {0}."
msgstr ""
-#: org/postgresql/jdbc/PgCallableStatement.java:417
+#: org/postgresql/jdbc/PgSQLXML.java:273
+msgid "Unable to convert DOMResult SQLXML data to a string."
+msgstr ""
+
+#: org/postgresql/jdbc/PgSQLXML.java:287
msgid ""
-"A CallableStatement was declared, but no call to registerOutParameter(1, "
-"<some type>) was made."
+"This SQLXML object has already been initialized, so you cannot manipulate it "
+"further."
msgstr ""
-"Funkcja CallableStatement została zadeklarowana, ale nie wywołano "
-"registerOutParameter (1, <jakiś typ>)."
-#: org/postgresql/jdbc/PgCallableStatement.java:423
-msgid "No function outputs were registered."
+#: org/postgresql/jdbc/PSQLSavepoint.java:37
+#: org/postgresql/jdbc/PSQLSavepoint.java:51
+#: org/postgresql/jdbc/PSQLSavepoint.java:69
+msgid "Cannot reference a savepoint after it has been released."
+msgstr ""
+
+#: org/postgresql/jdbc/PSQLSavepoint.java:42
+msgid "Cannot retrieve the id of a named savepoint."
msgstr ""
-#: org/postgresql/jdbc/PgCallableStatement.java:429
+#: org/postgresql/jdbc/PSQLSavepoint.java:56
+msgid "Cannot retrieve the name of an unnamed savepoint."
+msgstr ""
+
+#: org/postgresql/jdbc/PgArray.java:157 org/postgresql/jdbc/PgArray.java:844
+#, java-format
+msgid "The array index is out of range: {0}"
+msgstr "Indeks tablicy jest poza zakresem: {0}"
+
+#: org/postgresql/jdbc/PgArray.java:178 org/postgresql/jdbc/PgArray.java:861
+#, java-format
+msgid "The array index is out of range: {0}, number of elements: {1}."
+msgstr "Indeks tablicy jest poza zakresem: {0}, liczba elementów: {1}."
+
+#: org/postgresql/jdbc/PgParameterMetaData.java:83
+#, java-format
+msgid "The parameter index is out of range: {0}, number of parameters: {1}."
+msgstr "Indeks parametru jest poza zakresem: {0}, liczba parametrów: {1}."
+
+#: org/postgresql/jdbc/BatchResultHandler.java:92
+msgid "Too many update results were returned."
+msgstr "Zapytanie nie zwróciło żadnych wyników."
+
+#: org/postgresql/jdbc/BatchResultHandler.java:146
+#, fuzzy, java-format
msgid ""
-"Results cannot be retrieved from a CallableStatement before it is executed."
+"Batch entry {0} {1} was aborted: {2} Call getNextException to see other "
+"errors in the batch."
msgstr ""
+"Zadanie wsadowe {0} {1} zostało przerwane. Wywołaj getNextException by "
+"poznać przyczynę."
-#: org/postgresql/jdbc/PgConnection.java:312
+#: org/postgresql/jdbc/PgConnection.java:272
#, fuzzy, java-format
msgid "Unsupported value for stringtype parameter: {0}"
msgstr "Nieznana wartość Types: {0}"
-#: org/postgresql/jdbc/PgConnection.java:457
-#: org/postgresql/jdbc/PgPreparedStatement.java:115
-#: org/postgresql/jdbc/PgStatement.java:282
-#: org/postgresql/jdbc/TypeInfoCache.java:230
-#: org/postgresql/jdbc/TypeInfoCache.java:370
-#: org/postgresql/jdbc/TypeInfoCache.java:412
+#: org/postgresql/jdbc/PgConnection.java:424
+#: org/postgresql/jdbc/PgStatement.java:225
+#: org/postgresql/jdbc/TypeInfoCache.java:226
+#: org/postgresql/jdbc/TypeInfoCache.java:371
+#: org/postgresql/jdbc/TypeInfoCache.java:411
+#: org/postgresql/jdbc/TypeInfoCache.java:484
#: org/postgresql/jdbc/TypeInfoCache.java:489
-#: org/postgresql/jdbc/TypeInfoCache.java:494
-#: org/postgresql/jdbc/TypeInfoCache.java:535
-#: org/postgresql/jdbc/TypeInfoCache.java:540
+#: org/postgresql/jdbc/TypeInfoCache.java:526
+#: org/postgresql/jdbc/TypeInfoCache.java:531
+#: org/postgresql/jdbc/PgPreparedStatement.java:119
msgid "No results were returned by the query."
msgstr "Zapytanie nie zwróciło żadnych wyników."
-#: org/postgresql/jdbc/PgConnection.java:578
+#: org/postgresql/jdbc/PgConnection.java:441
+#: org/postgresql/jdbc/PgStatement.java:254
+msgid "A result was returned when none was expected."
+msgstr "Zwrócono wynik zapytania, choć nie był on oczekiwany."
+
+#: org/postgresql/jdbc/PgConnection.java:545
msgid "Custom type maps are not supported."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:620
+#: org/postgresql/jdbc/PgConnection.java:587
#, java-format
msgid "Failed to create object for: {0}."
msgstr "Nie powiodło się utworzenie obiektu dla: {0}."
-#: org/postgresql/jdbc/PgConnection.java:672
+#: org/postgresql/jdbc/PgConnection.java:641
#, java-format
msgid "Unable to load the class {0} responsible for the datatype {1}"
msgstr ""
"Nie jest możliwe załadowanie klasy {0} odpowiedzialnej za typ danych {1}"
-#: org/postgresql/jdbc/PgConnection.java:724
+#: org/postgresql/jdbc/PgConnection.java:693
msgid ""
"Cannot change transaction read-only property in the middle of a transaction."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:775
+#: org/postgresql/jdbc/PgConnection.java:756
msgid "Cannot commit when autoCommit is enabled."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:786
-#: org/postgresql/jdbc/PgConnection.java:1358
-#: org/postgresql/jdbc/PgConnection.java:1395
+#: org/postgresql/jdbc/PgConnection.java:767
+#: org/postgresql/jdbc/PgConnection.java:1384
+#: org/postgresql/jdbc/PgConnection.java:1428
#, fuzzy
msgid "This connection has been closed."
msgstr "Połączenie zostało zamknięte."
-#: org/postgresql/jdbc/PgConnection.java:796
+#: org/postgresql/jdbc/PgConnection.java:777
msgid "Cannot rollback when autoCommit is enabled."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:870
+#: org/postgresql/jdbc/PgConnection.java:827
msgid ""
"Cannot change transaction isolation level in the middle of a transaction."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:876
+#: org/postgresql/jdbc/PgConnection.java:833
#, java-format
msgid "Transaction isolation level {0} not supported."
msgstr "Poziom izolacji transakcji {0} nie jest obsługiwany."
-#: org/postgresql/jdbc/PgConnection.java:921
+#: org/postgresql/jdbc/PgConnection.java:878
#, fuzzy
msgid "Finalizing a Connection that was never closed:"
msgstr "Połączenie zostało zamknięte."
-#: org/postgresql/jdbc/PgConnection.java:1009
+#: org/postgresql/jdbc/PgConnection.java:945
msgid "Unable to translate data into the desired encoding."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:1081
-#: org/postgresql/jdbc/PgResultSet.java:1782
-#: org/postgresql/jdbc/PgStatement.java:1053
+#: org/postgresql/jdbc/PgConnection.java:1008
+#: org/postgresql/jdbc/PgStatement.java:903
+#: org/postgresql/jdbc/PgResultSet.java:1817
msgid "Fetch size must be a value greater to or equal to 0."
msgstr "Rozmiar pobierania musi być wartością dodatnią lub 0."
-#: org/postgresql/jdbc/PgConnection.java:1311
+#: org/postgresql/jdbc/PgConnection.java:1289
+#: org/postgresql/jdbc/PgConnection.java:1330
#, java-format
msgid "Unable to find server array type for provided name {0}."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:1327
+#: org/postgresql/jdbc/PgConnection.java:1312
+#, java-format
+msgid "Invalid elements {0}"
+msgstr ""
+
+#: org/postgresql/jdbc/PgConnection.java:1348
#, java-format
msgid "Invalid timeout ({0}<0)."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:1340
+#: org/postgresql/jdbc/PgConnection.java:1372
msgid "Validating connection."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:1375
+#: org/postgresql/jdbc/PgConnection.java:1405
#, fuzzy, java-format
msgid "Failed to set ClientInfo property: {0}"
msgstr "Nie powiodło się utworzenie obiektu dla: {0}."
-#: org/postgresql/jdbc/PgConnection.java:1383
+#: org/postgresql/jdbc/PgConnection.java:1415
msgid "ClientInfo property not supported."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:1408
+#: org/postgresql/jdbc/PgConnection.java:1441
msgid "One ore more ClientInfo failed."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:1517
-#, java-format
-msgid "Unknown ResultSet holdability setting: {0}."
+#: org/postgresql/jdbc/PgConnection.java:1540
+#, fuzzy
+msgid "Network timeout must be a value greater than or equal to 0."
+msgstr "Timeout zapytania musi być wartością dodatnią lub 0."
+
+#: org/postgresql/jdbc/PgConnection.java:1552
+msgid "Unable to set network timeout."
+msgstr ""
+
+#: org/postgresql/jdbc/PgConnection.java:1563
+msgid "Unable to get network timeout."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:1531
-#: org/postgresql/jdbc/PgConnection.java:1554
-#: org/postgresql/jdbc/PgConnection.java:1576
-#: org/postgresql/jdbc/PgConnection.java:1587
-msgid "Server versions prior to 8.0 do not support savepoints."
+#: org/postgresql/jdbc/PgConnection.java:1580
+#, java-format
+msgid "Unknown ResultSet holdability setting: {0}."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:1535
-#: org/postgresql/jdbc/PgConnection.java:1558
+#: org/postgresql/jdbc/PgConnection.java:1598
+#: org/postgresql/jdbc/PgConnection.java:1619
msgid "Cannot establish a savepoint in auto-commit mode."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:1635
+#: org/postgresql/jdbc/PgConnection.java:1685
msgid "Returning autogenerated keys is not supported."
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:78
+#: org/postgresql/jdbc/PgStatement.java:235
+msgid "Multiple ResultSets were returned by the query."
+msgstr ""
+
+#: org/postgresql/jdbc/PgStatement.java:316
+msgid "Can''t use executeWithFlags(int) on a Statement."
+msgstr ""
+
+#: org/postgresql/jdbc/PgStatement.java:509
+msgid "Maximum number of rows must be a value grater than or equal to 0."
+msgstr "Maksymalna liczba rekordów musi być wartością dodatnią lub 0."
+
+#: org/postgresql/jdbc/PgStatement.java:550
+msgid "Query timeout must be a value greater than or equals to 0."
+msgstr "Timeout zapytania musi być wartością dodatnią lub 0."
+
+#: org/postgresql/jdbc/PgStatement.java:590
+msgid "The maximum field size must be a value greater than or equal to 0."
+msgstr "Maksymalny rozmiar pola musi być wartością dodatnią lub 0."
+
+#: org/postgresql/jdbc/PgStatement.java:689
+msgid "This statement has been closed."
+msgstr ""
+
+#: org/postgresql/jdbc/PgStatement.java:895
+#: org/postgresql/jdbc/PgResultSet.java:878
+#, java-format
+msgid "Invalid fetch direction constant: {0}."
+msgstr ""
+
+#: org/postgresql/jdbc/PgStatement.java:1145
+#: org/postgresql/jdbc/PgStatement.java:1173
+msgid "Returning autogenerated keys by column index is not supported."
+msgstr ""
+
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:66
msgid ""
"Unable to determine a value for MaxIndexKeys due to missing system catalog "
"data."
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:100
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:89
msgid "Unable to find name datatype in the system catalogs."
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1117
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1028
msgid "proname"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1117
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1028
msgid "oid"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1119
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1714
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1030
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1481
msgid "typtype"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1122
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1033
msgid "proargtypes"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1732
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1499
msgid "adsrc"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1872
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1963
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1512
+msgid "attidentity"
+msgstr ""
+
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1608
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1684
msgid "rolname"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1873
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1964
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1609
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1685
msgid "relacl"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1878
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1615
msgid "attacl"
msgstr ""
-#: org/postgresql/jdbc/PgParameterMetaData.java:86
+#: org/postgresql/jdbc/AbstractBlobClob.java:78
+msgid ""
+"Truncation of large objects is only implemented in 8.3 and later servers."
+msgstr ""
+
+#: org/postgresql/jdbc/AbstractBlobClob.java:83
+msgid "Cannot truncate LOB to a negative length."
+msgstr ""
+
+#: org/postgresql/jdbc/AbstractBlobClob.java:90
+#: org/postgresql/jdbc/AbstractBlobClob.java:234
#, java-format
-msgid "The parameter index is out of range: {0}, number of parameters: {1}."
-msgstr "Indeks parametru jest poza zakresem: {0}, liczba parametrów: {1}."
+msgid "PostgreSQL LOBs can only index to: {0}"
+msgstr ""
-#: org/postgresql/jdbc/PgPreparedStatement.java:102
-#: org/postgresql/jdbc/PgPreparedStatement.java:128
-#: org/postgresql/jdbc/PgPreparedStatement.java:150
-#: org/postgresql/jdbc/PgPreparedStatement.java:1108
-msgid ""
-"Can''t use query methods that take a query string on a PreparedStatement."
+#: org/postgresql/jdbc/AbstractBlobClob.java:230
+msgid "LOB positioning offsets start at 1."
msgstr ""
-#: org/postgresql/jdbc/PgPreparedStatement.java:119
-#: org/postgresql/jdbc/PgStatement.java:286
-msgid "Multiple ResultSets were returned by the query."
+#: org/postgresql/jdbc/AbstractBlobClob.java:246
+msgid "free() was called on this LOB previously"
+msgstr ""
+
+#: org/postgresql/jdbc/PgPreparedStatement.java:106
+#: org/postgresql/jdbc/PgPreparedStatement.java:127
+#: org/postgresql/jdbc/PgPreparedStatement.java:139
+#: org/postgresql/jdbc/PgPreparedStatement.java:1035
+msgid ""
+"Can''t use query methods that take a query string on a PreparedStatement."
msgstr ""
-#: org/postgresql/jdbc/PgPreparedStatement.java:270
+#: org/postgresql/jdbc/PgPreparedStatement.java:249
msgid "Unknown Types value."
msgstr "Nieznana wartość Types."
-#: org/postgresql/jdbc/PgPreparedStatement.java:417
-#: org/postgresql/jdbc/PgPreparedStatement.java:486
-#: org/postgresql/jdbc/PgPreparedStatement.java:1251
-#: org/postgresql/jdbc/PgPreparedStatement.java:1583
+#: org/postgresql/jdbc/PgPreparedStatement.java:382
+#: org/postgresql/jdbc/PgPreparedStatement.java:439
+#: org/postgresql/jdbc/PgPreparedStatement.java:1191
+#: org/postgresql/jdbc/PgPreparedStatement.java:1490
#, java-format
msgid "Invalid stream length {0}."
msgstr ""
-#: org/postgresql/jdbc/PgPreparedStatement.java:447
+#: org/postgresql/jdbc/PgPreparedStatement.java:411
#, java-format
msgid "The JVM claims not to support the {0} encoding."
msgstr ""
-#: org/postgresql/jdbc/PgPreparedStatement.java:450
-#: org/postgresql/jdbc/PgPreparedStatement.java:519
-#: org/postgresql/jdbc/PgResultSet.java:1075
-#: org/postgresql/jdbc/PgResultSet.java:1109
+#: org/postgresql/jdbc/PgPreparedStatement.java:414
+#: org/postgresql/jdbc/PgResultSet.java:1122
+#: org/postgresql/jdbc/PgResultSet.java:1156
msgid "Provided InputStream failed."
msgstr ""
-#: org/postgresql/jdbc/PgPreparedStatement.java:536
-#: org/postgresql/jdbc/PgPreparedStatement.java:1170
+#: org/postgresql/jdbc/PgPreparedStatement.java:460
+#: org/postgresql/jdbc/PgPreparedStatement.java:1096
#, java-format
msgid "Unknown type {0}."
msgstr "Nieznany typ {0}."
-#: org/postgresql/jdbc/PgPreparedStatement.java:553
+#: org/postgresql/jdbc/PgPreparedStatement.java:477
msgid "No hstore extension installed."
msgstr ""
-#: org/postgresql/jdbc/PgPreparedStatement.java:683
-#: org/postgresql/jdbc/PgPreparedStatement.java:705
-#: org/postgresql/jdbc/PgPreparedStatement.java:715
-#: org/postgresql/jdbc/PgPreparedStatement.java:725
+#: org/postgresql/jdbc/PgPreparedStatement.java:619
+#: org/postgresql/jdbc/PgPreparedStatement.java:642
+#: org/postgresql/jdbc/PgPreparedStatement.java:652
+#: org/postgresql/jdbc/PgPreparedStatement.java:664
#, java-format
msgid "Cannot cast an instance of {0} to type {1}"
msgstr ""
-#: org/postgresql/jdbc/PgPreparedStatement.java:741
+#: org/postgresql/jdbc/PgPreparedStatement.java:682
#, java-format
msgid "Unsupported Types value: {0}"
msgstr "Nieznana wartość Types: {0}"
-#: org/postgresql/jdbc/PgPreparedStatement.java:970
+#: org/postgresql/jdbc/PgPreparedStatement.java:894
#, java-format
msgid "Cannot convert an instance of {0} to type {1}"
msgstr ""
-#: org/postgresql/jdbc/PgPreparedStatement.java:1040
+#: org/postgresql/jdbc/PgPreparedStatement.java:968
#, java-format
msgid ""
"Can''t infer the SQL type to use for an instance of {0}. Use setObject() "
-"with an explicit Types value to specify the type to use."
-msgstr ""
-
-#: org/postgresql/jdbc/PgPreparedStatement.java:1207
-#: org/postgresql/jdbc/PgPreparedStatement.java:1303
-#: org/postgresql/jdbc/PgPreparedStatement.java:1340
-msgid "Unexpected error writing large object to database."
-msgstr ""
-
-#: org/postgresql/jdbc/PgPreparedStatement.java:1278
-#: org/postgresql/jdbc/PgResultSet.java:1163
-msgid "Provided Reader failed."
-msgstr ""
-
-#: org/postgresql/jdbc/PgPreparedStatement.java:1542
-#: org/postgresql/util/StreamWrapper.java:59
-msgid "Object is too large to send over the protocol."
-msgstr ""
-
-#: org/postgresql/jdbc/PgResultSet.java:285
-msgid ""
-"Operation requires a scrollable ResultSet, but this ResultSet is "
-"FORWARD_ONLY."
-msgstr ""
-
-#: org/postgresql/jdbc/PgResultSet.java:456
-msgid "Unexpected error while decoding character data from a large object."
-msgstr ""
-
-#: org/postgresql/jdbc/PgResultSet.java:507
-#: org/postgresql/jdbc/PgResultSet.java:537
-#: org/postgresql/jdbc/PgResultSet.java:570
-#: org/postgresql/jdbc/PgResultSet.java:2964
-#: org/postgresql/jdbc/PgResultSet.java:3008
-#, java-format
-msgid "Cannot convert the column of type {0} to requested type {1}."
-msgstr ""
-
-#: org/postgresql/jdbc/PgResultSet.java:789
-#: org/postgresql/jdbc/PgResultSet.java:810
-#: org/postgresql/jdbc/PgResultSet.java:1797
-msgid "Can''t use relative move methods while on the insert row."
-msgstr ""
-
-#: org/postgresql/jdbc/PgResultSet.java:829
-#: org/postgresql/jdbc/PgStatement.java:1045
-#, java-format
-msgid "Invalid fetch direction constant: {0}."
-msgstr ""
-
-#: org/postgresql/jdbc/PgResultSet.java:840
-msgid "Cannot call cancelRowUpdates() when on the insert row."
-msgstr "Nie można wywołać cancelRowUpdates() na wstawianym rekordzie."
-
-#: org/postgresql/jdbc/PgResultSet.java:856
-msgid "Cannot call deleteRow() when on the insert row."
-msgstr "Nie można wywołać deleteRow() na wstawianym rekordzie."
-
-#: org/postgresql/jdbc/PgResultSet.java:863
-msgid ""
-"Currently positioned before the start of the ResultSet. You cannot call "
-"deleteRow() here."
-msgstr ""
-"Aktualna pozycja przed początkiem ResultSet. Nie można wywołać deleteRow()."
-
-#: org/postgresql/jdbc/PgResultSet.java:869
-msgid ""
-"Currently positioned after the end of the ResultSet. You cannot call "
-"deleteRow() here."
-msgstr "Aktualna pozycja za końcem ResultSet. Nie można wywołać deleteRow()."
-
-#: org/postgresql/jdbc/PgResultSet.java:873
-msgid "There are no rows in this ResultSet."
-msgstr "Nie ma żadnych wierszy w tym ResultSet."
-
-#: org/postgresql/jdbc/PgResultSet.java:914
-msgid "Not on the insert row."
-msgstr "Nie na wstawianym rekordzie."
-
-#: org/postgresql/jdbc/PgResultSet.java:916
-msgid "You must specify at least one column value to insert a row."
-msgstr ""
-
-#: org/postgresql/jdbc/PgResultSet.java:1072
-#: org/postgresql/jdbc/PgResultSet.java:1706
-#: org/postgresql/jdbc/PgResultSet.java:2377
-#: org/postgresql/jdbc/PgResultSet.java:2402
-#, java-format
-msgid "The JVM claims not to support the encoding: {0}"
-msgstr ""
-
-#: org/postgresql/jdbc/PgResultSet.java:1214
-msgid "Can''t refresh the insert row."
-msgstr ""
-
-#: org/postgresql/jdbc/PgResultSet.java:1280
-msgid "Cannot call updateRow() when on the insert row."
-msgstr "Nie można wywołać updateRow() na wstawianym rekordzie."
-
-#: org/postgresql/jdbc/PgResultSet.java:1287
-#: org/postgresql/jdbc/PgResultSet.java:3025
-msgid ""
-"Cannot update the ResultSet because it is either before the start or after "
-"the end of the results."
-msgstr ""
-
-#: org/postgresql/jdbc/PgResultSet.java:1486
-msgid "ResultSets with concurrency CONCUR_READ_ONLY cannot be updated."
-msgstr ""
-
-#: org/postgresql/jdbc/PgResultSet.java:1555
-#, java-format
-msgid "No primary key found for table {0}."
-msgstr ""
-
-#: org/postgresql/jdbc/PgResultSet.java:1941
-#: org/postgresql/jdbc/PgResultSet.java:1946
-#: org/postgresql/jdbc/PgResultSet.java:1986
-#: org/postgresql/jdbc/PgResultSet.java:1992
-#: org/postgresql/jdbc/PgResultSet.java:2790
-#: org/postgresql/jdbc/PgResultSet.java:2796
-#: org/postgresql/jdbc/PgResultSet.java:2820
-#: org/postgresql/jdbc/PgResultSet.java:2825
-#: org/postgresql/jdbc/PgResultSet.java:2841
-#: org/postgresql/jdbc/PgResultSet.java:2862
-#: org/postgresql/jdbc/PgResultSet.java:2873
-#: org/postgresql/jdbc/PgResultSet.java:2886
-#: org/postgresql/jdbc/PgResultSet.java:3013
-#, java-format
-msgid "Bad value for type {0} : {1}"
-msgstr "Zła wartość dla typu {0}: {1}"
-
-#: org/postgresql/jdbc/PgResultSet.java:2564
-#, java-format
-msgid "The column name {0} was not found in this ResultSet."
-msgstr ""
-
-#: org/postgresql/jdbc/PgResultSet.java:2689
-msgid ""
-"ResultSet is not updateable. The query that generated this result set must "
-"select only one table, and must select all primary keys from that table. See "
-"the JDBC 2.1 API Specification, section 5.6 for more details."
-msgstr ""
-"ResultSet nie jest modyfikowalny (not updateable). Zapytanie, które zwróciło "
-"ten wynik musi dotyczyć tylko jednej tabeli oraz musi pobierać wszystkie "
-"klucze główne tej tabeli. Zobacz Specyfikację JDBC 2.1 API, rozdział 5.6, by "
-"uzyskać więcej szczegółów."
-
-#: org/postgresql/jdbc/PgResultSet.java:2701
-msgid "This ResultSet is closed."
-msgstr "Ten ResultSet jest zamknięty."
-
-#: org/postgresql/jdbc/PgResultSet.java:2732
-msgid "ResultSet not positioned properly, perhaps you need to call next."
-msgstr "Zła pozycja w ResultSet, może musisz wywołać next."
-
-#: org/postgresql/jdbc/PgResultSet.java:3045
-msgid "Invalid UUID data."
-msgstr ""
-
-#: org/postgresql/jdbc/PgSQLXML.java:150
-msgid "Unable to decode xml data."
-msgstr ""
-
-#: org/postgresql/jdbc/PgSQLXML.java:153
-#, java-format
-msgid "Unknown XML Source class: {0}"
-msgstr ""
-
-#: org/postgresql/jdbc/PgSQLXML.java:196
-#, fuzzy
-msgid "Unable to create SAXResult for SQLXML."
-msgstr "Nie powiodło się utworzenie obiektu dla: {0}."
-
-#: org/postgresql/jdbc/PgSQLXML.java:211
-msgid "Unable to create StAXResult for SQLXML"
-msgstr ""
-
-#: org/postgresql/jdbc/PgSQLXML.java:216
-#, java-format
-msgid "Unknown XML Result class: {0}"
-msgstr ""
-
-#: org/postgresql/jdbc/PgSQLXML.java:228
-#, fuzzy
-msgid "This SQLXML object has already been freed."
-msgstr "To PooledConnection zostało już zamknięte."
-
-#: org/postgresql/jdbc/PgSQLXML.java:237
-msgid ""
-"This SQLXML object has not been initialized, so you cannot retrieve data "
-"from it."
-msgstr ""
-
-#: org/postgresql/jdbc/PgSQLXML.java:250
-#, java-format
-msgid "Failed to convert binary xml data to encoding: {0}."
-msgstr ""
-
-#: org/postgresql/jdbc/PgSQLXML.java:276
-msgid "Unable to convert DOMResult SQLXML data to a string."
-msgstr ""
-
-#: org/postgresql/jdbc/PgSQLXML.java:290
-msgid ""
-"This SQLXML object has already been initialized, so you cannot manipulate it "
-"further."
-msgstr ""
-
-#: org/postgresql/jdbc/PgStatement.java:325
-msgid "Can''t use executeWithFlags(int) on a Statement."
-msgstr ""
-
-#: org/postgresql/jdbc/PgStatement.java:484
-msgid "Maximum number of rows must be a value grater than or equal to 0."
-msgstr "Maksymalna liczba rekordów musi być wartością dodatnią lub 0."
-
-#: org/postgresql/jdbc/PgStatement.java:525
-msgid "Query timeout must be a value greater than or equals to 0."
-msgstr "Timeout zapytania musi być wartością dodatnią lub 0."
-
-#: org/postgresql/jdbc/PgStatement.java:561
-msgid "The maximum field size must be a value greater than or equal to 0."
-msgstr "Maksymalny rozmiar pola musi być wartością dodatnią lub 0."
-
-#: org/postgresql/jdbc/PgStatement.java:871
-msgid "This statement has been closed."
-msgstr ""
-
-#: org/postgresql/jdbc/PgStatement.java:1148
-msgid ""
-"Returning autogenerated keys is only supported for 8.2 and later servers."
-msgstr ""
-
-#: org/postgresql/jdbc/PgStatement.java:1326
-#: org/postgresql/jdbc/PgStatement.java:1357
-msgid "Returning autogenerated keys by column index is not supported."
-msgstr ""
-
-#: org/postgresql/jdbc/PSQLSavepoint.java:40
-#: org/postgresql/jdbc/PSQLSavepoint.java:54
-#: org/postgresql/jdbc/PSQLSavepoint.java:72
-msgid "Cannot reference a savepoint after it has been released."
-msgstr ""
-
-#: org/postgresql/jdbc/PSQLSavepoint.java:45
-msgid "Cannot retrieve the id of a named savepoint."
-msgstr ""
-
-#: org/postgresql/jdbc/PSQLSavepoint.java:59
-msgid "Cannot retrieve the name of an unnamed savepoint."
-msgstr ""
-
-#: org/postgresql/jdbc/TimestampUtils.java:298
-#, fuzzy, java-format
-msgid "Bad value for type timestamp/date/time: {1}"
-msgstr "Zła wartość dla typu {0}: {1}"
-
-#: org/postgresql/jdbc/TimestampUtils.java:359
-msgid ""
-"Infinite value found for timestamp/date. This cannot be represented as time."
-msgstr ""
-
-#: org/postgresql/jdbc/TimestampUtils.java:674
-#: org/postgresql/jdbc/TimestampUtils.java:710
-#: org/postgresql/jdbc/TimestampUtils.java:757
-#, fuzzy, java-format
-msgid "Unsupported binary encoding of {0}."
-msgstr "Nieznana wartość Types: {0}"
-
-#: org/postgresql/largeobject/LargeObjectManager.java:147
-msgid "Failed to initialize LargeObject API"
-msgstr "Nie udało się zainicjować LargeObject API"
+"with an explicit Types value to specify the type to use."
+msgstr ""
-#: org/postgresql/largeobject/LargeObjectManager.java:265
-#: org/postgresql/largeobject/LargeObjectManager.java:308
-msgid "Large Objects may not be used in auto-commit mode."
+#: org/postgresql/jdbc/PgPreparedStatement.java:1133
+#: org/postgresql/jdbc/PgPreparedStatement.java:1233
+msgid "Unexpected error writing large object to database."
msgstr ""
-#: org/postgresql/osgi/PGDataSourceFactory.java:85
-#, fuzzy, java-format
-msgid "Unsupported properties: {0}"
-msgstr "Nieznana wartość Types: {0}"
+#: org/postgresql/jdbc/PgPreparedStatement.java:1178
+#: org/postgresql/jdbc/PgResultSet.java:1210
+msgid "Provided Reader failed."
+msgstr ""
-#: org/postgresql/PGProperty.java:450 org/postgresql/PGProperty.java:470
+#: org/postgresql/jdbc/BooleanTypeUtil.java:99
#, java-format
-msgid "{0} parameter value must be an integer but was: {1}"
+msgid "Cannot cast to boolean: \"{0}\""
msgstr ""
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:125
+#: org/postgresql/jdbc/PgResultSet.java:280
msgid ""
-"Could not find a java cryptographic algorithm: X.509 CertificateFactory not "
-"available."
+"Operation requires a scrollable ResultSet, but this ResultSet is "
+"FORWARD_ONLY."
msgstr ""
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:135
+#: org/postgresql/jdbc/PgResultSet.java:492
+#: org/postgresql/jdbc/PgResultSet.java:532
+#: org/postgresql/jdbc/PgResultSet.java:556
+#: org/postgresql/jdbc/PgResultSet.java:594
+#: org/postgresql/jdbc/PgResultSet.java:624
+#: org/postgresql/jdbc/PgResultSet.java:3008
+#: org/postgresql/jdbc/PgResultSet.java:3052
#, java-format
-msgid "Could not open SSL certificate file {0}."
+msgid "Cannot convert the column of type {0} to requested type {1}."
msgstr ""
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:140
-#, java-format
-msgid "Loading the SSL certificate {0} into a KeyManager failed."
+#: org/postgresql/jdbc/PgResultSet.java:838
+#: org/postgresql/jdbc/PgResultSet.java:859
+#: org/postgresql/jdbc/PgResultSet.java:1832
+msgid "Can''t use relative move methods while on the insert row."
msgstr ""
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:195
-msgid "Enter SSL password: "
-msgstr ""
+#: org/postgresql/jdbc/PgResultSet.java:889
+msgid "Cannot call cancelRowUpdates() when on the insert row."
+msgstr "Nie można wywołać cancelRowUpdates() na wstawianym rekordzie."
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:202
-msgid "Could not read password for SSL key file, console is not available."
+#: org/postgresql/jdbc/PgResultSet.java:905
+msgid "Cannot call deleteRow() when on the insert row."
+msgstr "Nie można wywołać deleteRow() na wstawianym rekordzie."
+
+#: org/postgresql/jdbc/PgResultSet.java:912
+msgid ""
+"Currently positioned before the start of the ResultSet. You cannot call "
+"deleteRow() here."
msgstr ""
+"Aktualna pozycja przed początkiem ResultSet. Nie można wywołać deleteRow()."
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:207
-#, java-format
-msgid "Could not read password for SSL key file by callbackhandler {0}."
+#: org/postgresql/jdbc/PgResultSet.java:918
+msgid ""
+"Currently positioned after the end of the ResultSet. You cannot call "
+"deleteRow() here."
+msgstr "Aktualna pozycja za końcem ResultSet. Nie można wywołać deleteRow()."
+
+#: org/postgresql/jdbc/PgResultSet.java:922
+msgid "There are no rows in this ResultSet."
+msgstr "Nie ma żadnych wierszy w tym ResultSet."
+
+#: org/postgresql/jdbc/PgResultSet.java:963
+msgid "Not on the insert row."
+msgstr "Nie na wstawianym rekordzie."
+
+#: org/postgresql/jdbc/PgResultSet.java:965
+msgid "You must specify at least one column value to insert a row."
msgstr ""
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:226
+#: org/postgresql/jdbc/PgResultSet.java:1119
+#: org/postgresql/jdbc/PgResultSet.java:1754
+#: org/postgresql/jdbc/PgResultSet.java:2416
+#: org/postgresql/jdbc/PgResultSet.java:2437
#, java-format
-msgid "Could not decrypt SSL key file {0}."
+msgid "The JVM claims not to support the encoding: {0}"
msgstr ""
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:240
-#, java-format
-msgid "Could not read SSL key file {0}."
+#: org/postgresql/jdbc/PgResultSet.java:1261
+msgid "Can''t refresh the insert row."
msgstr ""
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:243
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:162
-#, java-format
-msgid "Could not find a java cryptographic algorithm: {0}."
+#: org/postgresql/jdbc/PgResultSet.java:1328
+msgid "Cannot call updateRow() when on the insert row."
+msgstr "Nie można wywołać updateRow() na wstawianym rekordzie."
+
+#: org/postgresql/jdbc/PgResultSet.java:1335
+#: org/postgresql/jdbc/PgResultSet.java:3069
+msgid ""
+"Cannot update the ResultSet because it is either before the start or after "
+"the end of the results."
msgstr ""
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:90
-#, java-format
-msgid "The password callback class provided {0} could not be instantiated."
+#: org/postgresql/jdbc/PgResultSet.java:1535
+msgid "ResultSets with concurrency CONCUR_READ_ONLY cannot be updated."
msgstr ""
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:123
+#: org/postgresql/jdbc/PgResultSet.java:1603
#, java-format
-msgid "Could not open SSL root certificate file {0}."
+msgid "No primary key found for table {0}."
msgstr ""
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:139
+#: org/postgresql/jdbc/PgResultSet.java:2011
+#: org/postgresql/jdbc/PgResultSet.java:2016
+#: org/postgresql/jdbc/PgResultSet.java:2803
+#: org/postgresql/jdbc/PgResultSet.java:2809
+#: org/postgresql/jdbc/PgResultSet.java:2834
+#: org/postgresql/jdbc/PgResultSet.java:2840
+#: org/postgresql/jdbc/PgResultSet.java:2864
+#: org/postgresql/jdbc/PgResultSet.java:2869
+#: org/postgresql/jdbc/PgResultSet.java:2885
+#: org/postgresql/jdbc/PgResultSet.java:2906
+#: org/postgresql/jdbc/PgResultSet.java:2917
+#: org/postgresql/jdbc/PgResultSet.java:2930
+#: org/postgresql/jdbc/PgResultSet.java:3057
#, java-format
-msgid "Could not read SSL root certificate file {0}."
-msgstr ""
+msgid "Bad value for type {0} : {1}"
+msgstr "Zła wartość dla typu {0}: {1}"
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:143
+#: org/postgresql/jdbc/PgResultSet.java:2589
#, java-format
-msgid "Loading the SSL root certificate {0} into a TrustManager failed."
+msgid "The column name {0} was not found in this ResultSet."
msgstr ""
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:156
-msgid "Could not initialize SSL context."
+#: org/postgresql/jdbc/PgResultSet.java:2725
+msgid ""
+"ResultSet is not updateable. The query that generated this result set must "
+"select only one table, and must select all primary keys from that table. See "
+"the JDBC 2.1 API Specification, section 5.6 for more details."
msgstr ""
+"ResultSet nie jest modyfikowalny (not updateable). Zapytanie, które zwróciło "
+"ten wynik musi dotyczyć tylko jednej tabeli oraz musi pobierać wszystkie "
+"klucze główne tej tabeli. Zobacz Specyfikację JDBC 2.1 API, rozdział 5.6, by "
+"uzyskać więcej szczegółów."
-#: org/postgresql/ssl/MakeSSL.java:52
-#, java-format
-msgid "The SSLSocketFactory class provided {0} could not be instantiated."
-msgstr ""
+#: org/postgresql/jdbc/PgResultSet.java:2737
+msgid "This ResultSet is closed."
+msgstr "Ten ResultSet jest zamknięty."
-#: org/postgresql/ssl/MakeSSL.java:67
-#, java-format
-msgid "SSL error: {0}"
+#: org/postgresql/jdbc/PgResultSet.java:2768
+msgid "ResultSet not positioned properly, perhaps you need to call next."
+msgstr "Zła pozycja w ResultSet, może musisz wywołać next."
+
+#: org/postgresql/jdbc/PgResultSet.java:3089
+msgid "Invalid UUID data."
msgstr ""
-#: org/postgresql/ssl/MakeSSL.java:78
-#, java-format
-msgid "The HostnameVerifier class provided {0} could not be instantiated."
+#: org/postgresql/jdbc/PgResultSet.java:3178
+#: org/postgresql/jdbc/PgResultSet.java:3185
+#: org/postgresql/jdbc/PgResultSet.java:3196
+#: org/postgresql/jdbc/PgResultSet.java:3207
+#: org/postgresql/jdbc/PgResultSet.java:3218
+#: org/postgresql/jdbc/PgResultSet.java:3229
+#: org/postgresql/jdbc/PgResultSet.java:3240
+#: org/postgresql/jdbc/PgResultSet.java:3251
+#: org/postgresql/jdbc/PgResultSet.java:3262
+#: org/postgresql/jdbc/PgResultSet.java:3269
+#: org/postgresql/jdbc/PgResultSet.java:3276
+#: org/postgresql/jdbc/PgResultSet.java:3287
+#: org/postgresql/jdbc/PgResultSet.java:3304
+#: org/postgresql/jdbc/PgResultSet.java:3311
+#: org/postgresql/jdbc/PgResultSet.java:3318
+#: org/postgresql/jdbc/PgResultSet.java:3329
+#: org/postgresql/jdbc/PgResultSet.java:3336
+#: org/postgresql/jdbc/PgResultSet.java:3343
+#: org/postgresql/jdbc/PgResultSet.java:3381
+#: org/postgresql/jdbc/PgResultSet.java:3388
+#: org/postgresql/jdbc/PgResultSet.java:3395
+#: org/postgresql/jdbc/PgResultSet.java:3415
+#: org/postgresql/jdbc/PgResultSet.java:3428
+#, fuzzy, java-format
+msgid "conversion to {0} from {1} not supported"
+msgstr "Poziom izolacji transakcji {0} nie jest obsługiwany."
+
+#: org/postgresql/jdbc/TimestampUtils.java:355
+#: org/postgresql/jdbc/TimestampUtils.java:423
+#, fuzzy, java-format
+msgid "Bad value for type timestamp/date/time: {1}"
+msgstr "Zła wartość dla typu {0}: {1}"
+
+#: org/postgresql/jdbc/TimestampUtils.java:858
+#: org/postgresql/jdbc/TimestampUtils.java:915
+#: org/postgresql/jdbc/TimestampUtils.java:961
+#: org/postgresql/jdbc/TimestampUtils.java:1010
+#, fuzzy, java-format
+msgid "Unsupported binary encoding of {0}."
+msgstr "Nieznana wartość Types: {0}"
+
+#: org/postgresql/jdbc/PgCallableStatement.java:86
+#: org/postgresql/jdbc/PgCallableStatement.java:96
+msgid "A CallableStatement was executed with nothing returned."
msgstr ""
-#: org/postgresql/ssl/MakeSSL.java:84
-#, java-format
-msgid "The hostname {0} could not be verified by hostnameverifier {1}."
+#: org/postgresql/jdbc/PgCallableStatement.java:107
+msgid "A CallableStatement was executed with an invalid number of parameters"
msgstr ""
-#: org/postgresql/ssl/MakeSSL.java:93
+#: org/postgresql/jdbc/PgCallableStatement.java:145
#, java-format
-msgid "The hostname {0} could not be verified."
+msgid ""
+"A CallableStatement function was executed and the out parameter {0} was of "
+"type {1} however type {2} was registered."
msgstr ""
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:167
-msgid "The sslfactoryarg property may not be empty."
+#: org/postgresql/jdbc/PgCallableStatement.java:202
+msgid ""
+"This statement does not declare an OUT parameter. Use '{' ?= call ... '}' "
+"to declare one."
msgstr ""
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:183
-msgid ""
-"The environment variable containing the server's SSL certificate must not be "
-"empty."
+#: org/postgresql/jdbc/PgCallableStatement.java:246
+msgid "wasNull cannot be call before fetching a result."
msgstr ""
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:191
+#: org/postgresql/jdbc/PgCallableStatement.java:384
+#: org/postgresql/jdbc/PgCallableStatement.java:403
+#, java-format
msgid ""
-"The system property containing the server's SSL certificate must not be "
-"empty."
+"Parameter of type {0} was registered, but call to get{1} (sqltype={2}) was "
+"made."
msgstr ""
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:198
+#: org/postgresql/jdbc/PgCallableStatement.java:424
msgid ""
-"The sslfactoryarg property must start with the prefix file:, classpath:, "
-"env:, sys:, or -----BEGIN CERTIFICATE-----."
+"A CallableStatement was declared, but no call to registerOutParameter(1, "
+"<some type>) was made."
msgstr ""
+"Funkcja CallableStatement została zadeklarowana, ale nie wywołano "
+"registerOutParameter (1, <jakiś typ>)."
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:210
-#, fuzzy
-msgid "An error occurred reading the certificate"
-msgstr "Wystąpił błąd podczas ustanawiania połączenia SSL."
-
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:243
-msgid "No X509TrustManager found"
+#: org/postgresql/jdbc/PgCallableStatement.java:430
+msgid "No function outputs were registered."
msgstr ""
-#: org/postgresql/util/PGInterval.java:155
-msgid "Conversion of interval failed"
-msgstr "Konwersja typu interval nie powiodła się"
+#: org/postgresql/jdbc/PgCallableStatement.java:436
+msgid ""
+"Results cannot be retrieved from a CallableStatement before it is executed."
+msgstr ""
-#: org/postgresql/util/PGmoney.java:65
-msgid "Conversion of money failed."
-msgstr "Konwersja typu money nie powiodła się."
+#: org/postgresql/jdbc/PgCallableStatement.java:703
+#, fuzzy, java-format
+msgid "Unsupported type conversion to {1}."
+msgstr "Nieznana wartość Types: {0}"
-#: org/postgresql/util/ServerErrorMessage.java:165
+#: org/postgresql/jdbc/EscapedFunctions.java:240
#, java-format
-msgid "Detail: {0}"
-msgstr "Szczegóły: {0}"
+msgid "{0} function takes four and only four argument."
+msgstr ""
-#: org/postgresql/util/ServerErrorMessage.java:170
+#: org/postgresql/jdbc/EscapedFunctions.java:270
+#: org/postgresql/jdbc/EscapedFunctions.java:344
+#: org/postgresql/jdbc/EscapedFunctions.java:749
+#: org/postgresql/jdbc/EscapedFunctions.java:787
#, java-format
-msgid "Hint: {0}"
-msgstr "Wskazówka: {0}"
+msgid "{0} function takes two and only two arguments."
+msgstr ""
-#: org/postgresql/util/ServerErrorMessage.java:174
+#: org/postgresql/jdbc/EscapedFunctions.java:288
+#: org/postgresql/jdbc/EscapedFunctions.java:326
+#: org/postgresql/jdbc/EscapedFunctions.java:446
+#: org/postgresql/jdbc/EscapedFunctions.java:461
+#: org/postgresql/jdbc/EscapedFunctions.java:476
+#: org/postgresql/jdbc/EscapedFunctions.java:491
+#: org/postgresql/jdbc/EscapedFunctions.java:506
+#: org/postgresql/jdbc/EscapedFunctions.java:521
+#: org/postgresql/jdbc/EscapedFunctions.java:536
+#: org/postgresql/jdbc/EscapedFunctions.java:551
+#: org/postgresql/jdbc/EscapedFunctions.java:566
+#: org/postgresql/jdbc/EscapedFunctions.java:581
+#: org/postgresql/jdbc/EscapedFunctions.java:596
+#: org/postgresql/jdbc/EscapedFunctions.java:611
+#: org/postgresql/jdbc/EscapedFunctions.java:775
#, java-format
-msgid "Position: {0}"
-msgstr "Pozycja: {0}"
+msgid "{0} function takes one and only one argument."
+msgstr ""
-#: org/postgresql/util/ServerErrorMessage.java:178
+#: org/postgresql/jdbc/EscapedFunctions.java:310
+#: org/postgresql/jdbc/EscapedFunctions.java:391
#, java-format
-msgid "Where: {0}"
-msgstr "Gdzie: {0}"
+msgid "{0} function takes two or three arguments."
+msgstr ""
-#: org/postgresql/util/ServerErrorMessage.java:184
+#: org/postgresql/jdbc/EscapedFunctions.java:416
+#: org/postgresql/jdbc/EscapedFunctions.java:431
+#: org/postgresql/jdbc/EscapedFunctions.java:734
+#: org/postgresql/jdbc/EscapedFunctions.java:764
#, java-format
-msgid "Internal Query: {0}"
-msgstr "Wewnętrzne Zapytanie: {0}"
+msgid "{0} function doesn''t take any argument."
+msgstr ""
-#: org/postgresql/util/ServerErrorMessage.java:188
+#: org/postgresql/jdbc/EscapedFunctions.java:627
+#: org/postgresql/jdbc/EscapedFunctions.java:680
#, java-format
-msgid "Internal Position: {0}"
-msgstr "Wewnętrzna Pozycja: {0}"
+msgid "{0} function takes three and only three arguments."
+msgstr ""
-#: org/postgresql/util/ServerErrorMessage.java:195
-#, java-format
-msgid "Location: File: {0}, Routine: {1}, Line: {2}"
-msgstr "Lokalizacja: Plik: {0}, Procedura: {1}, Linia: {2}"
+#: org/postgresql/jdbc/EscapedFunctions.java:640
+#: org/postgresql/jdbc/EscapedFunctions.java:661
+#: org/postgresql/jdbc/EscapedFunctions.java:664
+#: org/postgresql/jdbc/EscapedFunctions.java:697
+#: org/postgresql/jdbc/EscapedFunctions.java:710
+#: org/postgresql/jdbc/EscapedFunctions.java:713
+#, fuzzy, java-format
+msgid "Interval {0} not yet implemented"
+msgstr "Metoda {0}nie jest jeszcze obsługiwana."
-#: org/postgresql/util/ServerErrorMessage.java:200
+#: org/postgresql/PGProperty.java:535 org/postgresql/PGProperty.java:555
#, java-format
-msgid "Server SQLState: {0}"
-msgstr "Serwer SQLState: {0}"
-
-#: org/postgresql/xa/PGXAConnection.java:148
-msgid ""
-"Transaction control methods setAutoCommit(true), commit, rollback and "
-"setSavePoint not allowed while an XA transaction is active."
-msgstr ""
-
-#: org/postgresql/xa/PGXAConnection.java:196
-#: org/postgresql/xa/PGXAConnection.java:265
-msgid "Invalid flags"
+msgid "{0} parameter value must be an integer but was: {1}"
msgstr ""
-#: org/postgresql/xa/PGXAConnection.java:200
-#: org/postgresql/xa/PGXAConnection.java:269
-#: org/postgresql/xa/PGXAConnection.java:437
-msgid "xid must not be null"
-msgstr ""
+#: org/postgresql/largeobject/LargeObjectManager.java:144
+msgid "Failed to initialize LargeObject API"
+msgstr "Nie udało się zainicjować LargeObject API"
-#: org/postgresql/xa/PGXAConnection.java:204
-msgid "Connection is busy with another transaction"
+#: org/postgresql/largeobject/LargeObjectManager.java:262
+#: org/postgresql/largeobject/LargeObjectManager.java:305
+msgid "Large Objects may not be used in auto-commit mode."
msgstr ""
-#: org/postgresql/xa/PGXAConnection.java:213
-#: org/postgresql/xa/PGXAConnection.java:279
-msgid "suspend/resume not implemented"
+#: org/postgresql/copy/PGCopyInputStream.java:51
+#, java-format
+msgid "Copying from database failed: {0}"
msgstr ""
-#: org/postgresql/xa/PGXAConnection.java:219
-#: org/postgresql/xa/PGXAConnection.java:224
-#: org/postgresql/xa/PGXAConnection.java:228
+#: org/postgresql/copy/PGCopyInputStream.java:67
+#: org/postgresql/copy/PGCopyOutputStream.java:94
#, fuzzy
-msgid "Transaction interleaving not implemented"
-msgstr "Poziom izolacji transakcji {0} nie jest obsługiwany."
+msgid "This copy stream is closed."
+msgstr "Ten ResultSet jest zamknięty."
-#: org/postgresql/xa/PGXAConnection.java:239
-msgid "Error disabling autocommit"
+#: org/postgresql/copy/PGCopyInputStream.java:110
+msgid "Read from copy failed."
msgstr ""
-#: org/postgresql/xa/PGXAConnection.java:273
-msgid "tried to call end without corresponding start call"
+#: org/postgresql/copy/CopyManager.java:53
+#, java-format
+msgid "Requested CopyIn but got {0}"
msgstr ""
-#: org/postgresql/xa/PGXAConnection.java:305
-msgid ""
-"Not implemented: Prepare must be issued using the same connection that "
-"started the transaction"
+#: org/postgresql/copy/CopyManager.java:64
+#, java-format
+msgid "Requested CopyOut but got {0}"
msgstr ""
-#: org/postgresql/xa/PGXAConnection.java:309
-msgid "Prepare called before end"
+#: org/postgresql/copy/CopyManager.java:75
+#, java-format
+msgid "Requested CopyDual but got {0}"
msgstr ""
-#: org/postgresql/xa/PGXAConnection.java:317
-msgid "Server versions prior to 8.1 do not support two-phase commit."
+#: org/postgresql/copy/PGCopyOutputStream.java:71
+#, java-format
+msgid "Cannot write to copy a byte of value {0}"
msgstr ""
-#: org/postgresql/xa/PGXAConnection.java:334
-msgid "Error preparing transaction"
+#: org/postgresql/fastpath/Fastpath.java:80
+#, fuzzy, java-format
+msgid "Fastpath call {0} - No result was returned and we expected a numeric."
msgstr ""
+"Wywołanie fastpath {0} - Nie otrzymano żadnego wyniku, a oczekiwano liczby "
+"całkowitej."
-#: org/postgresql/xa/PGXAConnection.java:349
-msgid "Invalid flag"
+#: org/postgresql/fastpath/Fastpath.java:157
+#, java-format
+msgid "Fastpath call {0} - No result was returned and we expected an integer."
msgstr ""
+"Wywołanie fastpath {0} - Nie otrzymano żadnego wyniku, a oczekiwano liczby "
+"całkowitej."
-#: org/postgresql/xa/PGXAConnection.java:384
-msgid "Error during recover"
+#: org/postgresql/fastpath/Fastpath.java:165
+#, fuzzy, java-format
+msgid ""
+"Fastpath call {0} - No result was returned or wrong size while expecting an "
+"integer."
msgstr ""
+"Wywołanie fastpath {0} - Nie otrzymano żadnego wyniku, a oczekiwano liczby "
+"całkowitej."
-#: org/postgresql/xa/PGXAConnection.java:423
-#: org/postgresql/xa/PGXAConnection.java:426
-msgid "Error rolling back prepared transaction"
+#: org/postgresql/fastpath/Fastpath.java:182
+#, fuzzy, java-format
+msgid "Fastpath call {0} - No result was returned and we expected a long."
msgstr ""
+"Wywołanie fastpath {0} - Nie otrzymano żadnego wyniku, a oczekiwano liczby "
+"całkowitej."
-#: org/postgresql/xa/PGXAConnection.java:464
+#: org/postgresql/fastpath/Fastpath.java:190
+#, fuzzy, java-format
msgid ""
-"Not implemented: one-phase commit must be issued using the same connection "
-"that was used to start it"
+"Fastpath call {0} - No result was returned or wrong size while expecting a "
+"long."
msgstr ""
+"Wywołanie fastpath {0} - Nie otrzymano żadnego wyniku, a oczekiwano liczby "
+"całkowitej."
-#: org/postgresql/xa/PGXAConnection.java:468
-msgid "commit called before end"
-msgstr ""
+#: org/postgresql/fastpath/Fastpath.java:302
+#, java-format
+msgid "The fastpath function {0} is unknown."
+msgstr "Funkcja fastpath {0} jest nieznana."
-#: org/postgresql/xa/PGXAConnection.java:478
-msgid "Error during one-phase commit"
-msgstr ""
+#~ msgid ""
+#~ "Connection refused. Check that the hostname and port are correct and that "
+#~ "the postmaster is accepting TCP/IP connections."
+#~ msgstr ""
+#~ "Połączenie odrzucone. Sprawdź, czy prawidłowo ustawiłeś nazwę hosta oraz "
+#~ "port i upewnij się, czy postmaster przyjmuje połączenia TCP/IP."
-#: org/postgresql/xa/PGXAConnection.java:497
-msgid ""
-"Not implemented: 2nd phase commit must be issued using an idle connection"
-msgstr ""
+#, fuzzy
+#~ msgid "The connection url is invalid."
+#~ msgstr "Próba nawiązania połączenia nie powiodła się."
-#: org/postgresql/xa/PGXAConnection.java:513
-msgid "Error committing prepared transaction"
-msgstr ""
+#~ msgid "Connection rejected: {0}."
+#~ msgstr "Połączenie odrzucone: {0}."
-#: org/postgresql/xa/PGXAConnection.java:529
-msgid "Heuristic commit/rollback not supported"
-msgstr ""
+#~ msgid "Backend start-up failed: {0}."
+#~ msgstr "Start serwera się nie powiódł: {0}."
#~ msgid "The class {0} does not implement org.postgresql.util.PGobject."
#~ msgstr "Klasa {0} nie implementuje org.postgresql.util.PGobject."
diff --git a/pgjdbc/src/main/java/org/postgresql/translation/pt_BR.po b/pgjdbc/src/main/java/org/postgresql/translation/pt_BR.po
index 534f8bb..3e4c66a 100644
--- a/pgjdbc/src/main/java/org/postgresql/translation/pt_BR.po
+++ b/pgjdbc/src/main/java/org/postgresql/translation/pt_BR.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PostgreSQL 8.4\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-01-07 13:37+0300\n"
+"POT-Creation-Date: 2018-03-10 23:24+0300\n"
"PO-Revision-Date: 2004-10-31 20:48-0300\n"
"Last-Translator: Euler Taveira de Oliveira <euler at timbira.com>\n"
"Language-Team: Brazilian Portuguese <pgbr-dev at listas.postgresql.org.br>\n"
@@ -17,399 +17,389 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-#: org/postgresql/copy/CopyManager.java:57
-#, java-format
-msgid "Requested CopyIn but got {0}"
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:164
+msgid "The sslfactoryarg property may not be empty."
msgstr ""
-#: org/postgresql/copy/CopyManager.java:69
-#, java-format
-msgid "Requested CopyOut but got {0}"
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:180
+msgid ""
+"The environment variable containing the server's SSL certificate must not be "
+"empty."
msgstr ""
-#: org/postgresql/copy/PGCopyInputStream.java:54
-#, java-format
-msgid "Copying from database failed: {0}"
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:188
+msgid ""
+"The system property containing the server's SSL certificate must not be "
+"empty."
+msgstr ""
+
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:195
+msgid ""
+"The sslfactoryarg property must start with the prefix file:, classpath:, "
+"env:, sys:, or -----BEGIN CERTIFICATE-----."
msgstr ""
-#: org/postgresql/copy/PGCopyInputStream.java:70
-#: org/postgresql/copy/PGCopyOutputStream.java:97
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:207
#, fuzzy
-msgid "This copy stream is closed."
-msgstr "Este ResultSet está fechado."
+msgid "An error occurred reading the certificate"
+msgstr "Um erro ocorreu ao estabelecer uma conexão SSL."
-#: org/postgresql/copy/PGCopyInputStream.java:113
-msgid "Read from copy failed."
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:240
+msgid "No X509TrustManager found"
msgstr ""
-#: org/postgresql/copy/PGCopyOutputStream.java:74
-#, java-format
-msgid "Cannot write to copy a byte of value {0}"
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:133
+msgid ""
+"Could not find a java cryptographic algorithm: X.509 CertificateFactory not "
+"available."
msgstr ""
-#: org/postgresql/core/ConnectionFactory.java:74
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:143
#, java-format
-msgid "A connection could not be made using the requested protocol {0}."
-msgstr "A conexão não pode ser feita usando protocolo informado {0}."
+msgid "Could not open SSL certificate file {0}."
+msgstr ""
-#: org/postgresql/core/Oid.java:114
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:148
#, java-format
-msgid "oid type {0} not known and not a number"
+msgid "Loading the SSL certificate {0} into a KeyManager failed."
msgstr ""
-#: org/postgresql/core/Parser.java:616
-#, java-format
-msgid "Malformed function or procedure escape syntax at offset {0}."
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:205
+msgid "Enter SSL password: "
msgstr ""
-"Sintaxe de escape mal formada da função ou do procedimento no deslocamento "
-"{0}."
-#: org/postgresql/core/PGStream.java:497
-#, java-format
-msgid "Premature end of input stream, expected {0} bytes, but only read {1}."
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:212
+msgid "Could not read password for SSL key file, console is not available."
msgstr ""
-"Fim de entrada prematuro, eram esperados {0} bytes, mas somente {1} foram "
-"lidos."
-#: org/postgresql/core/PGStream.java:538
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:217
#, java-format
-msgid "Expected an EOF from server, got: {0}"
-msgstr "Esperado um EOF do servidor, recebido: {0}"
-
-#: org/postgresql/core/SetupQueryRunner.java:90
-msgid "An unexpected result was returned by a query."
-msgstr "Um resultado inesperado foi retornado pela consulta."
+msgid "Could not read password for SSL key file by callbackhandler {0}."
+msgstr ""
-#: org/postgresql/core/UTF8Encoding.java:31
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:236
#, java-format
-msgid ""
-"Illegal UTF-8 sequence: byte {0} of {1} byte sequence is not 10xxxxxx: {2}"
+msgid "Could not decrypt SSL key file {0}."
msgstr ""
-"Sequência UTF-8 ilegal: byte {0} da sequência de bytes {1} não é 10xxxxxx: "
-"{2}"
-#: org/postgresql/core/UTF8Encoding.java:69
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:250
#, java-format
-msgid "Illegal UTF-8 sequence: {0} bytes used to encode a {1} byte value: {2}"
+msgid "Could not read SSL key file {0}."
msgstr ""
-"Sequência UTF-8 ilegal: {0} bytes utilizados para codificar um valor de {1} "
-"bytes: {2}"
-#: org/postgresql/core/UTF8Encoding.java:104
-#: org/postgresql/core/UTF8Encoding.java:131
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:253
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:176
#, java-format
-msgid "Illegal UTF-8 sequence: initial byte is {0}: {1}"
-msgstr "Sequência UTF-8 ilegal: byte inicial é {0}: {1}"
+msgid "Could not find a java cryptographic algorithm: {0}."
+msgstr ""
+
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:99
+#, fuzzy, java-format
+msgid "The password callback class provided {0} could not be instantiated."
+msgstr "A classe SSLSocketFactory forneceu {0} que não pôde ser instanciado."
-#: org/postgresql/core/UTF8Encoding.java:137
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:132
#, java-format
-msgid "Illegal UTF-8 sequence: final value is out of range: {0}"
-msgstr "Sequência UTF-8 ilegal: valor final está fora do intervalo: {0}"
+msgid "Could not open SSL root certificate file {0}."
+msgstr ""
-#: org/postgresql/core/UTF8Encoding.java:153
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:147
#, java-format
-msgid "Illegal UTF-8 sequence: final value is a surrogate value: {0}"
-msgstr "Sequência UTF-8 ilegal: valor final é um valor suplementar: {0}"
+msgid "Could not read SSL root certificate file {0}."
+msgstr ""
-#: org/postgresql/core/Utils.java:119 org/postgresql/core/Utils.java:136
-msgid "Zero bytes may not occur in string parameters."
-msgstr "Zero bytes não podem ocorrer em parâmetros de cadeia de caracteres."
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:151
+#, java-format
+msgid "Loading the SSL root certificate {0} into a TrustManager failed."
+msgstr ""
-#: org/postgresql/core/Utils.java:146 org/postgresql/core/Utils.java:217
-msgid "No IOException expected from StringBuffer or StringBuilder"
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:170
+msgid "Could not initialize SSL context."
msgstr ""
-#: org/postgresql/core/Utils.java:206
-msgid "Zero bytes may not occur in identifiers."
-msgstr "Zero bytes não podem ocorrer em identificadores."
+#: org/postgresql/ssl/MakeSSL.java:52
+#, java-format
+msgid "The SSLSocketFactory class provided {0} could not be instantiated."
+msgstr "A classe SSLSocketFactory forneceu {0} que não pôde ser instanciado."
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:72
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:87
-#, fuzzy, java-format
-msgid "Invalid sslmode value: {0}"
-msgstr "Tamanho de dado {0} é inválido."
+#: org/postgresql/ssl/MakeSSL.java:67
+#, java-format
+msgid "SSL error: {0}"
+msgstr ""
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:87
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:111
+#: org/postgresql/ssl/MakeSSL.java:78
#, fuzzy, java-format
-msgid "Invalid targetServerType value: {0}"
-msgstr "Tamanho de dado {0} é inválido."
+msgid "The HostnameVerifier class provided {0} could not be instantiated."
+msgstr "A classe SSLSocketFactory forneceu {0} que não pôde ser instanciado."
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:152
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:228
+#: org/postgresql/ssl/MakeSSL.java:84
#, java-format
-msgid "Could not find a server with specified targetServerType: {0}"
+msgid "The hostname {0} could not be verified by hostnameverifier {1}."
msgstr ""
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:172
-msgid ""
-"Connection refused. Check that the hostname and port are correct and that "
-"the postmaster is accepting TCP/IP connections."
+#: org/postgresql/ssl/MakeSSL.java:93
+#, java-format
+msgid "The hostname {0} could not be verified."
msgstr ""
-"Conexão negada. Verifique se o nome da máquina e a porta estão corretos e se "
-"o postmaster está aceitando conexões TCP/IP."
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:181
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:262
-msgid "The connection attempt failed."
-msgstr "A tentativa de conexão falhou."
+#: org/postgresql/gss/GssAction.java:126
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2550
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2581
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2585
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2640
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2650
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2659
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:655
+msgid "Protocol error. Session setup failed."
+msgstr "Erro de Protocolo. Configuração da sessão falhou."
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:192
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:273
-#, fuzzy
-msgid "The connection url is invalid."
-msgstr "A tentativa de conexão falhou."
+#: org/postgresql/gss/GssAction.java:137 org/postgresql/gss/MakeGSS.java:66
+#: org/postgresql/gss/MakeGSS.java:74
+msgid "GSS Authentication failed"
+msgstr "Autenticação GSS falhou"
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:218
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:233
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:324
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:339
-msgid "The server does not support SSL."
-msgstr "O servidor não suporta SSL."
+#: org/postgresql/core/Parser.java:933
+#, java-format
+msgid "Malformed function or procedure escape syntax at offset {0}."
+msgstr ""
+"Sintaxe de escape mal formada da função ou do procedimento no deslocamento "
+"{0}."
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:249
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:355
-msgid "An error occurred while setting up the SSL connection."
-msgstr "Um erro ocorreu ao estabelecer uma conexão SSL."
+#: org/postgresql/core/SocketFactoryFactory.java:41
+#, fuzzy, java-format
+msgid "The SocketFactory class provided {0} could not be instantiated."
+msgstr "A classe SSLSocketFactory forneceu {0} que não pôde ser instanciado."
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:300
-#, java-format
-msgid "Connection rejected: {0}."
-msgstr "Conexão negada: {0}."
+#: org/postgresql/core/Utils.java:93 org/postgresql/core/Utils.java:110
+msgid "Zero bytes may not occur in string parameters."
+msgstr "Zero bytes não podem ocorrer em parâmetros de cadeia de caracteres."
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:321
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:349
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:375
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:456
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:486
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:515
-msgid ""
-"The server requested password-based authentication, but no password was "
-"provided."
+#: org/postgresql/core/Utils.java:120 org/postgresql/core/Utils.java:170
+msgid "No IOException expected from StringBuffer or StringBuilder"
msgstr ""
-"O servidor pediu autenticação baseada em senha, mas nenhuma senha foi "
-"fornecida."
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:405
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:625
+#: org/postgresql/core/Utils.java:159
+msgid "Zero bytes may not occur in identifiers."
+msgstr "Zero bytes não podem ocorrer em identificadores."
+
+#: org/postgresql/core/UTF8Encoding.java:28
#, java-format
msgid ""
-"The authentication type {0} is not supported. Check that you have configured "
-"the pg_hba.conf file to include the client''s IP address or subnet, and that "
-"it is using an authentication scheme supported by the driver."
+"Illegal UTF-8 sequence: byte {0} of {1} byte sequence is not 10xxxxxx: {2}"
msgstr ""
-"O tipo de autenticação {0} não é suportado. Verifique se você configurou o "
-"arquivo pg_hba.conf incluindo a subrede ou endereço IP do cliente, e se está "
-"utilizando o esquema de autenticação suportado pelo driver."
-
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:412
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:455
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:632
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:688
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:744
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:754
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:763
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:774
-#: org/postgresql/gss/GssAction.java:130
-msgid "Protocol error. Session setup failed."
-msgstr "Erro de Protocolo. Configuração da sessão falhou."
+"Sequência UTF-8 ilegal: byte {0} da sequência de bytes {1} não é 10xxxxxx: "
+"{2}"
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:443
-#, java-format
-msgid "Backend start-up failed: {0}."
-msgstr "Inicialização do processo servidor falhou: {0}."
-
-#: org/postgresql/core/v2/FastpathParameterList.java:63
-#: org/postgresql/core/v2/FastpathParameterList.java:89
-#: org/postgresql/core/v2/FastpathParameterList.java:100
-#: org/postgresql/core/v2/FastpathParameterList.java:111
-#: org/postgresql/core/v2/SimpleParameterList.java:70
-#: org/postgresql/core/v2/SimpleParameterList.java:94
-#: org/postgresql/core/v2/SimpleParameterList.java:105
-#: org/postgresql/core/v2/SimpleParameterList.java:116
-#: org/postgresql/core/v2/SimpleParameterList.java:127
-#: org/postgresql/core/v3/CompositeParameterList.java:36
-#: org/postgresql/core/v3/SimpleParameterList.java:53
-#: org/postgresql/core/v3/SimpleParameterList.java:64
-#: org/postgresql/jdbc/PgResultSet.java:2715
-#: org/postgresql/jdbc/PgResultSetMetaData.java:472
+#: org/postgresql/core/UTF8Encoding.java:66
#, java-format
-msgid "The column index is out of range: {0}, number of columns: {1}."
+msgid "Illegal UTF-8 sequence: {0} bytes used to encode a {1} byte value: {2}"
msgstr ""
-"O índice da coluna está fora do intervalo: {0}, número de colunas: {1}."
-
-#: org/postgresql/core/v2/FastpathParameterList.java:164
-#: org/postgresql/core/v2/SimpleParameterList.java:191
-#: org/postgresql/core/v3/SimpleParameterList.java:225
-#, java-format
-msgid "No value specified for parameter {0}."
-msgstr "Nenhum valor especificado para parâmetro {0}."
+"Sequência UTF-8 ilegal: {0} bytes utilizados para codificar um valor de {1} "
+"bytes: {2}"
-#: org/postgresql/core/v2/QueryExecutorImpl.java:87
-#: org/postgresql/core/v2/QueryExecutorImpl.java:347
-#: org/postgresql/core/v3/QueryExecutorImpl.java:404
-#: org/postgresql/core/v3/QueryExecutorImpl.java:465
+#: org/postgresql/core/UTF8Encoding.java:102
+#: org/postgresql/core/UTF8Encoding.java:129
#, java-format
-msgid "Expected command status BEGIN, got {0}."
-msgstr "Status do comando BEGIN esperado, recebeu {0}."
+msgid "Illegal UTF-8 sequence: initial byte is {0}: {1}"
+msgstr "Sequência UTF-8 ilegal: byte inicial é {0}: {1}"
-#: org/postgresql/core/v2/QueryExecutorImpl.java:92
-#: org/postgresql/core/v3/QueryExecutorImpl.java:470
-#: org/postgresql/jdbc/PgResultSet.java:1731
+#: org/postgresql/core/UTF8Encoding.java:135
#, java-format
-msgid "Unexpected command status: {0}."
-msgstr "Status do comando inesperado: {0}."
-
-#: org/postgresql/core/v2/QueryExecutorImpl.java:127
-#: org/postgresql/core/v2/QueryExecutorImpl.java:136
-#: org/postgresql/core/v2/QueryExecutorImpl.java:185
-#: org/postgresql/core/v2/QueryExecutorImpl.java:376
-#: org/postgresql/core/v3/QueryExecutorImpl.java:226
-#: org/postgresql/core/v3/QueryExecutorImpl.java:364
-#: org/postgresql/core/v3/QueryExecutorImpl.java:441
-#: org/postgresql/core/v3/QueryExecutorImpl.java:505
-#: org/postgresql/core/v3/QueryExecutorImpl.java:587
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2211
-#: org/postgresql/util/StreamWrapper.java:133
-#, fuzzy
-msgid "An I/O error occurred while sending to the backend."
-msgstr "Um erro de E/S ocorreu ao enviar para o processo servidor."
+msgid "Illegal UTF-8 sequence: final value is out of range: {0}"
+msgstr "Sequência UTF-8 ilegal: valor final está fora do intervalo: {0}"
-#: org/postgresql/core/v2/QueryExecutorImpl.java:180
-#: org/postgresql/core/v2/QueryExecutorImpl.java:235
-#: org/postgresql/core/v2/QueryExecutorImpl.java:249
-#: org/postgresql/core/v3/QueryExecutorImpl.java:582
-#: org/postgresql/core/v3/QueryExecutorImpl.java:642
+#: org/postgresql/core/UTF8Encoding.java:151
#, java-format
-msgid "Unknown Response Type {0}."
-msgstr "Tipo de Resposta Desconhecido {0}."
+msgid "Illegal UTF-8 sequence: final value is a surrogate value: {0}"
+msgstr "Sequência UTF-8 ilegal: valor final é um valor suplementar: {0}"
-#: org/postgresql/core/v2/QueryExecutorImpl.java:453
-#: org/postgresql/core/v2/QueryExecutorImpl.java:503
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1962
-msgid "Ran out of memory retrieving query results."
-msgstr "Memória insuficiente ao recuperar resultados da consulta."
+#: org/postgresql/core/SetupQueryRunner.java:64
+msgid "An unexpected result was returned by a query."
+msgstr "Um resultado inesperado foi retornado pela consulta."
-#: org/postgresql/core/v2/QueryExecutorImpl.java:640
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2328
+#: org/postgresql/core/PGStream.java:486
#, java-format
-msgid "Unable to interpret the update count in command completion tag: {0}."
-msgstr ""
-"Não foi possível interpretar o contador de atualização na marcação de "
-"comando completo: {0}."
-
-#: org/postgresql/core/v2/QueryExecutorImpl.java:654
-msgid "Copy not implemented for protocol version 2"
+msgid "Premature end of input stream, expected {0} bytes, but only read {1}."
msgstr ""
+"Fim de entrada prematuro, eram esperados {0} bytes, mas somente {1} foram "
+"lidos."
-#: org/postgresql/core/v2/SocketFactoryFactory.java:36
-#, fuzzy, java-format
-msgid "The SocketFactory class provided {0} could not be instantiated."
-msgstr "A classe SSLSocketFactory forneceu {0} que não pôde ser instanciado."
+#: org/postgresql/core/PGStream.java:528
+#, java-format
+msgid "Expected an EOF from server, got: {0}"
+msgstr "Esperado um EOF do servidor, recebido: {0}"
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:253
-#, fuzzy, java-format
-msgid ""
-"Connection to {0} refused. Check that the hostname and port are correct and "
-"that the postmaster is accepting TCP/IP connections."
+#: org/postgresql/core/v3/CopyOperationImpl.java:54
+msgid "CommandComplete expected COPY but got: "
msgstr ""
-"Conexão negada. Verifique se o nome da máquina e a porta estão corretos e se "
-"o postmaster está aceitando conexões TCP/IP."
-#: org/postgresql/core/v3/CopyOperationImpl.java:57
-msgid "CommandComplete expected COPY but got: "
+#: org/postgresql/core/v3/CopyInImpl.java:47
+msgid "CopyIn copy direction can't receive data"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:83
+#: org/postgresql/core/v3/QueryExecutorImpl.java:161
msgid "Tried to obtain lock while already holding it"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:98
+#: org/postgresql/core/v3/QueryExecutorImpl.java:177
msgid "Tried to break lock on database connection"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:115
+#: org/postgresql/core/v3/QueryExecutorImpl.java:195
#, fuzzy
msgid "Interrupted while waiting to obtain lock on database connection"
msgstr "Interrompido ao tentar se conectar."
-#: org/postgresql/core/v3/QueryExecutorImpl.java:220
+#: org/postgresql/core/v3/QueryExecutorImpl.java:327
msgid "Unable to bind parameter values for statement."
msgstr "Não foi possível ligar valores de parâmetro ao comando."
-#: org/postgresql/core/v3/QueryExecutorImpl.java:689
+#: org/postgresql/core/v3/QueryExecutorImpl.java:333
+#: org/postgresql/core/v3/QueryExecutorImpl.java:485
+#: org/postgresql/core/v3/QueryExecutorImpl.java:559
+#: org/postgresql/core/v3/QueryExecutorImpl.java:602
+#: org/postgresql/core/v3/QueryExecutorImpl.java:729
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2372
+#: org/postgresql/util/StreamWrapper.java:130
+#, fuzzy
+msgid "An I/O error occurred while sending to the backend."
+msgstr "Um erro de E/S ocorreu ao enviar para o processo servidor."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:534
+#: org/postgresql/core/v3/QueryExecutorImpl.java:576
+#, java-format
+msgid "Expected command status BEGIN, got {0}."
+msgstr "Status do comando BEGIN esperado, recebeu {0}."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:581
+#: org/postgresql/jdbc/PgResultSet.java:1778
+#, java-format
+msgid "Unexpected command status: {0}."
+msgstr "Status do comando inesperado: {0}."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:687
+#, fuzzy
+msgid "An error occurred while trying to get the socket timeout."
+msgstr "Um erro de E/S ocorreu ao enviar para o processo servidor."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:722
+#: org/postgresql/core/v3/QueryExecutorImpl.java:798
+#, java-format
+msgid "Unknown Response Type {0}."
+msgstr "Tipo de Resposta Desconhecido {0}."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:745
+#, fuzzy
+msgid "An error occurred while trying to reset the socket timeout."
+msgstr "Um erro de E/S ocorreu ao enviar para o processo servidor."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:843
msgid "Database connection failed when starting copy"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:724
+#: org/postgresql/core/v3/QueryExecutorImpl.java:878
msgid "Tried to cancel an inactive copy operation"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:765
+#: org/postgresql/core/v3/QueryExecutorImpl.java:917
msgid "Database connection failed when canceling copy operation"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:781
+#: org/postgresql/core/v3/QueryExecutorImpl.java:933
msgid "Missing expected error response to copy cancel request"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:785
+#: org/postgresql/core/v3/QueryExecutorImpl.java:937
#, java-format
msgid "Got {0} error responses to single copy cancel request"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:800
+#: org/postgresql/core/v3/QueryExecutorImpl.java:952
msgid "Tried to end inactive copy"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:815
+#: org/postgresql/core/v3/QueryExecutorImpl.java:967
msgid "Database connection failed when ending copy"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:833
-#: org/postgresql/core/v3/QueryExecutorImpl.java:855
+#: org/postgresql/core/v3/QueryExecutorImpl.java:985
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1005
msgid "Tried to write to an inactive copy operation"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:848
-#: org/postgresql/core/v3/QueryExecutorImpl.java:863
+#: org/postgresql/core/v3/QueryExecutorImpl.java:998
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1013
msgid "Database connection failed when writing to copy"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:877
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1028
msgid "Tried to read from inactive copy"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:884
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1035
msgid "Database connection failed when reading from copy"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:956
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1101
#, java-format
msgid "Received CommandComplete ''{0}'' without an active copy operation"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:983
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1126
#, java-format
msgid "Got CopyInResponse from server during an active {0}"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:999
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1140
#, java-format
msgid "Got CopyOutResponse from server during an active {0}"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1017
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1154
+#, java-format
+msgid "Got CopyBothResponse from server during an active {0}"
+msgstr ""
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1170
msgid "Got CopyData without an active copy operation"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1021
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1174
#, fuzzy, java-format
msgid "Unexpected copydata from server for {0}"
msgstr "Esperado um EOF do servidor, recebido: {0}"
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1061
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2037
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1234
+#, java-format
+msgid "Unexpected packet type during copy: {0}"
+msgstr ""
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1524
+#, java-format
+msgid ""
+"Bind message length {0} too long. This can be caused by very large or "
+"incorrect length specifications on InputStream parameters."
+msgstr ""
+"Tamanho de mensagem de ligação {0} é muito longo. Isso pode ser causado por "
+"especificações de tamanho incorretas ou muito grandes nos parâmetros do "
+"InputStream."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2145
+msgid "Ran out of memory retrieving query results."
+msgstr "Memória insuficiente ao recuperar resultados da consulta."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2313
+msgid "The driver currently does not support COPY operations."
+msgstr "O driver atualmente não suporta operações COPY."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2487
+#, fuzzy, java-format
+msgid "Unable to parse the count in command completion tag: {0}."
+msgstr ""
+"Não foi possível interpretar o contador de atualização na marcação de "
+"comando completo: {0}."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2603
#, fuzzy, java-format
msgid ""
"The server''s client_encoding parameter was changed to {0}. The JDBC driver "
@@ -418,8 +408,7 @@ msgstr ""
"O parâmetro do servidor client_encoding foi alterado para {0}. O driver JDBC "
"requer que o client_encoding seja UNICODE para operação normal."
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1069
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2045
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2611
#, java-format
msgid ""
"The server''s DateStyle parameter was changed to {0}. The JDBC driver "
@@ -428,8 +417,7 @@ msgstr ""
"O parâmetro do servidor DateStyle foi alterado para {0}. O driver JDBC "
"requer que o DateStyle começe com ISO para operação normal."
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1083
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2059
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2624
#, java-format
msgid ""
"The server''s standard_conforming_strings parameter was reported as {0}. The "
@@ -438,67 +426,197 @@ msgstr ""
"O parâmetro do servidor standard_conforming_strings foi definido como {0}. O "
"driver JDBC espera que seja on ou off."
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1122
+#: org/postgresql/core/v3/SimpleParameterList.java:54
+#: org/postgresql/core/v3/SimpleParameterList.java:65
+#: org/postgresql/core/v3/CompositeParameterList.java:33
+#: org/postgresql/jdbc/PgResultSetMetaData.java:493
+#: org/postgresql/jdbc/PgResultSet.java:2751
#, java-format
-msgid "Unexpected packet type during copy: {0}"
+msgid "The column index is out of range: {0}, number of columns: {1}."
msgstr ""
+"O índice da coluna está fora do intervalo: {0}, número de colunas: {1}."
+
+#: org/postgresql/core/v3/SimpleParameterList.java:257
+#, java-format
+msgid "No value specified for parameter {0}."
+msgstr "Nenhum valor especificado para parâmetro {0}."
+
+#: org/postgresql/core/v3/SimpleParameterList.java:431
+#, fuzzy, java-format
+msgid "Added parameters index out of range: {0}, number of columns: {1}."
+msgstr ""
+"O índice de parâmetro está fora do intervalo: {0}, número de parâmetros: {1}."
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1393
+#: org/postgresql/core/v3/replication/V3ReplicationProtocol.java:133
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:257
+msgid "The connection attempt failed."
+msgstr "A tentativa de conexão falhou."
+
+#: org/postgresql/core/v3/replication/V3PGReplicationStream.java:144
#, java-format
+msgid "Unexpected packet type during replication: {0}"
+msgstr ""
+
+#: org/postgresql/core/v3/replication/V3PGReplicationStream.java:269
+#, fuzzy
+msgid "This replication stream has been closed."
+msgstr "Conexão foi fechada."
+
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:109
+#, fuzzy, java-format
+msgid "Invalid sslmode value: {0}"
+msgstr "Tamanho de dado {0} é inválido."
+
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:124
+#, fuzzy, java-format
+msgid "Invalid targetServerType value: {0}"
+msgstr "Tamanho de dado {0} é inválido."
+
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:246
+#, fuzzy, java-format
msgid ""
-"Bind message length {0} too long. This can be caused by very large or "
-"incorrect length specifications on InputStream parameters."
+"Connection to {0} refused. Check that the hostname and port are correct and "
+"that the postmaster is accepting TCP/IP connections."
msgstr ""
-"Tamanho de mensagem de ligação {0} é muito longo. Isso pode ser causado por "
-"especificações de tamanho incorretas ou muito grandes nos parâmetros do "
-"InputStream."
+"Conexão negada. Verifique se o nome da máquina e a porta estão corretos e se "
+"o postmaster está aceitando conexões TCP/IP."
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2131
-msgid "The driver currently does not support COPY operations."
-msgstr "O driver atualmente não suporta operações COPY."
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:272
+#, java-format
+msgid "Could not find a server with specified targetServerType: {0}"
+msgstr ""
-#: org/postgresql/Driver.java:234
-msgid "Error loading default settings from driverconfig.properties"
-msgstr "Erro ao carregar configurações padrão do driverconfig.properties"
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:366
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:379
+msgid "The server does not support SSL."
+msgstr "O servidor não suporta SSL."
-#: org/postgresql/Driver.java:247
-msgid "Properties for the driver contains a non-string value for the key "
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:393
+msgid "An error occurred while setting up the SSL connection."
+msgstr "Um erro ocorreu ao estabelecer uma conexão SSL."
+
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:494
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:521
+msgid ""
+"The server requested password-based authentication, but no password was "
+"provided."
msgstr ""
+"O servidor pediu autenticação baseada em senha, mas nenhuma senha foi "
+"fornecida."
-#: org/postgresql/Driver.java:290
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:624
msgid ""
-"Your security policy has prevented the connection from being attempted. You "
-"probably need to grant the connect java.net.SocketPermission to the database "
-"server host and port that you wish to connect to."
+"SCRAM authentication is not supported by this driver. You need JDK >= 8 and "
+"pgjdbc >= 42.2.0 (not \".jre\" vesions)"
msgstr ""
-"Sua política de segurança impediu que a conexão pudesse ser estabelecida. "
-"Você provavelmente precisa conceder permissão em java.net.SocketPermission "
-"para a máquina e a porta do servidor de banco de dados que você deseja se "
-"conectar."
-#: org/postgresql/Driver.java:296 org/postgresql/Driver.java:362
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:648
+#, java-format
msgid ""
-"Something unusual has occurred to cause the driver to fail. Please report "
-"this exception."
+"The authentication type {0} is not supported. Check that you have configured "
+"the pg_hba.conf file to include the client''s IP address or subnet, and that "
+"it is using an authentication scheme supported by the driver."
msgstr ""
-"Alguma coisa não usual ocorreu para causar a falha do driver. Por favor "
-"reporte esta exceção."
+"O tipo de autenticação {0} não é suportado. Verifique se você configurou o "
+"arquivo pg_hba.conf incluindo a subrede ou endereço IP do cliente, e se está "
+"utilizando o esquema de autenticação suportado pelo driver."
-#: org/postgresql/Driver.java:370
-msgid "Connection attempt timed out."
-msgstr "Tentativa de conexão falhou."
+#: org/postgresql/core/ConnectionFactory.java:57
+#, java-format
+msgid "A connection could not be made using the requested protocol {0}."
+msgstr "A conexão não pode ser feita usando protocolo informado {0}."
-#: org/postgresql/Driver.java:383
-msgid "Interrupted while attempting to connect."
-msgstr "Interrompido ao tentar se conectar."
+#: org/postgresql/core/Oid.java:116
+#, java-format
+msgid "oid type {0} not known and not a number"
+msgstr ""
-#: org/postgresql/Driver.java:645
+#: org/postgresql/util/HStoreConverter.java:43
+#: org/postgresql/util/HStoreConverter.java:74
+#: org/postgresql/jdbc/PgArray.java:210
+#: org/postgresql/jdbc/PgResultSet.java:1924
+msgid ""
+"Invalid character data was found. This is most likely caused by stored data "
+"containing characters that are invalid for the character set the database "
+"was created in. The most common example of this is storing 8bit data in a "
+"SQL_ASCII database."
+msgstr ""
+"Caracter inválido foi encontrado. Isso é mais comumente causado por dado "
+"armazenado que contém caracteres que são inválidos para a codificação que "
+"foi criado o banco de dados. O exemplo mais comum disso é armazenar dados de "
+"8 bits em um banco de dados SQL_ASCII."
+
+#: org/postgresql/util/PGmoney.java:62
+msgid "Conversion of money failed."
+msgstr "Conversão de money falhou."
+
+#: org/postgresql/util/StreamWrapper.java:56
+#: org/postgresql/jdbc/PgPreparedStatement.java:1449
+msgid "Object is too large to send over the protocol."
+msgstr ""
+
+#: org/postgresql/util/PGInterval.java:152
+msgid "Conversion of interval failed"
+msgstr "Conversão de interval falhou"
+
+#: org/postgresql/util/ServerErrorMessage.java:45
#, java-format
-msgid "Method {0} is not yet implemented."
-msgstr "Método {0} ainda não foi implementado."
+msgid ""
+" (pgjdbc: autodetected server-encoding to be {0}, if the message is not "
+"readable, please check database logs and/or host, port, dbname, user, "
+"password, pg_hba.conf)"
+msgstr ""
+
+#: org/postgresql/util/ServerErrorMessage.java:176
+#, java-format
+msgid "Detail: {0}"
+msgstr "Detalhe: {0}"
+
+#: org/postgresql/util/ServerErrorMessage.java:181
+#, java-format
+msgid "Hint: {0}"
+msgstr "Dica: {0}"
+
+#: org/postgresql/util/ServerErrorMessage.java:185
+#, java-format
+msgid "Position: {0}"
+msgstr "Posição: {0}"
+
+#: org/postgresql/util/ServerErrorMessage.java:189
+#, java-format
+msgid "Where: {0}"
+msgstr "Onde: {0}"
+
+#: org/postgresql/util/ServerErrorMessage.java:195
+#, java-format
+msgid "Internal Query: {0}"
+msgstr "Consulta Interna: {0}"
+
+#: org/postgresql/util/ServerErrorMessage.java:199
+#, java-format
+msgid "Internal Position: {0}"
+msgstr "Posição Interna: {0}"
+
+#: org/postgresql/util/ServerErrorMessage.java:206
+#, java-format
+msgid "Location: File: {0}, Routine: {1}, Line: {2}"
+msgstr "Local: Arquivo: {0}, Rotina: {1}, Linha: {2}"
+
+#: org/postgresql/util/ServerErrorMessage.java:211
+#, java-format
+msgid "Server SQLState: {0}"
+msgstr "SQLState: {0}"
+
+#: org/postgresql/ds/PGPoolingDataSource.java:269
+msgid "Failed to setup DataSource."
+msgstr ""
+
+#: org/postgresql/ds/PGPoolingDataSource.java:371
+msgid "DataSource has been closed."
+msgstr "DataSource foi fechado."
-#: org/postgresql/ds/common/BaseDataSource.java:1037
-#: org/postgresql/ds/common/BaseDataSource.java:1047
+#: org/postgresql/ds/common/BaseDataSource.java:1132
+#: org/postgresql/ds/common/BaseDataSource.java:1142
#, fuzzy, java-format
msgid "Unsupported property name: {0}"
msgstr "Valor de Types não é suportado: {0}"
@@ -507,7 +625,7 @@ msgstr "Valor de Types não é suportado: {0}"
msgid "This PooledConnection has already been closed."
msgstr "Este PooledConnection já foi fechado."
-#: org/postgresql/ds/PGPooledConnection.java:313
+#: org/postgresql/ds/PGPooledConnection.java:314
msgid ""
"Connection has been closed automatically because a new connection was opened "
"for the same PooledConnection or the PooledConnection has been closed."
@@ -515,407 +633,531 @@ msgstr ""
"Conexão foi fechada automaticamente porque uma nova conexão foi aberta pelo "
"mesmo PooledConnection ou o PooledConnection foi fechado."
-#: org/postgresql/ds/PGPooledConnection.java:314
+#: org/postgresql/ds/PGPooledConnection.java:315
msgid "Connection has been closed."
msgstr "Conexão foi fechada."
-#: org/postgresql/ds/PGPooledConnection.java:418
+#: org/postgresql/ds/PGPooledConnection.java:420
msgid "Statement has been closed."
msgstr "Comando foi fechado."
-#: org/postgresql/ds/PGPoolingDataSource.java:269
-msgid "Failed to setup DataSource."
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:68
+msgid "No SCRAM mechanism(s) advertised by the server"
msgstr ""
-#: org/postgresql/ds/PGPoolingDataSource.java:371
-msgid "DataSource has been closed."
-msgstr "DataSource foi fechado."
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:81
+msgid "Invalid or unsupported by client SCRAM mechanisms"
+msgstr ""
-#: org/postgresql/fastpath/Fastpath.java:82
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:117
#, fuzzy, java-format
-msgid "Fastpath call {0} - No result was returned and we expected a numeric."
-msgstr ""
-"Chamada ao Fastpath {0} - Nenhum resultado foi retornado e nós esperávamos "
-"um inteiro."
+msgid "Invalid server-first-message: {0}"
+msgstr "Tamanho de dado {0} é inválido."
-#: org/postgresql/fastpath/Fastpath.java:165
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:147
+#, fuzzy, java-format
+msgid "Invalid server-final-message: {0}"
+msgstr "Tamanho de dado {0} é inválido."
+
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:153
#, java-format
-msgid "Fastpath call {0} - No result was returned and we expected an integer."
+msgid "SCRAM authentication failed, server returned error: {0}"
msgstr ""
-"Chamada ao Fastpath {0} - Nenhum resultado foi retornado e nós esperávamos "
-"um inteiro."
-#: org/postgresql/fastpath/Fastpath.java:174
-#, fuzzy, java-format
-msgid ""
-"Fastpath call {0} - No result was returned or wrong size while expecting an "
-"integer."
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:160
+msgid "Invalid server SCRAM signature"
msgstr ""
-"Chamada ao Fastpath {0} - Nenhum resultado foi retornado e nós esperávamos "
-"um inteiro."
-#: org/postgresql/fastpath/Fastpath.java:191
+#: org/postgresql/osgi/PGDataSourceFactory.java:82
#, fuzzy, java-format
-msgid "Fastpath call {0} - No result was returned and we expected a long."
+msgid "Unsupported properties: {0}"
+msgstr "Valor de Types não é suportado: {0}"
+
+#: org/postgresql/Driver.java:214
+msgid "Error loading default settings from driverconfig.properties"
+msgstr "Erro ao carregar configurações padrão do driverconfig.properties"
+
+#: org/postgresql/Driver.java:226
+msgid "Properties for the driver contains a non-string value for the key "
msgstr ""
-"Chamada ao Fastpath {0} - Nenhum resultado foi retornado e nós esperávamos "
-"um inteiro."
-#: org/postgresql/fastpath/Fastpath.java:200
-#, fuzzy, java-format
+#: org/postgresql/Driver.java:270
msgid ""
-"Fastpath call {0} - No result was returned or wrong size while expecting a "
-"long."
+"Your security policy has prevented the connection from being attempted. You "
+"probably need to grant the connect java.net.SocketPermission to the database "
+"server host and port that you wish to connect to."
msgstr ""
-"Chamada ao Fastpath {0} - Nenhum resultado foi retornado e nós esperávamos "
-"um inteiro."
+"Sua política de segurança impediu que a conexão pudesse ser estabelecida. "
+"Você provavelmente precisa conceder permissão em java.net.SocketPermission "
+"para a máquina e a porta do servidor de banco de dados que você deseja se "
+"conectar."
-#: org/postgresql/fastpath/Fastpath.java:312
+#: org/postgresql/Driver.java:276 org/postgresql/Driver.java:408
+msgid ""
+"Something unusual has occurred to cause the driver to fail. Please report "
+"this exception."
+msgstr ""
+"Alguma coisa não usual ocorreu para causar a falha do driver. Por favor "
+"reporte esta exceção."
+
+#: org/postgresql/Driver.java:416
+msgid "Connection attempt timed out."
+msgstr "Tentativa de conexão falhou."
+
+#: org/postgresql/Driver.java:429
+msgid "Interrupted while attempting to connect."
+msgstr "Interrompido ao tentar se conectar."
+
+#: org/postgresql/Driver.java:682
#, java-format
-msgid "The fastpath function {0} is unknown."
-msgstr "A função do fastpath {0} é desconhecida."
+msgid "Method {0} is not yet implemented."
+msgstr "Método {0} ainda não foi implementado."
-#: org/postgresql/geometric/PGbox.java:79
-#: org/postgresql/geometric/PGcircle.java:76
-#: org/postgresql/geometric/PGcircle.java:84
-#: org/postgresql/geometric/PGline.java:109
-#: org/postgresql/geometric/PGline.java:118
-#: org/postgresql/geometric/PGlseg.java:72
-#: org/postgresql/geometric/PGpoint.java:78
+#: org/postgresql/geometric/PGlseg.java:70
+#: org/postgresql/geometric/PGline.java:107
+#: org/postgresql/geometric/PGline.java:116
+#: org/postgresql/geometric/PGcircle.java:74
+#: org/postgresql/geometric/PGcircle.java:82
+#: org/postgresql/geometric/PGpoint.java:76
+#: org/postgresql/geometric/PGbox.java:77
#, java-format
msgid "Conversion to type {0} failed: {1}."
msgstr "Conversão para tipo {0} falhou: {1}."
-#: org/postgresql/geometric/PGpath.java:73
+#: org/postgresql/geometric/PGpath.java:70
#, java-format
msgid "Cannot tell if path is open or closed: {0}."
msgstr "Não pode dizer se caminho está aberto ou fechado: {0}."
-#: org/postgresql/gss/GssAction.java:141 org/postgresql/gss/MakeGSS.java:69
-#: org/postgresql/gss/MakeGSS.java:77
-msgid "GSS Authentication failed"
-msgstr "Autenticação GSS falhou"
-
-#: org/postgresql/jdbc/AbstractBlobClob.java:89
+#: org/postgresql/xa/PGXAConnection.java:128
msgid ""
-"Truncation of large objects is only implemented in 8.3 and later servers."
-msgstr ""
-"Truncar objetos grandes só é implementado por servidores 8.3 ou superiores."
-
-#: org/postgresql/jdbc/AbstractBlobClob.java:94
-msgid "Cannot truncate LOB to a negative length."
+"Transaction control methods setAutoCommit(true), commit, rollback and "
+"setSavePoint not allowed while an XA transaction is active."
msgstr ""
-#: org/postgresql/jdbc/AbstractBlobClob.java:101
-#: org/postgresql/jdbc/AbstractBlobClob.java:245
+#: org/postgresql/xa/PGXAConnection.java:177
+#: org/postgresql/xa/PGXAConnection.java:253
+#: org/postgresql/xa/PGXAConnection.java:347
#, java-format
-msgid "PostgreSQL LOBs can only index to: {0}"
-msgstr "LOBs do PostgreSQL só podem indexar até: {0}"
+msgid "Invalid flags {0}"
+msgstr "Marcadores={0} inválidos"
-#: org/postgresql/jdbc/AbstractBlobClob.java:241
-msgid "LOB positioning offsets start at 1."
-msgstr "Deslocamentos da posição de LOB começam em 1."
+#: org/postgresql/xa/PGXAConnection.java:181
+#: org/postgresql/xa/PGXAConnection.java:257
+#: org/postgresql/xa/PGXAConnection.java:449
+msgid "xid must not be null"
+msgstr "xid não deve ser nulo"
-#: org/postgresql/jdbc/AbstractBlobClob.java:257
-msgid "free() was called on this LOB previously"
-msgstr "free() já foi chamado neste LOB"
+#: org/postgresql/xa/PGXAConnection.java:185
+msgid "Connection is busy with another transaction"
+msgstr "Conexão está ocupada com outra transação"
-#: org/postgresql/jdbc/BatchResultHandler.java:41
-#: org/postgresql/jdbc/PgConnection.java:474
-#: org/postgresql/jdbc/PgPreparedStatement.java:138
-#: org/postgresql/jdbc/PgStatement.java:299
-msgid "A result was returned when none was expected."
-msgstr "Um resultado foi retornado quando nenhum era esperado."
+#: org/postgresql/xa/PGXAConnection.java:194
+#: org/postgresql/xa/PGXAConnection.java:267
+msgid "suspend/resume not implemented"
+msgstr "suspender/recomeçar não está implementado"
-#: org/postgresql/jdbc/BatchResultHandler.java:59
-msgid "Too many update results were returned."
-msgstr "Muitos resultados de atualização foram retornados."
+#: org/postgresql/xa/PGXAConnection.java:202
+#: org/postgresql/xa/PGXAConnection.java:209
+#: org/postgresql/xa/PGXAConnection.java:213
+#, java-format
+msgid ""
+"Invalid protocol state requested. Attempted transaction interleaving is not "
+"supported. xid={0}, currentXid={1}, state={2}, flags={3}"
+msgstr ""
+"Intercalação de transação não está implementado. xid={0}, currentXid={1}, "
+"state={2}, flags={3}"
+
+#: org/postgresql/xa/PGXAConnection.java:224
+msgid "Error disabling autocommit"
+msgstr "Erro ao desabilitar autocommit"
-#: org/postgresql/jdbc/BatchResultHandler.java:88
+#: org/postgresql/xa/PGXAConnection.java:261
#, java-format
msgid ""
-"Batch entry {0} {1} was aborted. Call getNextException to see the cause."
+"tried to call end without corresponding start call. state={0}, start "
+"xid={1}, currentXid={2}, preparedXid={3}"
msgstr ""
-"Entrada em lote {0} {1} foi abortada. Chame getNextException para ver a "
-"causa."
+"tentou executar end sem a chamada ao start correspondente. state={0}, start "
+"xid={1}, currentXid={2}, preparedXid={3}"
-#: org/postgresql/jdbc/EscapedFunctions.java:243
+#: org/postgresql/xa/PGXAConnection.java:297
+#, fuzzy, java-format
+msgid ""
+"Preparing already prepared transaction, the prepared xid {0}, prepare xid={1}"
+msgstr ""
+"Erro ao cancelar transação preparada. rollback xid={0}, preparedXid={1}"
+
+#: org/postgresql/xa/PGXAConnection.java:300
#, java-format
-msgid "{0} function takes four and only four argument."
-msgstr "função {0} recebe somente quatro argumentos."
+msgid "Current connection does not have an associated xid. prepare xid={0}"
+msgstr ""
-#: org/postgresql/jdbc/EscapedFunctions.java:273
-#: org/postgresql/jdbc/EscapedFunctions.java:347
-#: org/postgresql/jdbc/EscapedFunctions.java:752
-#: org/postgresql/jdbc/EscapedFunctions.java:790
+#: org/postgresql/xa/PGXAConnection.java:307
#, java-format
-msgid "{0} function takes two and only two arguments."
-msgstr "função {0} recebe somente dois argumentos."
+msgid ""
+"Not implemented: Prepare must be issued using the same connection that "
+"started the transaction. currentXid={0}, prepare xid={1}"
+msgstr ""
+"Não está implementado: Prepare deve ser executado utilizando a mesma conexão "
+"que iniciou a transação. currentXid={0}, prepare xid={1}"
-#: org/postgresql/jdbc/EscapedFunctions.java:291
-#: org/postgresql/jdbc/EscapedFunctions.java:329
-#: org/postgresql/jdbc/EscapedFunctions.java:449
-#: org/postgresql/jdbc/EscapedFunctions.java:464
-#: org/postgresql/jdbc/EscapedFunctions.java:479
-#: org/postgresql/jdbc/EscapedFunctions.java:494
-#: org/postgresql/jdbc/EscapedFunctions.java:509
-#: org/postgresql/jdbc/EscapedFunctions.java:524
-#: org/postgresql/jdbc/EscapedFunctions.java:539
-#: org/postgresql/jdbc/EscapedFunctions.java:554
-#: org/postgresql/jdbc/EscapedFunctions.java:569
-#: org/postgresql/jdbc/EscapedFunctions.java:584
-#: org/postgresql/jdbc/EscapedFunctions.java:599
-#: org/postgresql/jdbc/EscapedFunctions.java:614
-#: org/postgresql/jdbc/EscapedFunctions.java:778
+#: org/postgresql/xa/PGXAConnection.java:311
#, java-format
-msgid "{0} function takes one and only one argument."
-msgstr "função {0} recebe somente um argumento."
+msgid "Prepare called before end. prepare xid={0}, state={1}"
+msgstr "Prepare executado antes do end. prepare xid={0}, state={1}"
-#: org/postgresql/jdbc/EscapedFunctions.java:313
-#: org/postgresql/jdbc/EscapedFunctions.java:394
+#: org/postgresql/xa/PGXAConnection.java:331
#, java-format
-msgid "{0} function takes two or three arguments."
-msgstr "função {0} recebe dois ou três argumentos."
+msgid "Error preparing transaction. prepare xid={0}"
+msgstr "Erro ao preparar transação. prepare xid={0}"
-#: org/postgresql/jdbc/EscapedFunctions.java:419
-#: org/postgresql/jdbc/EscapedFunctions.java:434
-#: org/postgresql/jdbc/EscapedFunctions.java:737
-#: org/postgresql/jdbc/EscapedFunctions.java:767
+#: org/postgresql/xa/PGXAConnection.java:382
+msgid "Error during recover"
+msgstr "Erro durante recuperação"
+
+#: org/postgresql/xa/PGXAConnection.java:438
+#, fuzzy, java-format
+msgid ""
+"Error rolling back prepared transaction. rollback xid={0}, preparedXid={1}, "
+"currentXid={2}"
+msgstr ""
+"Erro ao cancelar transação preparada. rollback xid={0}, preparedXid={1}"
+
+#: org/postgresql/xa/PGXAConnection.java:471
#, java-format
-msgid "{0} function doesn''t take any argument."
-msgstr "função {0} não recebe nenhum argumento."
+msgid ""
+"One-phase commit called for xid {0} but connection was prepared with xid {1}"
+msgstr ""
+
+#: org/postgresql/xa/PGXAConnection.java:479
+msgid ""
+"Not implemented: one-phase commit must be issued using the same connection "
+"that was used to start it"
+msgstr ""
+"Não está implementado: efetivada da primeira fase deve ser executada "
+"utilizando a mesma conexão que foi utilizada para iniciá-la"
-#: org/postgresql/jdbc/EscapedFunctions.java:630
-#: org/postgresql/jdbc/EscapedFunctions.java:683
+#: org/postgresql/xa/PGXAConnection.java:483
#, java-format
-msgid "{0} function takes three and only three arguments."
-msgstr "função {0} recebe três e somente três argumentos."
+msgid "One-phase commit with unknown xid. commit xid={0}, currentXid={1}"
+msgstr ""
-#: org/postgresql/jdbc/EscapedFunctions.java:643
-#: org/postgresql/jdbc/EscapedFunctions.java:664
-#: org/postgresql/jdbc/EscapedFunctions.java:667
-#: org/postgresql/jdbc/EscapedFunctions.java:700
-#: org/postgresql/jdbc/EscapedFunctions.java:713
-#: org/postgresql/jdbc/EscapedFunctions.java:716
+#: org/postgresql/xa/PGXAConnection.java:487
#, java-format
-msgid "Interval {0} not yet implemented"
-msgstr "Intervalo {0} ainda não foi implementado"
+msgid "commit called before end. commit xid={0}, state={1}"
+msgstr "commit executado antes do end. commit xid={0}, state={1}"
-#: org/postgresql/jdbc/PgArray.java:166 org/postgresql/jdbc/PgArray.java:822
+#: org/postgresql/xa/PGXAConnection.java:498
#, java-format
-msgid "The array index is out of range: {0}"
-msgstr "O índice da matriz está fora do intervalo: {0}"
+msgid "Error during one-phase commit. commit xid={0}"
+msgstr "Erro durante efetivação de uma fase. commit xid={0}"
-#: org/postgresql/jdbc/PgArray.java:183 org/postgresql/jdbc/PgArray.java:839
-#, java-format
-msgid "The array index is out of range: {0}, number of elements: {1}."
+#: org/postgresql/xa/PGXAConnection.java:517
+msgid ""
+"Not implemented: 2nd phase commit must be issued using an idle connection. "
+"commit xid={0}, currentXid={1}, state={2], transactionState={3}"
msgstr ""
-"O índice da matriz está fora do intervalo: {0}, número de elementos: {1}."
+"Não está implementado: efetivação da segunda fase deve ser executada "
+"utilizado uma conexão ociosa. commit xid={0}, currentXid={1}, state={2], "
+"transactionState={3}"
-#: org/postgresql/jdbc/PgArray.java:215
-#: org/postgresql/jdbc/PgResultSet.java:1885
-#: org/postgresql/util/HStoreConverter.java:38
-#: org/postgresql/util/HStoreConverter.java:69
+#: org/postgresql/xa/PGXAConnection.java:550
+#, fuzzy, java-format
msgid ""
-"Invalid character data was found. This is most likely caused by stored data "
-"containing characters that are invalid for the character set the database "
-"was created in. The most common example of this is storing 8bit data in a "
-"SQL_ASCII database."
+"Error committing prepared transaction. commit xid={0}, preparedXid={1}, "
+"currentXid={2}"
msgstr ""
-"Caracter inválido foi encontrado. Isso é mais comumente causado por dado "
-"armazenado que contém caracteres que são inválidos para a codificação que "
-"foi criado o banco de dados. O exemplo mais comum disso é armazenar dados de "
-"8 bits em um banco de dados SQL_ASCII."
+"Erro ao cancelar transação preparada. commit xid={0}, preparedXid={1}, "
+"currentXid={2}"
-#: org/postgresql/jdbc/PgCallableStatement.java:90
-#: org/postgresql/jdbc/PgCallableStatement.java:96
-msgid "A CallableStatement was executed with nothing returned."
-msgstr "Uma função foi executada e nada foi retornado."
+#: org/postgresql/xa/PGXAConnection.java:567
+#, java-format
+msgid "Heuristic commit/rollback not supported. forget xid={0}"
+msgstr "Efetivação/Cancelamento heurístico não é suportado. forget xid={0}"
-#: org/postgresql/jdbc/PgCallableStatement.java:107
-msgid "A CallableStatement was executed with an invalid number of parameters"
-msgstr "Uma função foi executada com um número inválido de parâmetros"
+#: org/postgresql/jdbc/PgSQLXML.java:147
+msgid "Unable to decode xml data."
+msgstr "Não foi possível decodificar dado xml."
-#: org/postgresql/jdbc/PgCallableStatement.java:139
+#: org/postgresql/jdbc/PgSQLXML.java:150
+#, java-format
+msgid "Unknown XML Source class: {0}"
+msgstr "Classe XML Source desconhecida: {0}"
+
+#: org/postgresql/jdbc/PgSQLXML.java:193
+msgid "Unable to create SAXResult for SQLXML."
+msgstr "Não foi possível criar SAXResult para SQLXML."
+
+#: org/postgresql/jdbc/PgSQLXML.java:208
+msgid "Unable to create StAXResult for SQLXML"
+msgstr "Não foi possível criar StAXResult para SQLXML"
+
+#: org/postgresql/jdbc/PgSQLXML.java:213
#, java-format
+msgid "Unknown XML Result class: {0}"
+msgstr "Classe XML Result desconhecida: {0}"
+
+#: org/postgresql/jdbc/PgSQLXML.java:225
+msgid "This SQLXML object has already been freed."
+msgstr "Este objeto SQLXML já foi liberado."
+
+#: org/postgresql/jdbc/PgSQLXML.java:234
msgid ""
-"A CallableStatement function was executed and the out parameter {0} was of "
-"type {1} however type {2} was registered."
+"This SQLXML object has not been initialized, so you cannot retrieve data "
+"from it."
msgstr ""
-"Uma função foi executada e o parâmetro de retorno {0} era do tipo {1} "
-"contudo tipo {2} foi registrado."
+"Este objeto SQLXML não foi inicializado, então você não pode recuperar dados "
+"dele."
+
+#: org/postgresql/jdbc/PgSQLXML.java:247
+#, java-format
+msgid "Failed to convert binary xml data to encoding: {0}."
+msgstr "Falhou ao converter dados xml binários para codificação: {0}."
+
+#: org/postgresql/jdbc/PgSQLXML.java:273
+msgid "Unable to convert DOMResult SQLXML data to a string."
+msgstr ""
+"Não foi possível converter dado SQLXML do DOMResult para uma cadeia de "
+"caracteres."
-#: org/postgresql/jdbc/PgCallableStatement.java:195
+#: org/postgresql/jdbc/PgSQLXML.java:287
msgid ""
-"This statement does not declare an OUT parameter. Use '{' ?= call ... '}' "
-"to declare one."
+"This SQLXML object has already been initialized, so you cannot manipulate it "
+"further."
msgstr ""
-"Este comando não declara um parâmetro de saída. Utilize '{' ?= chamada ... "
-"'}' para declarar um)"
+"Este objeto SQLXML já foi inicializado, então você não pode manipulá-lo "
+"depois."
-#: org/postgresql/jdbc/PgCallableStatement.java:239
-msgid "wasNull cannot be call before fetching a result."
-msgstr "wasNull não pode ser chamado antes de obter um resultado."
+#: org/postgresql/jdbc/PSQLSavepoint.java:37
+#: org/postgresql/jdbc/PSQLSavepoint.java:51
+#: org/postgresql/jdbc/PSQLSavepoint.java:69
+msgid "Cannot reference a savepoint after it has been released."
+msgstr "Não pode referenciar um savepoint após ele ser descartado."
+
+#: org/postgresql/jdbc/PSQLSavepoint.java:42
+msgid "Cannot retrieve the id of a named savepoint."
+msgstr "Não pode recuperar o id de um savepoint com nome."
+
+#: org/postgresql/jdbc/PSQLSavepoint.java:56
+msgid "Cannot retrieve the name of an unnamed savepoint."
+msgstr "Não pode recuperar o nome de um savepoint sem nome."
-#: org/postgresql/jdbc/PgCallableStatement.java:377
-#: org/postgresql/jdbc/PgCallableStatement.java:396
+#: org/postgresql/jdbc/PgArray.java:157 org/postgresql/jdbc/PgArray.java:844
#, java-format
-msgid ""
-"Parameter of type {0} was registered, but call to get{1} (sqltype={2}) was "
-"made."
+msgid "The array index is out of range: {0}"
+msgstr "O índice da matriz está fora do intervalo: {0}"
+
+#: org/postgresql/jdbc/PgArray.java:178 org/postgresql/jdbc/PgArray.java:861
+#, java-format
+msgid "The array index is out of range: {0}, number of elements: {1}."
msgstr ""
-"Parâmetro do tipo {0} foi registrado, mas uma chamada a get{1} (tiposql={2}) "
-"foi feita."
+"O índice da matriz está fora do intervalo: {0}, número de elementos: {1}."
-#: org/postgresql/jdbc/PgCallableStatement.java:417
-msgid ""
-"A CallableStatement was declared, but no call to registerOutParameter(1, "
-"<some type>) was made."
+#: org/postgresql/jdbc/PgParameterMetaData.java:83
+#, java-format
+msgid "The parameter index is out of range: {0}, number of parameters: {1}."
msgstr ""
-"Uma função foi declarada mas nenhuma chamada a registerOutParameter (1, "
-"<algum_tipo>) foi feita."
+"O índice de parâmetro está fora do intervalo: {0}, número de parâmetros: {1}."
-#: org/postgresql/jdbc/PgCallableStatement.java:423
-msgid "No function outputs were registered."
-msgstr "Nenhum saída de função foi registrada."
+#: org/postgresql/jdbc/BatchResultHandler.java:92
+msgid "Too many update results were returned."
+msgstr "Muitos resultados de atualização foram retornados."
-#: org/postgresql/jdbc/PgCallableStatement.java:429
+#: org/postgresql/jdbc/BatchResultHandler.java:146
+#, fuzzy, java-format
msgid ""
-"Results cannot be retrieved from a CallableStatement before it is executed."
+"Batch entry {0} {1} was aborted: {2} Call getNextException to see other "
+"errors in the batch."
msgstr ""
-"Resultados não podem ser recuperados de uma função antes dela ser executada."
+"Entrada em lote {0} {1} foi abortada. Chame getNextException para ver a "
+"causa."
-#: org/postgresql/jdbc/PgConnection.java:312
+#: org/postgresql/jdbc/PgConnection.java:272
#, java-format
msgid "Unsupported value for stringtype parameter: {0}"
msgstr "Valor do parâmetro stringtype não é suportado: {0}"
-#: org/postgresql/jdbc/PgConnection.java:457
-#: org/postgresql/jdbc/PgPreparedStatement.java:115
-#: org/postgresql/jdbc/PgStatement.java:282
-#: org/postgresql/jdbc/TypeInfoCache.java:230
-#: org/postgresql/jdbc/TypeInfoCache.java:370
-#: org/postgresql/jdbc/TypeInfoCache.java:412
+#: org/postgresql/jdbc/PgConnection.java:424
+#: org/postgresql/jdbc/PgStatement.java:225
+#: org/postgresql/jdbc/TypeInfoCache.java:226
+#: org/postgresql/jdbc/TypeInfoCache.java:371
+#: org/postgresql/jdbc/TypeInfoCache.java:411
+#: org/postgresql/jdbc/TypeInfoCache.java:484
#: org/postgresql/jdbc/TypeInfoCache.java:489
-#: org/postgresql/jdbc/TypeInfoCache.java:494
-#: org/postgresql/jdbc/TypeInfoCache.java:535
-#: org/postgresql/jdbc/TypeInfoCache.java:540
+#: org/postgresql/jdbc/TypeInfoCache.java:526
+#: org/postgresql/jdbc/TypeInfoCache.java:531
+#: org/postgresql/jdbc/PgPreparedStatement.java:119
msgid "No results were returned by the query."
msgstr "Nenhum resultado foi retornado pela consulta."
-#: org/postgresql/jdbc/PgConnection.java:578
+#: org/postgresql/jdbc/PgConnection.java:441
+#: org/postgresql/jdbc/PgStatement.java:254
+msgid "A result was returned when none was expected."
+msgstr "Um resultado foi retornado quando nenhum era esperado."
+
+#: org/postgresql/jdbc/PgConnection.java:545
msgid "Custom type maps are not supported."
msgstr "Mapeamento de tipos personalizados não são suportados."
-#: org/postgresql/jdbc/PgConnection.java:620
+#: org/postgresql/jdbc/PgConnection.java:587
#, java-format
msgid "Failed to create object for: {0}."
msgstr "Falhou ao criar objeto para: {0}."
-#: org/postgresql/jdbc/PgConnection.java:672
+#: org/postgresql/jdbc/PgConnection.java:641
#, java-format
msgid "Unable to load the class {0} responsible for the datatype {1}"
msgstr ""
"Não foi possível carregar a classe {0} responsável pelo tipo de dado {1}"
-#: org/postgresql/jdbc/PgConnection.java:724
+#: org/postgresql/jdbc/PgConnection.java:693
msgid ""
"Cannot change transaction read-only property in the middle of a transaction."
msgstr ""
"Não pode mudar propriedade somente-leitura da transação no meio de uma "
"transação."
-#: org/postgresql/jdbc/PgConnection.java:775
+#: org/postgresql/jdbc/PgConnection.java:756
msgid "Cannot commit when autoCommit is enabled."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:786
-#: org/postgresql/jdbc/PgConnection.java:1358
-#: org/postgresql/jdbc/PgConnection.java:1395
+#: org/postgresql/jdbc/PgConnection.java:767
+#: org/postgresql/jdbc/PgConnection.java:1384
+#: org/postgresql/jdbc/PgConnection.java:1428
#, fuzzy
msgid "This connection has been closed."
msgstr "Conexão foi fechada."
-#: org/postgresql/jdbc/PgConnection.java:796
+#: org/postgresql/jdbc/PgConnection.java:777
msgid "Cannot rollback when autoCommit is enabled."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:870
+#: org/postgresql/jdbc/PgConnection.java:827
msgid ""
"Cannot change transaction isolation level in the middle of a transaction."
msgstr ""
"Não pode mudar nível de isolamento da transação no meio de uma transação."
-#: org/postgresql/jdbc/PgConnection.java:876
+#: org/postgresql/jdbc/PgConnection.java:833
#, java-format
msgid "Transaction isolation level {0} not supported."
msgstr "Nível de isolamento da transação {0} não é suportado."
-#: org/postgresql/jdbc/PgConnection.java:921
+#: org/postgresql/jdbc/PgConnection.java:878
msgid "Finalizing a Connection that was never closed:"
msgstr "Fechando uma Conexão que não foi fechada:"
-#: org/postgresql/jdbc/PgConnection.java:1009
+#: org/postgresql/jdbc/PgConnection.java:945
msgid "Unable to translate data into the desired encoding."
msgstr "Não foi possível traduzir dado para codificação desejada."
-#: org/postgresql/jdbc/PgConnection.java:1081
-#: org/postgresql/jdbc/PgResultSet.java:1782
-#: org/postgresql/jdbc/PgStatement.java:1053
+#: org/postgresql/jdbc/PgConnection.java:1008
+#: org/postgresql/jdbc/PgStatement.java:903
+#: org/postgresql/jdbc/PgResultSet.java:1817
msgid "Fetch size must be a value greater to or equal to 0."
msgstr "Tamanho da busca deve ser um valor maior ou igual a 0."
-#: org/postgresql/jdbc/PgConnection.java:1311
+#: org/postgresql/jdbc/PgConnection.java:1289
+#: org/postgresql/jdbc/PgConnection.java:1330
#, java-format
msgid "Unable to find server array type for provided name {0}."
msgstr "Não foi possível encontrar tipo matriz para nome fornecido {0}."
-#: org/postgresql/jdbc/PgConnection.java:1327
+#: org/postgresql/jdbc/PgConnection.java:1312
+#, fuzzy, java-format
+msgid "Invalid elements {0}"
+msgstr "Marcadores={0} inválidos"
+
+#: org/postgresql/jdbc/PgConnection.java:1348
#, fuzzy, java-format
msgid "Invalid timeout ({0}<0)."
msgstr "Tamanho de dado {0} é inválido."
-#: org/postgresql/jdbc/PgConnection.java:1340
+#: org/postgresql/jdbc/PgConnection.java:1372
msgid "Validating connection."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:1375
+#: org/postgresql/jdbc/PgConnection.java:1405
#, fuzzy, java-format
msgid "Failed to set ClientInfo property: {0}"
msgstr "Falhou ao criar objeto para: {0}."
-#: org/postgresql/jdbc/PgConnection.java:1383
+#: org/postgresql/jdbc/PgConnection.java:1415
msgid "ClientInfo property not supported."
msgstr "propriedade ClientInfo não é suportada."
-#: org/postgresql/jdbc/PgConnection.java:1408
+#: org/postgresql/jdbc/PgConnection.java:1441
msgid "One ore more ClientInfo failed."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:1517
+#: org/postgresql/jdbc/PgConnection.java:1540
+#, fuzzy
+msgid "Network timeout must be a value greater than or equal to 0."
+msgstr "Tempo de espera da consulta deve ser um valor maior ou igual a 0."
+
+#: org/postgresql/jdbc/PgConnection.java:1552
+msgid "Unable to set network timeout."
+msgstr ""
+
+#: org/postgresql/jdbc/PgConnection.java:1563
+msgid "Unable to get network timeout."
+msgstr ""
+
+#: org/postgresql/jdbc/PgConnection.java:1580
#, java-format
msgid "Unknown ResultSet holdability setting: {0}."
msgstr "Definição de durabilidade do ResultSet desconhecida: {0}."
-#: org/postgresql/jdbc/PgConnection.java:1531
-#: org/postgresql/jdbc/PgConnection.java:1554
-#: org/postgresql/jdbc/PgConnection.java:1576
-#: org/postgresql/jdbc/PgConnection.java:1587
-msgid "Server versions prior to 8.0 do not support savepoints."
-msgstr "Versões do servidor anteriores a 8.0 não suportam savepoints."
-
-#: org/postgresql/jdbc/PgConnection.java:1535
-#: org/postgresql/jdbc/PgConnection.java:1558
+#: org/postgresql/jdbc/PgConnection.java:1598
+#: org/postgresql/jdbc/PgConnection.java:1619
msgid "Cannot establish a savepoint in auto-commit mode."
msgstr ""
"Não pode estabelecer um savepoint no modo de efetivação automática (auto-"
"commit)."
-#: org/postgresql/jdbc/PgConnection.java:1635
+#: org/postgresql/jdbc/PgConnection.java:1685
msgid "Returning autogenerated keys is not supported."
msgstr "Retorno de chaves geradas automaticamente não é suportado."
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:78
+#: org/postgresql/jdbc/PgStatement.java:235
+msgid "Multiple ResultSets were returned by the query."
+msgstr "ResultSets múltiplos foram retornados pela consulta."
+
+#: org/postgresql/jdbc/PgStatement.java:316
+msgid "Can''t use executeWithFlags(int) on a Statement."
+msgstr ""
+
+#: org/postgresql/jdbc/PgStatement.java:509
+msgid "Maximum number of rows must be a value grater than or equal to 0."
+msgstr "Número máximo de registros deve ser um valor maior ou igual a 0."
+
+#: org/postgresql/jdbc/PgStatement.java:550
+msgid "Query timeout must be a value greater than or equals to 0."
+msgstr "Tempo de espera da consulta deve ser um valor maior ou igual a 0."
+
+#: org/postgresql/jdbc/PgStatement.java:590
+msgid "The maximum field size must be a value greater than or equal to 0."
+msgstr "O tamanho máximo de um campo deve ser um valor maior ou igual a 0."
+
+#: org/postgresql/jdbc/PgStatement.java:689
+msgid "This statement has been closed."
+msgstr "Este comando foi fechado."
+
+#: org/postgresql/jdbc/PgStatement.java:895
+#: org/postgresql/jdbc/PgResultSet.java:878
+#, java-format
+msgid "Invalid fetch direction constant: {0}."
+msgstr "Constante de direção da busca é inválida: {0}."
+
+#: org/postgresql/jdbc/PgStatement.java:1145
+#: org/postgresql/jdbc/PgStatement.java:1173
+msgid "Returning autogenerated keys by column index is not supported."
+msgstr ""
+"Retorno de chaves geradas automaticamente por índice de coluna não é "
+"suportado."
+
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:66
msgid ""
"Unable to determine a value for MaxIndexKeys due to missing system catalog "
"data."
@@ -923,119 +1165,135 @@ msgstr ""
"Não foi possível determinar um valor para MaxIndexKeys por causa de falta de "
"dados no catálogo do sistema."
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:100
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:89
msgid "Unable to find name datatype in the system catalogs."
msgstr "Não foi possível encontrar tipo de dado name nos catálogos do sistema."
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1117
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1028
msgid "proname"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1117
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1028
msgid "oid"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1119
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1714
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1030
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1481
msgid "typtype"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1122
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1033
msgid "proargtypes"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1732
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1499
msgid "adsrc"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1872
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1963
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1512
+msgid "attidentity"
+msgstr ""
+
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1608
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1684
msgid "rolname"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1873
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1964
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1609
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1685
msgid "relacl"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1878
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1615
msgid "attacl"
msgstr ""
-#: org/postgresql/jdbc/PgParameterMetaData.java:86
-#, java-format
-msgid "The parameter index is out of range: {0}, number of parameters: {1}."
+#: org/postgresql/jdbc/AbstractBlobClob.java:78
+msgid ""
+"Truncation of large objects is only implemented in 8.3 and later servers."
msgstr ""
-"O índice de parâmetro está fora do intervalo: {0}, número de parâmetros: {1}."
+"Truncar objetos grandes só é implementado por servidores 8.3 ou superiores."
+
+#: org/postgresql/jdbc/AbstractBlobClob.java:83
+msgid "Cannot truncate LOB to a negative length."
+msgstr ""
+
+#: org/postgresql/jdbc/AbstractBlobClob.java:90
+#: org/postgresql/jdbc/AbstractBlobClob.java:234
+#, java-format
+msgid "PostgreSQL LOBs can only index to: {0}"
+msgstr "LOBs do PostgreSQL só podem indexar até: {0}"
-#: org/postgresql/jdbc/PgPreparedStatement.java:102
-#: org/postgresql/jdbc/PgPreparedStatement.java:128
-#: org/postgresql/jdbc/PgPreparedStatement.java:150
-#: org/postgresql/jdbc/PgPreparedStatement.java:1108
+#: org/postgresql/jdbc/AbstractBlobClob.java:230
+msgid "LOB positioning offsets start at 1."
+msgstr "Deslocamentos da posição de LOB começam em 1."
+
+#: org/postgresql/jdbc/AbstractBlobClob.java:246
+msgid "free() was called on this LOB previously"
+msgstr "free() já foi chamado neste LOB"
+
+#: org/postgresql/jdbc/PgPreparedStatement.java:106
+#: org/postgresql/jdbc/PgPreparedStatement.java:127
+#: org/postgresql/jdbc/PgPreparedStatement.java:139
+#: org/postgresql/jdbc/PgPreparedStatement.java:1035
msgid ""
"Can''t use query methods that take a query string on a PreparedStatement."
msgstr ""
"Não pode utilizar métodos de consulta que pegam uma consulta de um comando "
"preparado."
-#: org/postgresql/jdbc/PgPreparedStatement.java:119
-#: org/postgresql/jdbc/PgStatement.java:286
-msgid "Multiple ResultSets were returned by the query."
-msgstr "ResultSets múltiplos foram retornados pela consulta."
-
-#: org/postgresql/jdbc/PgPreparedStatement.java:270
+#: org/postgresql/jdbc/PgPreparedStatement.java:249
msgid "Unknown Types value."
msgstr "Valor de Types desconhecido."
-#: org/postgresql/jdbc/PgPreparedStatement.java:417
-#: org/postgresql/jdbc/PgPreparedStatement.java:486
-#: org/postgresql/jdbc/PgPreparedStatement.java:1251
-#: org/postgresql/jdbc/PgPreparedStatement.java:1583
+#: org/postgresql/jdbc/PgPreparedStatement.java:382
+#: org/postgresql/jdbc/PgPreparedStatement.java:439
+#: org/postgresql/jdbc/PgPreparedStatement.java:1191
+#: org/postgresql/jdbc/PgPreparedStatement.java:1490
#, java-format
msgid "Invalid stream length {0}."
msgstr "Tamanho de dado {0} é inválido."
-#: org/postgresql/jdbc/PgPreparedStatement.java:447
+#: org/postgresql/jdbc/PgPreparedStatement.java:411
#, java-format
msgid "The JVM claims not to support the {0} encoding."
msgstr "A JVM reclamou que não suporta a codificação {0}."
-#: org/postgresql/jdbc/PgPreparedStatement.java:450
-#: org/postgresql/jdbc/PgPreparedStatement.java:519
-#: org/postgresql/jdbc/PgResultSet.java:1075
-#: org/postgresql/jdbc/PgResultSet.java:1109
+#: org/postgresql/jdbc/PgPreparedStatement.java:414
+#: org/postgresql/jdbc/PgResultSet.java:1122
+#: org/postgresql/jdbc/PgResultSet.java:1156
msgid "Provided InputStream failed."
msgstr "InputStream fornecido falhou."
-#: org/postgresql/jdbc/PgPreparedStatement.java:536
-#: org/postgresql/jdbc/PgPreparedStatement.java:1170
+#: org/postgresql/jdbc/PgPreparedStatement.java:460
+#: org/postgresql/jdbc/PgPreparedStatement.java:1096
#, java-format
msgid "Unknown type {0}."
msgstr "Tipo desconhecido {0}."
-#: org/postgresql/jdbc/PgPreparedStatement.java:553
+#: org/postgresql/jdbc/PgPreparedStatement.java:477
msgid "No hstore extension installed."
msgstr ""
-#: org/postgresql/jdbc/PgPreparedStatement.java:683
-#: org/postgresql/jdbc/PgPreparedStatement.java:705
-#: org/postgresql/jdbc/PgPreparedStatement.java:715
-#: org/postgresql/jdbc/PgPreparedStatement.java:725
+#: org/postgresql/jdbc/PgPreparedStatement.java:619
+#: org/postgresql/jdbc/PgPreparedStatement.java:642
+#: org/postgresql/jdbc/PgPreparedStatement.java:652
+#: org/postgresql/jdbc/PgPreparedStatement.java:664
#, java-format
msgid "Cannot cast an instance of {0} to type {1}"
msgstr "Não pode converter uma instância de {0} para tipo {1}"
-#: org/postgresql/jdbc/PgPreparedStatement.java:741
+#: org/postgresql/jdbc/PgPreparedStatement.java:682
#, java-format
msgid "Unsupported Types value: {0}"
msgstr "Valor de Types não é suportado: {0}"
-#: org/postgresql/jdbc/PgPreparedStatement.java:970
+#: org/postgresql/jdbc/PgPreparedStatement.java:894
#, java-format
msgid "Cannot convert an instance of {0} to type {1}"
msgstr "Não pode converter uma instância de {0} para tipo {1}"
-#: org/postgresql/jdbc/PgPreparedStatement.java:1040
+#: org/postgresql/jdbc/PgPreparedStatement.java:968
#, java-format
msgid ""
"Can''t infer the SQL type to use for an instance of {0}. Use setObject() "
@@ -1045,23 +1303,22 @@ msgstr ""
"setObject() com um valor de Types explícito para especificar o tipo a ser "
"usado."
-#: org/postgresql/jdbc/PgPreparedStatement.java:1207
-#: org/postgresql/jdbc/PgPreparedStatement.java:1303
-#: org/postgresql/jdbc/PgPreparedStatement.java:1340
+#: org/postgresql/jdbc/PgPreparedStatement.java:1133
+#: org/postgresql/jdbc/PgPreparedStatement.java:1233
msgid "Unexpected error writing large object to database."
msgstr "Erro inesperado ao escrever objeto grande no banco de dados."
-#: org/postgresql/jdbc/PgPreparedStatement.java:1278
-#: org/postgresql/jdbc/PgResultSet.java:1163
+#: org/postgresql/jdbc/PgPreparedStatement.java:1178
+#: org/postgresql/jdbc/PgResultSet.java:1210
msgid "Provided Reader failed."
msgstr "Reader fornecido falhou."
-#: org/postgresql/jdbc/PgPreparedStatement.java:1542
-#: org/postgresql/util/StreamWrapper.java:59
-msgid "Object is too large to send over the protocol."
+#: org/postgresql/jdbc/BooleanTypeUtil.java:99
+#, java-format
+msgid "Cannot cast to boolean: \"{0}\""
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:285
+#: org/postgresql/jdbc/PgResultSet.java:280
msgid ""
"Operation requires a scrollable ResultSet, but this ResultSet is "
"FORWARD_ONLY."
@@ -1069,42 +1326,34 @@ msgstr ""
"Operação requer um ResultSet rolável, mas este ResultSet é FORWARD_ONLY "
"(somente para frente)."
-#: org/postgresql/jdbc/PgResultSet.java:456
-msgid "Unexpected error while decoding character data from a large object."
-msgstr "Erro inesperado ao decodificar caracter de um objeto grande."
-
-#: org/postgresql/jdbc/PgResultSet.java:507
-#: org/postgresql/jdbc/PgResultSet.java:537
-#: org/postgresql/jdbc/PgResultSet.java:570
-#: org/postgresql/jdbc/PgResultSet.java:2964
+#: org/postgresql/jdbc/PgResultSet.java:492
+#: org/postgresql/jdbc/PgResultSet.java:532
+#: org/postgresql/jdbc/PgResultSet.java:556
+#: org/postgresql/jdbc/PgResultSet.java:594
+#: org/postgresql/jdbc/PgResultSet.java:624
#: org/postgresql/jdbc/PgResultSet.java:3008
+#: org/postgresql/jdbc/PgResultSet.java:3052
#, fuzzy, java-format
msgid "Cannot convert the column of type {0} to requested type {1}."
msgstr "Não pode converter uma instância de {0} para tipo {1}"
-#: org/postgresql/jdbc/PgResultSet.java:789
-#: org/postgresql/jdbc/PgResultSet.java:810
-#: org/postgresql/jdbc/PgResultSet.java:1797
+#: org/postgresql/jdbc/PgResultSet.java:838
+#: org/postgresql/jdbc/PgResultSet.java:859
+#: org/postgresql/jdbc/PgResultSet.java:1832
msgid "Can''t use relative move methods while on the insert row."
msgstr ""
"Não pode utilizar métodos de movimentação relativos enquanto estiver "
"inserindo registro."
-#: org/postgresql/jdbc/PgResultSet.java:829
-#: org/postgresql/jdbc/PgStatement.java:1045
-#, java-format
-msgid "Invalid fetch direction constant: {0}."
-msgstr "Constante de direção da busca é inválida: {0}."
-
-#: org/postgresql/jdbc/PgResultSet.java:840
+#: org/postgresql/jdbc/PgResultSet.java:889
msgid "Cannot call cancelRowUpdates() when on the insert row."
msgstr "Não pode chamar cancelRowUpdates() quando estiver inserindo registro."
-#: org/postgresql/jdbc/PgResultSet.java:856
+#: org/postgresql/jdbc/PgResultSet.java:905
msgid "Cannot call deleteRow() when on the insert row."
msgstr "Não pode chamar deleteRow() quando estiver inserindo registro."
-#: org/postgresql/jdbc/PgResultSet.java:863
+#: org/postgresql/jdbc/PgResultSet.java:912
msgid ""
"Currently positioned before the start of the ResultSet. You cannot call "
"deleteRow() here."
@@ -1112,7 +1361,7 @@ msgstr ""
"Posicionado antes do início do ResultSet. Você não pode chamar deleteRow() "
"aqui."
-#: org/postgresql/jdbc/PgResultSet.java:869
+#: org/postgresql/jdbc/PgResultSet.java:918
msgid ""
"Currently positioned after the end of the ResultSet. You cannot call "
"deleteRow() here."
@@ -1120,36 +1369,36 @@ msgstr ""
"Posicionado depois do fim do ResultSet. Você não pode chamar deleteRow() "
"aqui."
-#: org/postgresql/jdbc/PgResultSet.java:873
+#: org/postgresql/jdbc/PgResultSet.java:922
msgid "There are no rows in this ResultSet."
msgstr "Não há nenhum registro neste ResultSet."
-#: org/postgresql/jdbc/PgResultSet.java:914
+#: org/postgresql/jdbc/PgResultSet.java:963
msgid "Not on the insert row."
msgstr "Não está inserindo um registro."
-#: org/postgresql/jdbc/PgResultSet.java:916
+#: org/postgresql/jdbc/PgResultSet.java:965
msgid "You must specify at least one column value to insert a row."
msgstr "Você deve especificar pelo menos uma coluna para inserir um registro."
-#: org/postgresql/jdbc/PgResultSet.java:1072
-#: org/postgresql/jdbc/PgResultSet.java:1706
-#: org/postgresql/jdbc/PgResultSet.java:2377
-#: org/postgresql/jdbc/PgResultSet.java:2402
+#: org/postgresql/jdbc/PgResultSet.java:1119
+#: org/postgresql/jdbc/PgResultSet.java:1754
+#: org/postgresql/jdbc/PgResultSet.java:2416
+#: org/postgresql/jdbc/PgResultSet.java:2437
#, java-format
msgid "The JVM claims not to support the encoding: {0}"
msgstr "A JVM reclamou que não suporta a codificação: {0}"
-#: org/postgresql/jdbc/PgResultSet.java:1214
+#: org/postgresql/jdbc/PgResultSet.java:1261
msgid "Can''t refresh the insert row."
msgstr "Não pode renovar um registro inserido."
-#: org/postgresql/jdbc/PgResultSet.java:1280
+#: org/postgresql/jdbc/PgResultSet.java:1328
msgid "Cannot call updateRow() when on the insert row."
msgstr "Não pode chamar updateRow() quando estiver inserindo registro."
-#: org/postgresql/jdbc/PgResultSet.java:1287
-#: org/postgresql/jdbc/PgResultSet.java:3025
+#: org/postgresql/jdbc/PgResultSet.java:1335
+#: org/postgresql/jdbc/PgResultSet.java:3069
msgid ""
"Cannot update the ResultSet because it is either before the start or after "
"the end of the results."
@@ -1157,39 +1406,39 @@ msgstr ""
"Não pode atualizar o ResultSet porque ele está antes do início ou depois do "
"fim dos resultados."
-#: org/postgresql/jdbc/PgResultSet.java:1486
+#: org/postgresql/jdbc/PgResultSet.java:1535
msgid "ResultSets with concurrency CONCUR_READ_ONLY cannot be updated."
msgstr ""
"ResultSets com CONCUR_READ_ONLY concorrentes não podem ser atualizados."
-#: org/postgresql/jdbc/PgResultSet.java:1555
+#: org/postgresql/jdbc/PgResultSet.java:1603
#, java-format
msgid "No primary key found for table {0}."
msgstr "Nenhuma chave primária foi encontrada para tabela {0}."
-#: org/postgresql/jdbc/PgResultSet.java:1941
-#: org/postgresql/jdbc/PgResultSet.java:1946
-#: org/postgresql/jdbc/PgResultSet.java:1986
-#: org/postgresql/jdbc/PgResultSet.java:1992
-#: org/postgresql/jdbc/PgResultSet.java:2790
-#: org/postgresql/jdbc/PgResultSet.java:2796
-#: org/postgresql/jdbc/PgResultSet.java:2820
-#: org/postgresql/jdbc/PgResultSet.java:2825
-#: org/postgresql/jdbc/PgResultSet.java:2841
-#: org/postgresql/jdbc/PgResultSet.java:2862
-#: org/postgresql/jdbc/PgResultSet.java:2873
-#: org/postgresql/jdbc/PgResultSet.java:2886
-#: org/postgresql/jdbc/PgResultSet.java:3013
+#: org/postgresql/jdbc/PgResultSet.java:2011
+#: org/postgresql/jdbc/PgResultSet.java:2016
+#: org/postgresql/jdbc/PgResultSet.java:2803
+#: org/postgresql/jdbc/PgResultSet.java:2809
+#: org/postgresql/jdbc/PgResultSet.java:2834
+#: org/postgresql/jdbc/PgResultSet.java:2840
+#: org/postgresql/jdbc/PgResultSet.java:2864
+#: org/postgresql/jdbc/PgResultSet.java:2869
+#: org/postgresql/jdbc/PgResultSet.java:2885
+#: org/postgresql/jdbc/PgResultSet.java:2906
+#: org/postgresql/jdbc/PgResultSet.java:2917
+#: org/postgresql/jdbc/PgResultSet.java:2930
+#: org/postgresql/jdbc/PgResultSet.java:3057
#, java-format
msgid "Bad value for type {0} : {1}"
msgstr "Valor inválido para tipo {0} : {1}"
-#: org/postgresql/jdbc/PgResultSet.java:2564
+#: org/postgresql/jdbc/PgResultSet.java:2589
#, java-format
msgid "The column name {0} was not found in this ResultSet."
msgstr "A nome da coluna {0} não foi encontrado neste ResultSet."
-#: org/postgresql/jdbc/PgResultSet.java:2689
+#: org/postgresql/jdbc/PgResultSet.java:2725
msgid ""
"ResultSet is not updateable. The query that generated this result set must "
"select only one table, and must select all primary keys from that table. See "
@@ -1200,438 +1449,323 @@ msgstr ""
"chaves primárias daquela tabela. Veja a especificação na API do JDBC 2.1, "
"seção 5.6 para obter mais detalhes."
-#: org/postgresql/jdbc/PgResultSet.java:2701
-msgid "This ResultSet is closed."
-msgstr "Este ResultSet está fechado."
-
-#: org/postgresql/jdbc/PgResultSet.java:2732
-msgid "ResultSet not positioned properly, perhaps you need to call next."
-msgstr ""
-"ResultSet não está posicionado corretamente, talvez você precise chamar next."
-
-#: org/postgresql/jdbc/PgResultSet.java:3045
-msgid "Invalid UUID data."
-msgstr "dado UUID é inválido."
-
-#: org/postgresql/jdbc/PgSQLXML.java:150
-msgid "Unable to decode xml data."
-msgstr "Não foi possível decodificar dado xml."
-
-#: org/postgresql/jdbc/PgSQLXML.java:153
-#, java-format
-msgid "Unknown XML Source class: {0}"
-msgstr "Classe XML Source desconhecida: {0}"
-
-#: org/postgresql/jdbc/PgSQLXML.java:196
-msgid "Unable to create SAXResult for SQLXML."
-msgstr "Não foi possível criar SAXResult para SQLXML."
-
-#: org/postgresql/jdbc/PgSQLXML.java:211
-msgid "Unable to create StAXResult for SQLXML"
-msgstr "Não foi possível criar StAXResult para SQLXML"
-
-#: org/postgresql/jdbc/PgSQLXML.java:216
-#, java-format
-msgid "Unknown XML Result class: {0}"
-msgstr "Classe XML Result desconhecida: {0}"
-
-#: org/postgresql/jdbc/PgSQLXML.java:228
-msgid "This SQLXML object has already been freed."
-msgstr "Este objeto SQLXML já foi liberado."
-
-#: org/postgresql/jdbc/PgSQLXML.java:237
-msgid ""
-"This SQLXML object has not been initialized, so you cannot retrieve data "
-"from it."
-msgstr ""
-"Este objeto SQLXML não foi inicializado, então você não pode recuperar dados "
-"dele."
-
-#: org/postgresql/jdbc/PgSQLXML.java:250
-#, java-format
-msgid "Failed to convert binary xml data to encoding: {0}."
-msgstr "Falhou ao converter dados xml binários para codificação: {0}."
-
-#: org/postgresql/jdbc/PgSQLXML.java:276
-msgid "Unable to convert DOMResult SQLXML data to a string."
-msgstr ""
-"Não foi possível converter dado SQLXML do DOMResult para uma cadeia de "
-"caracteres."
-
-#: org/postgresql/jdbc/PgSQLXML.java:290
-msgid ""
-"This SQLXML object has already been initialized, so you cannot manipulate it "
-"further."
-msgstr ""
-"Este objeto SQLXML já foi inicializado, então você não pode manipulá-lo "
-"depois."
-
-#: org/postgresql/jdbc/PgStatement.java:325
-msgid "Can''t use executeWithFlags(int) on a Statement."
-msgstr ""
-
-#: org/postgresql/jdbc/PgStatement.java:484
-msgid "Maximum number of rows must be a value grater than or equal to 0."
-msgstr "Número máximo de registros deve ser um valor maior ou igual a 0."
-
-#: org/postgresql/jdbc/PgStatement.java:525
-msgid "Query timeout must be a value greater than or equals to 0."
-msgstr "Tempo de espera da consulta deve ser um valor maior ou igual a 0."
-
-#: org/postgresql/jdbc/PgStatement.java:561
-msgid "The maximum field size must be a value greater than or equal to 0."
-msgstr "O tamanho máximo de um campo deve ser um valor maior ou igual a 0."
-
-#: org/postgresql/jdbc/PgStatement.java:871
-msgid "This statement has been closed."
-msgstr "Este comando foi fechado."
-
-#: org/postgresql/jdbc/PgStatement.java:1148
-msgid ""
-"Returning autogenerated keys is only supported for 8.2 and later servers."
-msgstr ""
-"Retorno de chaves geradas automaticamente só é suportado por servidores 8.2 "
-"ou mais recentes."
+#: org/postgresql/jdbc/PgResultSet.java:2737
+msgid "This ResultSet is closed."
+msgstr "Este ResultSet está fechado."
-#: org/postgresql/jdbc/PgStatement.java:1326
-#: org/postgresql/jdbc/PgStatement.java:1357
-msgid "Returning autogenerated keys by column index is not supported."
+#: org/postgresql/jdbc/PgResultSet.java:2768
+msgid "ResultSet not positioned properly, perhaps you need to call next."
msgstr ""
-"Retorno de chaves geradas automaticamente por índice de coluna não é "
-"suportado."
-
-#: org/postgresql/jdbc/PSQLSavepoint.java:40
-#: org/postgresql/jdbc/PSQLSavepoint.java:54
-#: org/postgresql/jdbc/PSQLSavepoint.java:72
-msgid "Cannot reference a savepoint after it has been released."
-msgstr "Não pode referenciar um savepoint após ele ser descartado."
+"ResultSet não está posicionado corretamente, talvez você precise chamar next."
-#: org/postgresql/jdbc/PSQLSavepoint.java:45
-msgid "Cannot retrieve the id of a named savepoint."
-msgstr "Não pode recuperar o id de um savepoint com nome."
+#: org/postgresql/jdbc/PgResultSet.java:3089
+msgid "Invalid UUID data."
+msgstr "dado UUID é inválido."
-#: org/postgresql/jdbc/PSQLSavepoint.java:59
-msgid "Cannot retrieve the name of an unnamed savepoint."
-msgstr "Não pode recuperar o nome de um savepoint sem nome."
+#: org/postgresql/jdbc/PgResultSet.java:3178
+#: org/postgresql/jdbc/PgResultSet.java:3185
+#: org/postgresql/jdbc/PgResultSet.java:3196
+#: org/postgresql/jdbc/PgResultSet.java:3207
+#: org/postgresql/jdbc/PgResultSet.java:3218
+#: org/postgresql/jdbc/PgResultSet.java:3229
+#: org/postgresql/jdbc/PgResultSet.java:3240
+#: org/postgresql/jdbc/PgResultSet.java:3251
+#: org/postgresql/jdbc/PgResultSet.java:3262
+#: org/postgresql/jdbc/PgResultSet.java:3269
+#: org/postgresql/jdbc/PgResultSet.java:3276
+#: org/postgresql/jdbc/PgResultSet.java:3287
+#: org/postgresql/jdbc/PgResultSet.java:3304
+#: org/postgresql/jdbc/PgResultSet.java:3311
+#: org/postgresql/jdbc/PgResultSet.java:3318
+#: org/postgresql/jdbc/PgResultSet.java:3329
+#: org/postgresql/jdbc/PgResultSet.java:3336
+#: org/postgresql/jdbc/PgResultSet.java:3343
+#: org/postgresql/jdbc/PgResultSet.java:3381
+#: org/postgresql/jdbc/PgResultSet.java:3388
+#: org/postgresql/jdbc/PgResultSet.java:3395
+#: org/postgresql/jdbc/PgResultSet.java:3415
+#: org/postgresql/jdbc/PgResultSet.java:3428
+#, fuzzy, java-format
+msgid "conversion to {0} from {1} not supported"
+msgstr "Nível de isolamento da transação {0} não é suportado."
-#: org/postgresql/jdbc/TimestampUtils.java:298
+#: org/postgresql/jdbc/TimestampUtils.java:355
+#: org/postgresql/jdbc/TimestampUtils.java:423
#, fuzzy, java-format
msgid "Bad value for type timestamp/date/time: {1}"
msgstr "Valor inválido para tipo {0} : {1}"
-#: org/postgresql/jdbc/TimestampUtils.java:359
-msgid ""
-"Infinite value found for timestamp/date. This cannot be represented as time."
-msgstr ""
-"Valor infinito encontrado em timestamp/date. Isto não pode ser representado "
-"como tempo."
-
-#: org/postgresql/jdbc/TimestampUtils.java:674
-#: org/postgresql/jdbc/TimestampUtils.java:710
-#: org/postgresql/jdbc/TimestampUtils.java:757
+#: org/postgresql/jdbc/TimestampUtils.java:858
+#: org/postgresql/jdbc/TimestampUtils.java:915
+#: org/postgresql/jdbc/TimestampUtils.java:961
+#: org/postgresql/jdbc/TimestampUtils.java:1010
#, fuzzy, java-format
msgid "Unsupported binary encoding of {0}."
msgstr "Valor de Types não é suportado: {0}"
-#: org/postgresql/largeobject/LargeObjectManager.java:147
-msgid "Failed to initialize LargeObject API"
-msgstr "Falhou ao inicializar API de Objetos Grandes"
-
-#: org/postgresql/largeobject/LargeObjectManager.java:265
-#: org/postgresql/largeobject/LargeObjectManager.java:308
-msgid "Large Objects may not be used in auto-commit mode."
-msgstr ""
-"Objetos Grandes não podem ser usados no modo de efetivação automática (auto-"
-"commit)."
+#: org/postgresql/jdbc/PgCallableStatement.java:86
+#: org/postgresql/jdbc/PgCallableStatement.java:96
+msgid "A CallableStatement was executed with nothing returned."
+msgstr "Uma função foi executada e nada foi retornado."
-#: org/postgresql/osgi/PGDataSourceFactory.java:85
-#, fuzzy, java-format
-msgid "Unsupported properties: {0}"
-msgstr "Valor de Types não é suportado: {0}"
+#: org/postgresql/jdbc/PgCallableStatement.java:107
+msgid "A CallableStatement was executed with an invalid number of parameters"
+msgstr "Uma função foi executada com um número inválido de parâmetros"
-#: org/postgresql/PGProperty.java:450 org/postgresql/PGProperty.java:470
+#: org/postgresql/jdbc/PgCallableStatement.java:145
#, java-format
-msgid "{0} parameter value must be an integer but was: {1}"
-msgstr ""
-
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:125
msgid ""
-"Could not find a java cryptographic algorithm: X.509 CertificateFactory not "
-"available."
-msgstr ""
-
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:135
-#, java-format
-msgid "Could not open SSL certificate file {0}."
-msgstr ""
-
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:140
-#, java-format
-msgid "Loading the SSL certificate {0} into a KeyManager failed."
+"A CallableStatement function was executed and the out parameter {0} was of "
+"type {1} however type {2} was registered."
msgstr ""
+"Uma função foi executada e o parâmetro de retorno {0} era do tipo {1} "
+"contudo tipo {2} foi registrado."
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:195
-msgid "Enter SSL password: "
+#: org/postgresql/jdbc/PgCallableStatement.java:202
+msgid ""
+"This statement does not declare an OUT parameter. Use '{' ?= call ... '}' "
+"to declare one."
msgstr ""
+"Este comando não declara um parâmetro de saída. Utilize '{' ?= chamada ... "
+"'}' para declarar um)"
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:202
-msgid "Could not read password for SSL key file, console is not available."
-msgstr ""
+#: org/postgresql/jdbc/PgCallableStatement.java:246
+msgid "wasNull cannot be call before fetching a result."
+msgstr "wasNull não pode ser chamado antes de obter um resultado."
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:207
+#: org/postgresql/jdbc/PgCallableStatement.java:384
+#: org/postgresql/jdbc/PgCallableStatement.java:403
#, java-format
-msgid "Could not read password for SSL key file by callbackhandler {0}."
+msgid ""
+"Parameter of type {0} was registered, but call to get{1} (sqltype={2}) was "
+"made."
msgstr ""
+"Parâmetro do tipo {0} foi registrado, mas uma chamada a get{1} (tiposql={2}) "
+"foi feita."
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:226
-#, java-format
-msgid "Could not decrypt SSL key file {0}."
+#: org/postgresql/jdbc/PgCallableStatement.java:424
+msgid ""
+"A CallableStatement was declared, but no call to registerOutParameter(1, "
+"<some type>) was made."
msgstr ""
+"Uma função foi declarada mas nenhuma chamada a registerOutParameter (1, "
+"<algum_tipo>) foi feita."
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:240
-#, java-format
-msgid "Could not read SSL key file {0}."
-msgstr ""
+#: org/postgresql/jdbc/PgCallableStatement.java:430
+msgid "No function outputs were registered."
+msgstr "Nenhum saída de função foi registrada."
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:243
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:162
-#, java-format
-msgid "Could not find a java cryptographic algorithm: {0}."
+#: org/postgresql/jdbc/PgCallableStatement.java:436
+msgid ""
+"Results cannot be retrieved from a CallableStatement before it is executed."
msgstr ""
+"Resultados não podem ser recuperados de uma função antes dela ser executada."
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:90
+#: org/postgresql/jdbc/PgCallableStatement.java:703
#, fuzzy, java-format
-msgid "The password callback class provided {0} could not be instantiated."
-msgstr "A classe SSLSocketFactory forneceu {0} que não pôde ser instanciado."
+msgid "Unsupported type conversion to {1}."
+msgstr "Valor de Types não é suportado: {0}"
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:123
+#: org/postgresql/jdbc/EscapedFunctions.java:240
#, java-format
-msgid "Could not open SSL root certificate file {0}."
-msgstr ""
+msgid "{0} function takes four and only four argument."
+msgstr "função {0} recebe somente quatro argumentos."
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:139
+#: org/postgresql/jdbc/EscapedFunctions.java:270
+#: org/postgresql/jdbc/EscapedFunctions.java:344
+#: org/postgresql/jdbc/EscapedFunctions.java:749
+#: org/postgresql/jdbc/EscapedFunctions.java:787
#, java-format
-msgid "Could not read SSL root certificate file {0}."
-msgstr ""
+msgid "{0} function takes two and only two arguments."
+msgstr "função {0} recebe somente dois argumentos."
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:143
+#: org/postgresql/jdbc/EscapedFunctions.java:288
+#: org/postgresql/jdbc/EscapedFunctions.java:326
+#: org/postgresql/jdbc/EscapedFunctions.java:446
+#: org/postgresql/jdbc/EscapedFunctions.java:461
+#: org/postgresql/jdbc/EscapedFunctions.java:476
+#: org/postgresql/jdbc/EscapedFunctions.java:491
+#: org/postgresql/jdbc/EscapedFunctions.java:506
+#: org/postgresql/jdbc/EscapedFunctions.java:521
+#: org/postgresql/jdbc/EscapedFunctions.java:536
+#: org/postgresql/jdbc/EscapedFunctions.java:551
+#: org/postgresql/jdbc/EscapedFunctions.java:566
+#: org/postgresql/jdbc/EscapedFunctions.java:581
+#: org/postgresql/jdbc/EscapedFunctions.java:596
+#: org/postgresql/jdbc/EscapedFunctions.java:611
+#: org/postgresql/jdbc/EscapedFunctions.java:775
#, java-format
-msgid "Loading the SSL root certificate {0} into a TrustManager failed."
-msgstr ""
-
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:156
-msgid "Could not initialize SSL context."
-msgstr ""
+msgid "{0} function takes one and only one argument."
+msgstr "função {0} recebe somente um argumento."
-#: org/postgresql/ssl/MakeSSL.java:52
+#: org/postgresql/jdbc/EscapedFunctions.java:310
+#: org/postgresql/jdbc/EscapedFunctions.java:391
#, java-format
-msgid "The SSLSocketFactory class provided {0} could not be instantiated."
-msgstr "A classe SSLSocketFactory forneceu {0} que não pôde ser instanciado."
+msgid "{0} function takes two or three arguments."
+msgstr "função {0} recebe dois ou três argumentos."
-#: org/postgresql/ssl/MakeSSL.java:67
+#: org/postgresql/jdbc/EscapedFunctions.java:416
+#: org/postgresql/jdbc/EscapedFunctions.java:431
+#: org/postgresql/jdbc/EscapedFunctions.java:734
+#: org/postgresql/jdbc/EscapedFunctions.java:764
#, java-format
-msgid "SSL error: {0}"
-msgstr ""
-
-#: org/postgresql/ssl/MakeSSL.java:78
-#, fuzzy, java-format
-msgid "The HostnameVerifier class provided {0} could not be instantiated."
-msgstr "A classe SSLSocketFactory forneceu {0} que não pôde ser instanciado."
+msgid "{0} function doesn''t take any argument."
+msgstr "função {0} não recebe nenhum argumento."
-#: org/postgresql/ssl/MakeSSL.java:84
+#: org/postgresql/jdbc/EscapedFunctions.java:627
+#: org/postgresql/jdbc/EscapedFunctions.java:680
#, java-format
-msgid "The hostname {0} could not be verified by hostnameverifier {1}."
-msgstr ""
+msgid "{0} function takes three and only three arguments."
+msgstr "função {0} recebe três e somente três argumentos."
-#: org/postgresql/ssl/MakeSSL.java:93
+#: org/postgresql/jdbc/EscapedFunctions.java:640
+#: org/postgresql/jdbc/EscapedFunctions.java:661
+#: org/postgresql/jdbc/EscapedFunctions.java:664
+#: org/postgresql/jdbc/EscapedFunctions.java:697
+#: org/postgresql/jdbc/EscapedFunctions.java:710
+#: org/postgresql/jdbc/EscapedFunctions.java:713
#, java-format
-msgid "The hostname {0} could not be verified."
-msgstr ""
+msgid "Interval {0} not yet implemented"
+msgstr "Intervalo {0} ainda não foi implementado"
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:167
-msgid "The sslfactoryarg property may not be empty."
+#: org/postgresql/PGProperty.java:535 org/postgresql/PGProperty.java:555
+#, java-format
+msgid "{0} parameter value must be an integer but was: {1}"
msgstr ""
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:183
-msgid ""
-"The environment variable containing the server's SSL certificate must not be "
-"empty."
-msgstr ""
+#: org/postgresql/largeobject/LargeObjectManager.java:144
+msgid "Failed to initialize LargeObject API"
+msgstr "Falhou ao inicializar API de Objetos Grandes"
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:191
-msgid ""
-"The system property containing the server's SSL certificate must not be "
-"empty."
+#: org/postgresql/largeobject/LargeObjectManager.java:262
+#: org/postgresql/largeobject/LargeObjectManager.java:305
+msgid "Large Objects may not be used in auto-commit mode."
msgstr ""
+"Objetos Grandes não podem ser usados no modo de efetivação automática (auto-"
+"commit)."
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:198
-msgid ""
-"The sslfactoryarg property must start with the prefix file:, classpath:, "
-"env:, sys:, or -----BEGIN CERTIFICATE-----."
+#: org/postgresql/copy/PGCopyInputStream.java:51
+#, java-format
+msgid "Copying from database failed: {0}"
msgstr ""
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:210
+#: org/postgresql/copy/PGCopyInputStream.java:67
+#: org/postgresql/copy/PGCopyOutputStream.java:94
#, fuzzy
-msgid "An error occurred reading the certificate"
-msgstr "Um erro ocorreu ao estabelecer uma conexão SSL."
+msgid "This copy stream is closed."
+msgstr "Este ResultSet está fechado."
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:243
-msgid "No X509TrustManager found"
+#: org/postgresql/copy/PGCopyInputStream.java:110
+msgid "Read from copy failed."
msgstr ""
-#: org/postgresql/util/PGInterval.java:155
-msgid "Conversion of interval failed"
-msgstr "Conversão de interval falhou"
-
-#: org/postgresql/util/PGmoney.java:65
-msgid "Conversion of money failed."
-msgstr "Conversão de money falhou."
-
-#: org/postgresql/util/ServerErrorMessage.java:165
-#, java-format
-msgid "Detail: {0}"
-msgstr "Detalhe: {0}"
-
-#: org/postgresql/util/ServerErrorMessage.java:170
+#: org/postgresql/copy/CopyManager.java:53
#, java-format
-msgid "Hint: {0}"
-msgstr "Dica: {0}"
-
-#: org/postgresql/util/ServerErrorMessage.java:174
-#, java-format
-msgid "Position: {0}"
-msgstr "Posição: {0}"
+msgid "Requested CopyIn but got {0}"
+msgstr ""
-#: org/postgresql/util/ServerErrorMessage.java:178
+#: org/postgresql/copy/CopyManager.java:64
#, java-format
-msgid "Where: {0}"
-msgstr "Onde: {0}"
+msgid "Requested CopyOut but got {0}"
+msgstr ""
-#: org/postgresql/util/ServerErrorMessage.java:184
+#: org/postgresql/copy/CopyManager.java:75
#, java-format
-msgid "Internal Query: {0}"
-msgstr "Consulta Interna: {0}"
+msgid "Requested CopyDual but got {0}"
+msgstr ""
-#: org/postgresql/util/ServerErrorMessage.java:188
+#: org/postgresql/copy/PGCopyOutputStream.java:71
#, java-format
-msgid "Internal Position: {0}"
-msgstr "Posição Interna: {0}"
+msgid "Cannot write to copy a byte of value {0}"
+msgstr ""
-#: org/postgresql/util/ServerErrorMessage.java:195
-#, java-format
-msgid "Location: File: {0}, Routine: {1}, Line: {2}"
-msgstr "Local: Arquivo: {0}, Rotina: {1}, Linha: {2}"
+#: org/postgresql/fastpath/Fastpath.java:80
+#, fuzzy, java-format
+msgid "Fastpath call {0} - No result was returned and we expected a numeric."
+msgstr ""
+"Chamada ao Fastpath {0} - Nenhum resultado foi retornado e nós esperávamos "
+"um inteiro."
-#: org/postgresql/util/ServerErrorMessage.java:200
+#: org/postgresql/fastpath/Fastpath.java:157
#, java-format
-msgid "Server SQLState: {0}"
-msgstr "SQLState: {0}"
+msgid "Fastpath call {0} - No result was returned and we expected an integer."
+msgstr ""
+"Chamada ao Fastpath {0} - Nenhum resultado foi retornado e nós esperávamos "
+"um inteiro."
-#: org/postgresql/xa/PGXAConnection.java:148
+#: org/postgresql/fastpath/Fastpath.java:165
+#, fuzzy, java-format
msgid ""
-"Transaction control methods setAutoCommit(true), commit, rollback and "
-"setSavePoint not allowed while an XA transaction is active."
+"Fastpath call {0} - No result was returned or wrong size while expecting an "
+"integer."
msgstr ""
+"Chamada ao Fastpath {0} - Nenhum resultado foi retornado e nós esperávamos "
+"um inteiro."
-#: org/postgresql/xa/PGXAConnection.java:196
-#: org/postgresql/xa/PGXAConnection.java:265
-msgid "Invalid flags"
-msgstr "Marcadores inválidos"
-
-#: org/postgresql/xa/PGXAConnection.java:200
-#: org/postgresql/xa/PGXAConnection.java:269
-#: org/postgresql/xa/PGXAConnection.java:437
-msgid "xid must not be null"
-msgstr "xid não deve ser nulo"
-
-#: org/postgresql/xa/PGXAConnection.java:204
-msgid "Connection is busy with another transaction"
-msgstr "Conexão está ocupada com outra transação"
-
-#: org/postgresql/xa/PGXAConnection.java:213
-#: org/postgresql/xa/PGXAConnection.java:279
-msgid "suspend/resume not implemented"
-msgstr "suspender/recomeçar não está implementado"
-
-#: org/postgresql/xa/PGXAConnection.java:219
-#: org/postgresql/xa/PGXAConnection.java:224
-#: org/postgresql/xa/PGXAConnection.java:228
-msgid "Transaction interleaving not implemented"
-msgstr "Intercalação de transação não está implementado"
-
-#: org/postgresql/xa/PGXAConnection.java:239
-msgid "Error disabling autocommit"
-msgstr "Erro ao desabilitar autocommit"
-
-#: org/postgresql/xa/PGXAConnection.java:273
-msgid "tried to call end without corresponding start call"
-msgstr "tentou executar end sem a chamada ao start correspondente"
+#: org/postgresql/fastpath/Fastpath.java:182
+#, fuzzy, java-format
+msgid "Fastpath call {0} - No result was returned and we expected a long."
+msgstr ""
+"Chamada ao Fastpath {0} - Nenhum resultado foi retornado e nós esperávamos "
+"um inteiro."
-#: org/postgresql/xa/PGXAConnection.java:305
+#: org/postgresql/fastpath/Fastpath.java:190
+#, fuzzy, java-format
msgid ""
-"Not implemented: Prepare must be issued using the same connection that "
-"started the transaction"
+"Fastpath call {0} - No result was returned or wrong size while expecting a "
+"long."
msgstr ""
-"Não está implementado: Prepare deve ser executado utilizando a mesma conexão "
-"que iniciou a transação"
-
-#: org/postgresql/xa/PGXAConnection.java:309
-msgid "Prepare called before end"
-msgstr "Prepare executado antes do end"
+"Chamada ao Fastpath {0} - Nenhum resultado foi retornado e nós esperávamos "
+"um inteiro."
-#: org/postgresql/xa/PGXAConnection.java:317
-msgid "Server versions prior to 8.1 do not support two-phase commit."
-msgstr ""
-"Versões do servidor anteriores a 8.1 não suportam efetivação em duas fases."
+#: org/postgresql/fastpath/Fastpath.java:302
+#, java-format
+msgid "The fastpath function {0} is unknown."
+msgstr "A função do fastpath {0} é desconhecida."
-#: org/postgresql/xa/PGXAConnection.java:334
-msgid "Error preparing transaction"
-msgstr "Erro ao preparar transação"
+#~ msgid ""
+#~ "Connection refused. Check that the hostname and port are correct and that "
+#~ "the postmaster is accepting TCP/IP connections."
+#~ msgstr ""
+#~ "Conexão negada. Verifique se o nome da máquina e a porta estão corretos e "
+#~ "se o postmaster está aceitando conexões TCP/IP."
-#: org/postgresql/xa/PGXAConnection.java:349
-msgid "Invalid flag"
-msgstr "Marcador inválido"
+#, fuzzy
+#~ msgid "The connection url is invalid."
+#~ msgstr "A tentativa de conexão falhou."
-#: org/postgresql/xa/PGXAConnection.java:384
-msgid "Error during recover"
-msgstr "Erro durante recuperação"
+#~ msgid "Connection rejected: {0}."
+#~ msgstr "Conexão negada: {0}."
-#: org/postgresql/xa/PGXAConnection.java:423
-#: org/postgresql/xa/PGXAConnection.java:426
-msgid "Error rolling back prepared transaction"
-msgstr "Erro ao cancelar transação preparada"
+#~ msgid "Backend start-up failed: {0}."
+#~ msgstr "Inicialização do processo servidor falhou: {0}."
-#: org/postgresql/xa/PGXAConnection.java:464
-msgid ""
-"Not implemented: one-phase commit must be issued using the same connection "
-"that was used to start it"
-msgstr ""
-"Não está implementado: efetivada da primeira fase deve ser executada "
-"utilizando a mesma conexão que foi utilizada para iniciá-la"
+#~ msgid "Server versions prior to 8.0 do not support savepoints."
+#~ msgstr "Versões do servidor anteriores a 8.0 não suportam savepoints."
-#: org/postgresql/xa/PGXAConnection.java:468
-msgid "commit called before end"
-msgstr "commit executado antes do end"
+#~ msgid "Unexpected error while decoding character data from a large object."
+#~ msgstr "Erro inesperado ao decodificar caracter de um objeto grande."
-#: org/postgresql/xa/PGXAConnection.java:478
-msgid "Error during one-phase commit"
-msgstr "Erro durante efetivação de uma fase"
+#~ msgid ""
+#~ "Returning autogenerated keys is only supported for 8.2 and later servers."
+#~ msgstr ""
+#~ "Retorno de chaves geradas automaticamente só é suportado por servidores "
+#~ "8.2 ou mais recentes."
-#: org/postgresql/xa/PGXAConnection.java:497
-msgid ""
-"Not implemented: 2nd phase commit must be issued using an idle connection"
-msgstr ""
-"Não está implementado: efetivação da segunda fase deve ser executada "
-"utilizado uma conexão ociosa"
+#~ msgid ""
+#~ "Infinite value found for timestamp/date. This cannot be represented as "
+#~ "time."
+#~ msgstr ""
+#~ "Valor infinito encontrado em timestamp/date. Isto não pode ser "
+#~ "representado como tempo."
-#: org/postgresql/xa/PGXAConnection.java:513
-#, fuzzy
-msgid "Error committing prepared transaction"
-msgstr "Erro ao cancelar transação preparada"
+#~ msgid "Server versions prior to 8.1 do not support two-phase commit."
+#~ msgstr ""
+#~ "Versões do servidor anteriores a 8.1 não suportam efetivação em duas "
+#~ "fases."
-#: org/postgresql/xa/PGXAConnection.java:529
-msgid "Heuristic commit/rollback not supported"
-msgstr "Efetivação/Cancelamento heurístico não é suportado"
+#~ msgid "Invalid flag"
+#~ msgstr "Marcador inválido"
#~ msgid "The class {0} does not implement org.postgresql.util.PGobject."
#~ msgstr "A classe {0} não implementa org.postgresql.util.PGobject."
diff --git a/pgjdbc/src/main/java/org/postgresql/translation/ru.po b/pgjdbc/src/main/java/org/postgresql/translation/ru.po
index 2441934..7d575b1 100644
--- a/pgjdbc/src/main/java/org/postgresql/translation/ru.po
+++ b/pgjdbc/src/main/java/org/postgresql/translation/ru.po
@@ -13,7 +13,7 @@ msgid ""
msgstr ""
"Project-Id-Version: JDBC Driver for PostgreSQL 8.x.x\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-01-07 13:37+0300\n"
+"POT-Creation-Date: 2018-03-10 23:24+0300\n"
"PO-Revision-Date: 2016-01-07 15:09+0300\n"
"Last-Translator: Vladimir Sitnikov <sitnikov.vladimir at gmail.com>\n"
"Language-Team: pgsql-rus <pgsql-rus at yahoogroups.com>\n"
@@ -23,496 +23,621 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 1.5.7\n"
-#: org/postgresql/copy/CopyManager.java:57
-#, java-format
-msgid "Requested CopyIn but got {0}"
-msgstr "Ожидался ответ CopyIn, а получен {0}"
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:164
+msgid "The sslfactoryarg property may not be empty."
+msgstr ""
-#: org/postgresql/copy/CopyManager.java:69
-#, java-format
-msgid "Requested CopyOut but got {0}"
-msgstr "Ожидался ответ CopyOut, а получен {0}"
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:180
+msgid ""
+"The environment variable containing the server's SSL certificate must not be "
+"empty."
+msgstr ""
-# key: postgresql.geo.box
-#: org/postgresql/copy/PGCopyInputStream.java:54
-#, java-format
-msgid "Copying from database failed: {0}"
-msgstr "Ошибка при обработке ответа команды COPY: {0}"
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:188
+msgid ""
+"The system property containing the server's SSL certificate must not be "
+"empty."
+msgstr ""
-#: org/postgresql/copy/PGCopyInputStream.java:70
-#: org/postgresql/copy/PGCopyOutputStream.java:97
-msgid "This copy stream is closed."
-msgstr "Поток уже был закрыт"
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:195
+msgid ""
+"The sslfactoryarg property must start with the prefix file:, classpath:, "
+"env:, sys:, or -----BEGIN CERTIFICATE-----."
+msgstr ""
-#: org/postgresql/copy/PGCopyInputStream.java:113
-msgid "Read from copy failed."
+# key: postgresql.con.sslfail
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:207
+msgid "An error occurred reading the certificate"
+msgstr "Ошибка при чтении сертификата"
+
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:240
+msgid "No X509TrustManager found"
msgstr ""
-#: org/postgresql/copy/PGCopyOutputStream.java:74
-#, java-format
-msgid "Cannot write to copy a byte of value {0}"
-msgstr "Значение byte должно быть в диапазоне 0..255, переданное значение: {0}"
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:133
+msgid ""
+"Could not find a java cryptographic algorithm: X.509 CertificateFactory not "
+"available."
+msgstr ""
-#: org/postgresql/core/ConnectionFactory.java:74
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:143
#, java-format
-msgid "A connection could not be made using the requested protocol {0}."
-msgstr "Невозможно установить соединение с помощью протокола {0}"
+msgid "Could not open SSL certificate file {0}."
+msgstr ""
-#: org/postgresql/core/Oid.java:114
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:148
#, java-format
-msgid "oid type {0} not known and not a number"
-msgstr "Oid {0} не известен или не является числом"
+msgid "Loading the SSL certificate {0} into a KeyManager failed."
+msgstr ""
-#: org/postgresql/core/Parser.java:616
-#, java-format
-msgid "Malformed function or procedure escape syntax at offset {0}."
-msgstr "Невозможно разобрать SQL команду. Ошибка на позиции {0}"
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:205
+msgid "Enter SSL password: "
+msgstr ""
-#: org/postgresql/core/PGStream.java:497
-#, java-format
-msgid "Premature end of input stream, expected {0} bytes, but only read {1}."
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:212
+msgid "Could not read password for SSL key file, console is not available."
msgstr ""
-"Раннее завершение входного потока, ожидалось байт: {0}, но считано только {1}"
-#: org/postgresql/core/PGStream.java:538
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:217
#, java-format
-msgid "Expected an EOF from server, got: {0}"
+msgid "Could not read password for SSL key file by callbackhandler {0}."
msgstr ""
-"Неожиданный ответ от сервера. Ожидалось окончание потока, получен байт {0}"
-# key: postgresql.unexpected
-#: org/postgresql/core/SetupQueryRunner.java:90
-msgid "An unexpected result was returned by a query."
-msgstr "Запрос вернул неожиданный результат."
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:236
+#, java-format
+msgid "Could not decrypt SSL key file {0}."
+msgstr ""
-#: org/postgresql/core/UTF8Encoding.java:31
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:250
#, java-format
-msgid ""
-"Illegal UTF-8 sequence: byte {0} of {1} byte sequence is not 10xxxxxx: {2}"
+msgid "Could not read SSL key file {0}."
msgstr ""
-"Неверная последовательность UTF-8: байт {0} из {1} не подходит к маске "
-"10xxxxxx: {2}"
-#: org/postgresql/core/UTF8Encoding.java:69
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:253
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:176
#, java-format
-msgid "Illegal UTF-8 sequence: {0} bytes used to encode a {1} byte value: {2}"
+msgid "Could not find a java cryptographic algorithm: {0}."
msgstr ""
-"Неверная последовательность UTF-8: {0} bytes used to encode a {1} byte "
-"value: {2}"
-#: org/postgresql/core/UTF8Encoding.java:104
-#: org/postgresql/core/UTF8Encoding.java:131
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:99
#, java-format
-msgid "Illegal UTF-8 sequence: initial byte is {0}: {1}"
-msgstr "Неверная последовательность UTF-8: начальное значеие {0}: {1}"
+msgid "The password callback class provided {0} could not be instantiated."
+msgstr "Невозможно создать password callback с помощью указанного класса {0}"
-#: org/postgresql/core/UTF8Encoding.java:137
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:132
#, java-format
-msgid "Illegal UTF-8 sequence: final value is out of range: {0}"
+msgid "Could not open SSL root certificate file {0}."
msgstr ""
-"Неверная последовательность UTF-8: финальное значение вне области "
-"допустимых: {0}"
-#: org/postgresql/core/UTF8Encoding.java:153
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:147
#, java-format
-msgid "Illegal UTF-8 sequence: final value is a surrogate value: {0}"
+msgid "Could not read SSL root certificate file {0}."
msgstr ""
-"Неверная последовательность UTF-8: финальное значение является surrogate "
-"значением: {0}"
-
-#: org/postgresql/core/Utils.java:119 org/postgresql/core/Utils.java:136
-msgid "Zero bytes may not occur in string parameters."
-msgstr "Байт с кодом 0 не может втречаться в строковых параметрах"
-#: org/postgresql/core/Utils.java:146 org/postgresql/core/Utils.java:217
-msgid "No IOException expected from StringBuffer or StringBuilder"
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:151
+#, java-format
+msgid "Loading the SSL root certificate {0} into a TrustManager failed."
msgstr ""
-#: org/postgresql/core/Utils.java:206
-msgid "Zero bytes may not occur in identifiers."
-msgstr "Символ с кодом 0 в идентификаторах не допустим"
-
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:72
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:87
-#, java-format
-msgid "Invalid sslmode value: {0}"
-msgstr "Неверное значение sslmode: {0}"
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:170
+msgid "Could not initialize SSL context."
+msgstr ""
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:87
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:111
+#: org/postgresql/ssl/MakeSSL.java:52
#, java-format
-msgid "Invalid targetServerType value: {0}"
-msgstr "Неверное значение targetServerType: {0}"
+msgid "The SSLSocketFactory class provided {0} could not be instantiated."
+msgstr "Невозможно создать SSLSocketFactory с помощью указанного класса {0}"
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:152
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:228
+#: org/postgresql/ssl/MakeSSL.java:67
#, java-format
-msgid "Could not find a server with specified targetServerType: {0}"
-msgstr "Не удалось найти сервер с указанным значением targetServerType: {0}"
-
-# key: postgresql.con.refused
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:172
-msgid ""
-"Connection refused. Check that the hostname and port are correct and that "
-"the postmaster is accepting TCP/IP connections."
+msgid "SSL error: {0}"
msgstr ""
-"Подсоединение отклонено. Проверьте что хост и порт указаны правильно и что "
-"postmaster принимает TCP/IP-подсоединения."
-# key: postgresql.con.failed
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:181
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:262
-msgid "The connection attempt failed."
-msgstr "Ошибка при попытке подсоединения."
-
-# key: postgresql.con.failed
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:192
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:273
-msgid "The connection url is invalid."
-msgstr "Неверное значение connection url"
-
-# key: postgresql.con.sslnotsupported
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:218
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:233
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:324
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:339
-msgid "The server does not support SSL."
-msgstr "Сервер не поддерживает SSL."
-
-# key: postgresql.con.sslfail
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:249
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:355
-msgid "An error occurred while setting up the SSL connection."
-msgstr "Ошибка при установке SSL-подсоединения."
-
-# key: postgresql.con.misc
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:300
+#: org/postgresql/ssl/MakeSSL.java:78
#, java-format
-msgid "Connection rejected: {0}."
-msgstr "Подсоединение отвергнуто: {0}."
+msgid "The HostnameVerifier class provided {0} could not be instantiated."
+msgstr "Невозможно создать HostnameVerifier с помощью указанного класса {0}"
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:321
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:349
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:375
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:456
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:486
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:515
-msgid ""
-"The server requested password-based authentication, but no password was "
-"provided."
-msgstr "Сервер запросил парольную аутентификацию, но пароль не был указан."
+#: org/postgresql/ssl/MakeSSL.java:84
+#, java-format
+msgid "The hostname {0} could not be verified by hostnameverifier {1}."
+msgstr ""
-# key: postgresql.con.auth
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:405
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:625
+#: org/postgresql/ssl/MakeSSL.java:93
#, java-format
-msgid ""
-"The authentication type {0} is not supported. Check that you have configured "
-"the pg_hba.conf file to include the client''s IP address or subnet, and that "
-"it is using an authentication scheme supported by the driver."
+msgid "The hostname {0} could not be verified."
msgstr ""
-"Тип аутентификации {0} не поддерживается. Проверьте если вы сконфигурировали "
-"файл pg_hba.conf чтобы включить IP-адреса клиентов или подсеть. Также "
-"удостовертесь что он использует схему аутентификации поддерживаемую "
-"драйвером."
# key: postgresql.con.setup
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:412
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:455
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:632
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:688
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:744
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:754
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:763
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:774
-#: org/postgresql/gss/GssAction.java:130
+#: org/postgresql/gss/GssAction.java:126
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2550
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2581
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2585
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2640
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2650
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2659
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:655
msgid "Protocol error. Session setup failed."
msgstr "Ошибка протокола. Установление сессии не удалось."
-# key: postgresql.con.backend
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:443
-#, java-format
-msgid "Backend start-up failed: {0}."
-msgstr "Запуск бэкенда не удался: {0}."
+#: org/postgresql/gss/GssAction.java:137 org/postgresql/gss/MakeGSS.java:66
+#: org/postgresql/gss/MakeGSS.java:74
+msgid "GSS Authentication failed"
+msgstr ""
-# key: postgresql.res.colrange
-#: org/postgresql/core/v2/FastpathParameterList.java:63
-#: org/postgresql/core/v2/FastpathParameterList.java:89
-#: org/postgresql/core/v2/FastpathParameterList.java:100
-#: org/postgresql/core/v2/FastpathParameterList.java:111
-#: org/postgresql/core/v2/SimpleParameterList.java:70
-#: org/postgresql/core/v2/SimpleParameterList.java:94
-#: org/postgresql/core/v2/SimpleParameterList.java:105
-#: org/postgresql/core/v2/SimpleParameterList.java:116
-#: org/postgresql/core/v2/SimpleParameterList.java:127
-#: org/postgresql/core/v3/CompositeParameterList.java:36
-#: org/postgresql/core/v3/SimpleParameterList.java:53
-#: org/postgresql/core/v3/SimpleParameterList.java:64
-#: org/postgresql/jdbc/PgResultSet.java:2715
-#: org/postgresql/jdbc/PgResultSetMetaData.java:472
+#: org/postgresql/core/Parser.java:933
#, java-format
-msgid "The column index is out of range: {0}, number of columns: {1}."
-msgstr "Индекс колонки вне диапазона: {0}. Допустимые значения: 1..{1}"
+msgid "Malformed function or procedure escape syntax at offset {0}."
+msgstr "Невозможно разобрать SQL команду. Ошибка на позиции {0}"
-# key: postgresql.prep.param
-#: org/postgresql/core/v2/FastpathParameterList.java:164
-#: org/postgresql/core/v2/SimpleParameterList.java:191
-#: org/postgresql/core/v3/SimpleParameterList.java:225
+#: org/postgresql/core/SocketFactoryFactory.java:41
#, java-format
-msgid "No value specified for parameter {0}."
-msgstr "Не указано значение для параметра {0}."
+msgid "The SocketFactory class provided {0} could not be instantiated."
+msgstr "Невозможно создать SSLSocketFactory с помощью указанного класса {0}"
-#: org/postgresql/core/v2/QueryExecutorImpl.java:87
-#: org/postgresql/core/v2/QueryExecutorImpl.java:347
-#: org/postgresql/core/v3/QueryExecutorImpl.java:404
-#: org/postgresql/core/v3/QueryExecutorImpl.java:465
-#, java-format
-msgid "Expected command status BEGIN, got {0}."
-msgstr "Ожидался статус команды BEGIN, но получен {0}"
+#: org/postgresql/core/Utils.java:93 org/postgresql/core/Utils.java:110
+msgid "Zero bytes may not occur in string parameters."
+msgstr "Байт с кодом 0 не может втречаться в строковых параметрах"
-#: org/postgresql/core/v2/QueryExecutorImpl.java:92
-#: org/postgresql/core/v3/QueryExecutorImpl.java:470
-#: org/postgresql/jdbc/PgResultSet.java:1731
+#: org/postgresql/core/Utils.java:120 org/postgresql/core/Utils.java:170
+msgid "No IOException expected from StringBuffer or StringBuilder"
+msgstr ""
+
+#: org/postgresql/core/Utils.java:159
+msgid "Zero bytes may not occur in identifiers."
+msgstr "Символ с кодом 0 в идентификаторах не допустим"
+
+#: org/postgresql/core/UTF8Encoding.java:28
#, java-format
-msgid "Unexpected command status: {0}."
-msgstr "Неожиданный статус команды: {0}."
+msgid ""
+"Illegal UTF-8 sequence: byte {0} of {1} byte sequence is not 10xxxxxx: {2}"
+msgstr ""
+"Неверная последовательность UTF-8: байт {0} из {1} не подходит к маске "
+"10xxxxxx: {2}"
-# key: postgresql.con.ioerror
-#: org/postgresql/core/v2/QueryExecutorImpl.java:127
-#: org/postgresql/core/v2/QueryExecutorImpl.java:136
-#: org/postgresql/core/v2/QueryExecutorImpl.java:185
-#: org/postgresql/core/v2/QueryExecutorImpl.java:376
-#: org/postgresql/core/v3/QueryExecutorImpl.java:226
-#: org/postgresql/core/v3/QueryExecutorImpl.java:364
-#: org/postgresql/core/v3/QueryExecutorImpl.java:441
-#: org/postgresql/core/v3/QueryExecutorImpl.java:505
-#: org/postgresql/core/v3/QueryExecutorImpl.java:587
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2211
-#: org/postgresql/util/StreamWrapper.java:133
-msgid "An I/O error occurred while sending to the backend."
-msgstr "Ошибка ввода/ввывода при отправке бэкенду"
+#: org/postgresql/core/UTF8Encoding.java:66
+#, java-format
+msgid "Illegal UTF-8 sequence: {0} bytes used to encode a {1} byte value: {2}"
+msgstr ""
+"Неверная последовательность UTF-8: {0} bytes used to encode a {1} byte "
+"value: {2}"
-# key: postgresql.con.type
-#: org/postgresql/core/v2/QueryExecutorImpl.java:180
-#: org/postgresql/core/v2/QueryExecutorImpl.java:235
-#: org/postgresql/core/v2/QueryExecutorImpl.java:249
-#: org/postgresql/core/v3/QueryExecutorImpl.java:582
-#: org/postgresql/core/v3/QueryExecutorImpl.java:642
+#: org/postgresql/core/UTF8Encoding.java:102
+#: org/postgresql/core/UTF8Encoding.java:129
#, java-format
-msgid "Unknown Response Type {0}."
-msgstr "Неизвестный тип ответа {0}."
+msgid "Illegal UTF-8 sequence: initial byte is {0}: {1}"
+msgstr "Неверная последовательность UTF-8: начальное значеие {0}: {1}"
-#: org/postgresql/core/v2/QueryExecutorImpl.java:453
-#: org/postgresql/core/v2/QueryExecutorImpl.java:503
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1962
-msgid "Ran out of memory retrieving query results."
+#: org/postgresql/core/UTF8Encoding.java:135
+#, java-format
+msgid "Illegal UTF-8 sequence: final value is out of range: {0}"
msgstr ""
-"Недостаточно памяти для обработки результатов запроса. Попробуйте увеличить -"
-"Xmx или проверьте размеры обрабатываемых данных"
+"Неверная последовательность UTF-8: финальное значение вне области "
+"допустимых: {0}"
-#: org/postgresql/core/v2/QueryExecutorImpl.java:640
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2328
+#: org/postgresql/core/UTF8Encoding.java:151
#, java-format
-msgid "Unable to interpret the update count in command completion tag: {0}."
-msgstr "Не удалось узнать количество обновлённых строк по ответу {0}"
+msgid "Illegal UTF-8 sequence: final value is a surrogate value: {0}"
+msgstr ""
+"Неверная последовательность UTF-8: финальное значение является surrogate "
+"значением: {0}"
-#: org/postgresql/core/v2/QueryExecutorImpl.java:654
-msgid "Copy not implemented for protocol version 2"
-msgstr "Команда COPY не реализована для протокола версии 2"
+# key: postgresql.unexpected
+#: org/postgresql/core/SetupQueryRunner.java:64
+msgid "An unexpected result was returned by a query."
+msgstr "Запрос вернул неожиданный результат."
-#: org/postgresql/core/v2/SocketFactoryFactory.java:36
+#: org/postgresql/core/PGStream.java:486
#, java-format
-msgid "The SocketFactory class provided {0} could not be instantiated."
-msgstr "Невозможно создать SSLSocketFactory с помощью указанного класса {0}"
+msgid "Premature end of input stream, expected {0} bytes, but only read {1}."
+msgstr ""
+"Раннее завершение входного потока, ожидалось байт: {0}, но считано только {1}"
-# key: postgresql.con.refused
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:253
+#: org/postgresql/core/PGStream.java:528
#, java-format
-msgid ""
-"Connection to {0} refused. Check that the hostname and port are correct and "
-"that the postmaster is accepting TCP/IP connections."
+msgid "Expected an EOF from server, got: {0}"
msgstr ""
-"Подсоединение по адресу {0} отклонено. Проверьте что хост и порт указаны "
-"правильно и что postmaster принимает TCP/IP-подсоединения."
+"Неожиданный ответ от сервера. Ожидалось окончание потока, получен байт {0}"
-#: org/postgresql/core/v3/CopyOperationImpl.java:57
+#: org/postgresql/core/v3/CopyOperationImpl.java:54
msgid "CommandComplete expected COPY but got: "
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:83
+#: org/postgresql/core/v3/CopyInImpl.java:47
+msgid "CopyIn copy direction can't receive data"
+msgstr ""
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:161
msgid "Tried to obtain lock while already holding it"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:98
+#: org/postgresql/core/v3/QueryExecutorImpl.java:177
msgid "Tried to break lock on database connection"
msgstr ""
# key: postgresql.con.sslfail
-#: org/postgresql/core/v3/QueryExecutorImpl.java:115
+#: org/postgresql/core/v3/QueryExecutorImpl.java:195
msgid "Interrupted while waiting to obtain lock on database connection"
msgstr "Ожидание COPY блокировки прервано получением interrupt"
-#: org/postgresql/core/v3/QueryExecutorImpl.java:220
+#: org/postgresql/core/v3/QueryExecutorImpl.java:327
msgid "Unable to bind parameter values for statement."
msgstr ""
"Не в состоянии ассоциировать значения параметров для команды "
"(PGBindException)"
-#: org/postgresql/core/v3/QueryExecutorImpl.java:689
+# key: postgresql.con.ioerror
+#: org/postgresql/core/v3/QueryExecutorImpl.java:333
+#: org/postgresql/core/v3/QueryExecutorImpl.java:485
+#: org/postgresql/core/v3/QueryExecutorImpl.java:559
+#: org/postgresql/core/v3/QueryExecutorImpl.java:602
+#: org/postgresql/core/v3/QueryExecutorImpl.java:729
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2372
+#: org/postgresql/util/StreamWrapper.java:130
+msgid "An I/O error occurred while sending to the backend."
+msgstr "Ошибка ввода/ввывода при отправке бэкенду"
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:534
+#: org/postgresql/core/v3/QueryExecutorImpl.java:576
+#, java-format
+msgid "Expected command status BEGIN, got {0}."
+msgstr "Ожидался статус команды BEGIN, но получен {0}"
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:581
+#: org/postgresql/jdbc/PgResultSet.java:1778
+#, java-format
+msgid "Unexpected command status: {0}."
+msgstr "Неожиданный статус команды: {0}."
+
+# key: postgresql.con.ioerror
+#: org/postgresql/core/v3/QueryExecutorImpl.java:687
+#, fuzzy
+msgid "An error occurred while trying to get the socket timeout."
+msgstr "Ошибка ввода/ввывода при отправке бэкенду"
+
+# key: postgresql.con.type
+#: org/postgresql/core/v3/QueryExecutorImpl.java:722
+#: org/postgresql/core/v3/QueryExecutorImpl.java:798
+#, java-format
+msgid "Unknown Response Type {0}."
+msgstr "Неизвестный тип ответа {0}."
+
+# key: postgresql.con.ioerror
+#: org/postgresql/core/v3/QueryExecutorImpl.java:745
+#, fuzzy
+msgid "An error occurred while trying to reset the socket timeout."
+msgstr "Ошибка ввода/ввывода при отправке бэкенду"
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:843
msgid "Database connection failed when starting copy"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:724
+#: org/postgresql/core/v3/QueryExecutorImpl.java:878
msgid "Tried to cancel an inactive copy operation"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:765
+#: org/postgresql/core/v3/QueryExecutorImpl.java:917
msgid "Database connection failed when canceling copy operation"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:781
+#: org/postgresql/core/v3/QueryExecutorImpl.java:933
msgid "Missing expected error response to copy cancel request"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:785
+#: org/postgresql/core/v3/QueryExecutorImpl.java:937
#, java-format
msgid "Got {0} error responses to single copy cancel request"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:800
+#: org/postgresql/core/v3/QueryExecutorImpl.java:952
msgid "Tried to end inactive copy"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:815
+#: org/postgresql/core/v3/QueryExecutorImpl.java:967
msgid "Database connection failed when ending copy"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:833
-#: org/postgresql/core/v3/QueryExecutorImpl.java:855
+#: org/postgresql/core/v3/QueryExecutorImpl.java:985
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1005
msgid "Tried to write to an inactive copy operation"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:848
-#: org/postgresql/core/v3/QueryExecutorImpl.java:863
+#: org/postgresql/core/v3/QueryExecutorImpl.java:998
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1013
msgid "Database connection failed when writing to copy"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:877
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1028
msgid "Tried to read from inactive copy"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:884
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1035
msgid "Database connection failed when reading from copy"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:956
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1101
#, java-format
msgid "Received CommandComplete ''{0}'' without an active copy operation"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:983
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1126
#, java-format
msgid "Got CopyInResponse from server during an active {0}"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:999
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1140
#, java-format
msgid "Got CopyOutResponse from server during an active {0}"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1017
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1154
+#, java-format
+msgid "Got CopyBothResponse from server during an active {0}"
+msgstr ""
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1170
msgid "Got CopyData without an active copy operation"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1021
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1174
#, java-format
msgid "Unexpected copydata from server for {0}"
msgstr "Неожиданный статус команды COPY: {0}"
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1061
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2037
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1234
#, java-format
-msgid ""
-"The server''s client_encoding parameter was changed to {0}. The JDBC driver "
-"requires client_encoding to be UTF8 for correct operation."
+msgid "Unexpected packet type during copy: {0}"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1069
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2045
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1524
#, java-format
msgid ""
-"The server''s DateStyle parameter was changed to {0}. The JDBC driver "
-"requires DateStyle to begin with ISO for correct operation."
+"Bind message length {0} too long. This can be caused by very large or "
+"incorrect length specifications on InputStream parameters."
+msgstr ""
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2145
+msgid "Ran out of memory retrieving query results."
+msgstr ""
+"Недостаточно памяти для обработки результатов запроса. Попробуйте увеличить -"
+"Xmx или проверьте размеры обрабатываемых данных"
+
+# key: postgresql.con.sslnotsupported
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2313
+msgid "The driver currently does not support COPY operations."
+msgstr "Драйвер в данный момент не поддерживате операции COPY."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2487
+#, fuzzy, java-format
+msgid "Unable to parse the count in command completion tag: {0}."
+msgstr "Не удалось узнать количество обновлённых строк по ответу {0}"
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2603
+#, java-format
+msgid ""
+"The server''s client_encoding parameter was changed to {0}. The JDBC driver "
+"requires client_encoding to be UTF8 for correct operation."
+msgstr ""
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2611
+#, java-format
+msgid ""
+"The server''s DateStyle parameter was changed to {0}. The JDBC driver "
+"requires DateStyle to begin with ISO for correct operation."
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1083
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2059
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2624
#, java-format
msgid ""
"The server''s standard_conforming_strings parameter was reported as {0}. The "
"JDBC driver expected on or off."
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1122
+# key: postgresql.res.colrange
+#: org/postgresql/core/v3/SimpleParameterList.java:54
+#: org/postgresql/core/v3/SimpleParameterList.java:65
+#: org/postgresql/core/v3/CompositeParameterList.java:33
+#: org/postgresql/jdbc/PgResultSetMetaData.java:493
+#: org/postgresql/jdbc/PgResultSet.java:2751
#, java-format
-msgid "Unexpected packet type during copy: {0}"
+msgid "The column index is out of range: {0}, number of columns: {1}."
+msgstr "Индекс колонки вне диапазона: {0}. Допустимые значения: 1..{1}"
+
+# key: postgresql.prep.param
+#: org/postgresql/core/v3/SimpleParameterList.java:257
+#, java-format
+msgid "No value specified for parameter {0}."
+msgstr "Не указано значение для параметра {0}."
+
+# key: postgresql.arr.range
+#: org/postgresql/core/v3/SimpleParameterList.java:431
+#, fuzzy, java-format
+msgid "Added parameters index out of range: {0}, number of columns: {1}."
+msgstr "Индекс параметра вне диапазона: {0}. Допустимые значения: 1..{1}"
+
+# key: postgresql.con.failed
+#: org/postgresql/core/v3/replication/V3ReplicationProtocol.java:133
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:257
+msgid "The connection attempt failed."
+msgstr "Ошибка при попытке подсоединения."
+
+#: org/postgresql/core/v3/replication/V3PGReplicationStream.java:144
+#, java-format
+msgid "Unexpected packet type during replication: {0}"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1393
+#: org/postgresql/core/v3/replication/V3PGReplicationStream.java:269
+#, fuzzy
+msgid "This replication stream has been closed."
+msgstr "Соединение уже было закрыто"
+
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:109
+#, java-format
+msgid "Invalid sslmode value: {0}"
+msgstr "Неверное значение sslmode: {0}"
+
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:124
+#, java-format
+msgid "Invalid targetServerType value: {0}"
+msgstr "Неверное значение targetServerType: {0}"
+
+# key: postgresql.con.refused
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:246
#, java-format
msgid ""
-"Bind message length {0} too long. This can be caused by very large or "
-"incorrect length specifications on InputStream parameters."
+"Connection to {0} refused. Check that the hostname and port are correct and "
+"that the postmaster is accepting TCP/IP connections."
msgstr ""
+"Подсоединение по адресу {0} отклонено. Проверьте что хост и порт указаны "
+"правильно и что postmaster принимает TCP/IP-подсоединения."
+
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:272
+#, java-format
+msgid "Could not find a server with specified targetServerType: {0}"
+msgstr "Не удалось найти сервер с указанным значением targetServerType: {0}"
# key: postgresql.con.sslnotsupported
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2131
-msgid "The driver currently does not support COPY operations."
-msgstr "Драйвер в данный момент не поддерживате операции COPY."
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:366
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:379
+msgid "The server does not support SSL."
+msgstr "Сервер не поддерживает SSL."
-#: org/postgresql/Driver.java:234
-msgid "Error loading default settings from driverconfig.properties"
+# key: postgresql.con.sslfail
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:393
+msgid "An error occurred while setting up the SSL connection."
+msgstr "Ошибка при установке SSL-подсоединения."
+
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:494
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:521
+msgid ""
+"The server requested password-based authentication, but no password was "
+"provided."
+msgstr "Сервер запросил парольную аутентификацию, но пароль не был указан."
+
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:624
+msgid ""
+"SCRAM authentication is not supported by this driver. You need JDK >= 8 and "
+"pgjdbc >= 42.2.0 (not \".jre\" vesions)"
msgstr ""
-#: org/postgresql/Driver.java:247
-msgid "Properties for the driver contains a non-string value for the key "
+# key: postgresql.con.auth
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:648
+#, java-format
+msgid ""
+"The authentication type {0} is not supported. Check that you have configured "
+"the pg_hba.conf file to include the client''s IP address or subnet, and that "
+"it is using an authentication scheme supported by the driver."
msgstr ""
+"Тип аутентификации {0} не поддерживается. Проверьте если вы сконфигурировали "
+"файл pg_hba.conf чтобы включить IP-адреса клиентов или подсеть. Также "
+"удостовертесь что он использует схему аутентификации поддерживаемую "
+"драйвером."
+
+#: org/postgresql/core/ConnectionFactory.java:57
+#, java-format
+msgid "A connection could not be made using the requested protocol {0}."
+msgstr "Невозможно установить соединение с помощью протокола {0}"
-#: org/postgresql/Driver.java:290
+#: org/postgresql/core/Oid.java:116
+#, java-format
+msgid "oid type {0} not known and not a number"
+msgstr "Oid {0} не известен или не является числом"
+
+# key: postgresql.con.invalidchar
+#: org/postgresql/util/HStoreConverter.java:43
+#: org/postgresql/util/HStoreConverter.java:74
+#: org/postgresql/jdbc/PgArray.java:210
+#: org/postgresql/jdbc/PgResultSet.java:1924
msgid ""
-"Your security policy has prevented the connection from being attempted. You "
-"probably need to grant the connect java.net.SocketPermission to the database "
-"server host and port that you wish to connect to."
+"Invalid character data was found. This is most likely caused by stored data "
+"containing characters that are invalid for the character set the database "
+"was created in. The most common example of this is storing 8bit data in a "
+"SQL_ASCII database."
msgstr ""
+"Найдены неверные символьные данные. Причиной этого скорее всего являются "
+"хранимые данные содержащие символы не соответствующие набору символов базы. "
+"Типичным примером этого является хранение 8-битных данных в базе SQL_ASCII."
-# key: postgresql.unusual
-#: org/postgresql/Driver.java:296 org/postgresql/Driver.java:362
+# key: postgresql.money
+#: org/postgresql/util/PGmoney.java:62
+msgid "Conversion of money failed."
+msgstr "Ошибка при преобразовании типа money."
+
+#: org/postgresql/util/StreamWrapper.java:56
+#: org/postgresql/jdbc/PgPreparedStatement.java:1449
+msgid "Object is too large to send over the protocol."
+msgstr ""
+
+# key: postgresql.money
+#: org/postgresql/util/PGInterval.java:152
+msgid "Conversion of interval failed"
+msgstr "Невозможно обработать PGInterval: {0}"
+
+#: org/postgresql/util/ServerErrorMessage.java:45
+#, java-format
msgid ""
-"Something unusual has occurred to cause the driver to fail. Please report "
-"this exception."
+" (pgjdbc: autodetected server-encoding to be {0}, if the message is not "
+"readable, please check database logs and/or host, port, dbname, user, "
+"password, pg_hba.conf)"
msgstr ""
-"Случилось что-то необычное, что заставило драйвер произвести ошибку. "
-"Пожалуйста сообщите это исключение."
-# key: postgresql.con.failed
-#: org/postgresql/Driver.java:370
-msgid "Connection attempt timed out."
-msgstr "Закончилось время ожидания"
+# key: postgresql.error.detail
+#: org/postgresql/util/ServerErrorMessage.java:176
+#, java-format
+msgid "Detail: {0}"
+msgstr "Подробности: {0}"
-# key: postgresql.con.sslfail
-#: org/postgresql/Driver.java:383
-msgid "Interrupted while attempting to connect."
-msgstr "Подключение прервано получаением interrupt"
+# key: postgresql.error.hint
+#: org/postgresql/util/ServerErrorMessage.java:181
+#, java-format
+msgid "Hint: {0}"
+msgstr "Подсказка: {0}"
-# key: postgresql.unimplemented
-#: org/postgresql/Driver.java:645
+# key: postgresql.error.position
+#: org/postgresql/util/ServerErrorMessage.java:185
#, java-format
-msgid "Method {0} is not yet implemented."
-msgstr "Метод {0} ещё не реализован"
+msgid "Position: {0}"
+msgstr "Позиция: {0}"
+
+# key: postgresql.error.where
+#: org/postgresql/util/ServerErrorMessage.java:189
+#, java-format
+msgid "Where: {0}"
+msgstr "Где: {0}"
+
+#: org/postgresql/util/ServerErrorMessage.java:195
+#, java-format
+msgid "Internal Query: {0}"
+msgstr ""
+
+# key: postgresql.error.position
+#: org/postgresql/util/ServerErrorMessage.java:199
+#, fuzzy, java-format
+msgid "Internal Position: {0}"
+msgstr "Позиция: {0}"
+
+# key: postgresql.error.location
+#: org/postgresql/util/ServerErrorMessage.java:206
+#, java-format
+msgid "Location: File: {0}, Routine: {1}, Line: {2}"
+msgstr "Местонахождение: Файл {0}, Процедура: {1}, Строка: {2}"
+
+#: org/postgresql/util/ServerErrorMessage.java:211
+#, java-format
+msgid "Server SQLState: {0}"
+msgstr "SQLState сервера: {0}"
+
+#: org/postgresql/ds/PGPoolingDataSource.java:269
+msgid "Failed to setup DataSource."
+msgstr ""
+
+#: org/postgresql/ds/PGPoolingDataSource.java:371
+msgid "DataSource has been closed."
+msgstr "DataSource закрыт."
# key: postgresql.prep.type
-#: org/postgresql/ds/common/BaseDataSource.java:1037
-#: org/postgresql/ds/common/BaseDataSource.java:1047
+#: org/postgresql/ds/common/BaseDataSource.java:1132
+#: org/postgresql/ds/common/BaseDataSource.java:1142
#, java-format
msgid "Unsupported property name: {0}"
msgstr "Свойство {0} не поддерживается"
@@ -521,1107 +646,1110 @@ msgstr "Свойство {0} не поддерживается"
msgid "This PooledConnection has already been closed."
msgstr "Это соединение уже было закрыто"
-#: org/postgresql/ds/PGPooledConnection.java:313
+#: org/postgresql/ds/PGPooledConnection.java:314
msgid ""
"Connection has been closed automatically because a new connection was opened "
"for the same PooledConnection or the PooledConnection has been closed."
msgstr ""
-#: org/postgresql/ds/PGPooledConnection.java:314
+#: org/postgresql/ds/PGPooledConnection.java:315
msgid "Connection has been closed."
msgstr "Это соединение уже было закрыто"
-#: org/postgresql/ds/PGPooledConnection.java:418
+#: org/postgresql/ds/PGPooledConnection.java:420
msgid "Statement has been closed."
msgstr "Statement закрыт."
-#: org/postgresql/ds/PGPoolingDataSource.java:269
-msgid "Failed to setup DataSource."
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:68
+msgid "No SCRAM mechanism(s) advertised by the server"
msgstr ""
-#: org/postgresql/ds/PGPoolingDataSource.java:371
-msgid "DataSource has been closed."
-msgstr "DataSource закрыт."
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:81
+msgid "Invalid or unsupported by client SCRAM mechanisms"
+msgstr ""
+
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:117
+#, fuzzy, java-format
+msgid "Invalid server-first-message: {0}"
+msgstr "Неверное значение sslmode: {0}"
-#: org/postgresql/fastpath/Fastpath.java:82
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:147
+#, fuzzy, java-format
+msgid "Invalid server-final-message: {0}"
+msgstr "Неверное значение sslmode: {0}"
+
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:153
#, java-format
-msgid "Fastpath call {0} - No result was returned and we expected a numeric."
+msgid "SCRAM authentication failed, server returned error: {0}"
msgstr ""
-# key: postgresql.fp.expint
-#: org/postgresql/fastpath/Fastpath.java:165
-#, java-format
-msgid "Fastpath call {0} - No result was returned and we expected an integer."
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:160
+msgid "Invalid server SCRAM signature"
msgstr ""
-#: org/postgresql/fastpath/Fastpath.java:174
+# key: postgresql.prep.type
+#: org/postgresql/osgi/PGDataSourceFactory.java:82
#, java-format
-msgid ""
-"Fastpath call {0} - No result was returned or wrong size while expecting an "
-"integer."
+msgid "Unsupported properties: {0}"
+msgstr "Указанные свойства не поддерживаются: {0}"
+
+#: org/postgresql/Driver.java:214
+msgid "Error loading default settings from driverconfig.properties"
msgstr ""
-# key: postgresql.stat.result
-#: org/postgresql/fastpath/Fastpath.java:191
-#, java-format
-msgid "Fastpath call {0} - No result was returned and we expected a long."
-msgstr "Вызов fastpath {0} ничего не вернул, а ожидалось long"
+#: org/postgresql/Driver.java:226
+msgid "Properties for the driver contains a non-string value for the key "
+msgstr ""
-#: org/postgresql/fastpath/Fastpath.java:200
-#, java-format
+#: org/postgresql/Driver.java:270
msgid ""
-"Fastpath call {0} - No result was returned or wrong size while expecting a "
-"long."
+"Your security policy has prevented the connection from being attempted. You "
+"probably need to grant the connect java.net.SocketPermission to the database "
+"server host and port that you wish to connect to."
msgstr ""
-# key: postgresql.fp.unknown
-#: org/postgresql/fastpath/Fastpath.java:312
-#, java-format
-msgid "The fastpath function {0} is unknown."
+# key: postgresql.unusual
+#: org/postgresql/Driver.java:276 org/postgresql/Driver.java:408
+msgid ""
+"Something unusual has occurred to cause the driver to fail. Please report "
+"this exception."
msgstr ""
+"Случилось что-то необычное, что заставило драйвер произвести ошибку. "
+"Пожалуйста сообщите это исключение."
+
+# key: postgresql.con.failed
+#: org/postgresql/Driver.java:416
+msgid "Connection attempt timed out."
+msgstr "Закончилось время ожидания"
+
+# key: postgresql.con.sslfail
+#: org/postgresql/Driver.java:429
+msgid "Interrupted while attempting to connect."
+msgstr "Подключение прервано получаением interrupt"
+
+# key: postgresql.unimplemented
+#: org/postgresql/Driver.java:682
+#, java-format
+msgid "Method {0} is not yet implemented."
+msgstr "Метод {0} ещё не реализован"
# key: postgresql.geo.lseg
-#: org/postgresql/geometric/PGbox.java:79
-#: org/postgresql/geometric/PGcircle.java:76
-#: org/postgresql/geometric/PGcircle.java:84
-#: org/postgresql/geometric/PGline.java:109
-#: org/postgresql/geometric/PGline.java:118
-#: org/postgresql/geometric/PGlseg.java:72
-#: org/postgresql/geometric/PGpoint.java:78
+#: org/postgresql/geometric/PGlseg.java:70
+#: org/postgresql/geometric/PGline.java:107
+#: org/postgresql/geometric/PGline.java:116
+#: org/postgresql/geometric/PGcircle.java:74
+#: org/postgresql/geometric/PGcircle.java:82
+#: org/postgresql/geometric/PGpoint.java:76
+#: org/postgresql/geometric/PGbox.java:77
#, java-format
msgid "Conversion to type {0} failed: {1}."
msgstr "Ошибка при преобразовании к типу {0}: {1}"
# key: postgresql.geo.path
-#: org/postgresql/geometric/PGpath.java:73
+#: org/postgresql/geometric/PGpath.java:70
#, java-format
msgid "Cannot tell if path is open or closed: {0}."
msgstr ""
-#: org/postgresql/gss/GssAction.java:141 org/postgresql/gss/MakeGSS.java:69
-#: org/postgresql/gss/MakeGSS.java:77
-msgid "GSS Authentication failed"
+#: org/postgresql/xa/PGXAConnection.java:128
+msgid ""
+"Transaction control methods setAutoCommit(true), commit, rollback and "
+"setSavePoint not allowed while an XA transaction is active."
msgstr ""
-#: org/postgresql/jdbc/AbstractBlobClob.java:89
-msgid ""
-"Truncation of large objects is only implemented in 8.3 and later servers."
+#: org/postgresql/xa/PGXAConnection.java:177
+#: org/postgresql/xa/PGXAConnection.java:253
+#: org/postgresql/xa/PGXAConnection.java:347
+#, java-format
+msgid "Invalid flags {0}"
+msgstr "Неверные флаги {0}"
+
+#: org/postgresql/xa/PGXAConnection.java:181
+#: org/postgresql/xa/PGXAConnection.java:257
+#: org/postgresql/xa/PGXAConnection.java:449
+msgid "xid must not be null"
msgstr ""
-#: org/postgresql/jdbc/AbstractBlobClob.java:94
-msgid "Cannot truncate LOB to a negative length."
+#: org/postgresql/xa/PGXAConnection.java:185
+msgid "Connection is busy with another transaction"
msgstr ""
-#: org/postgresql/jdbc/AbstractBlobClob.java:101
-#: org/postgresql/jdbc/AbstractBlobClob.java:245
+# key: postgresql.unimplemented
+#: org/postgresql/xa/PGXAConnection.java:194
+#: org/postgresql/xa/PGXAConnection.java:267
+msgid "suspend/resume not implemented"
+msgstr "Операции XA suspend/resume не реализованы"
+
+# key: postgresql.con.isolevel
+#: org/postgresql/xa/PGXAConnection.java:202
+#: org/postgresql/xa/PGXAConnection.java:209
+#: org/postgresql/xa/PGXAConnection.java:213
#, java-format
-msgid "PostgreSQL LOBs can only index to: {0}"
+msgid ""
+"Invalid protocol state requested. Attempted transaction interleaving is not "
+"supported. xid={0}, currentXid={1}, state={2}, flags={3}"
msgstr ""
+"Чередование транзакций в одном соединении не поддерживается. Предыдущую "
+"транзакцию нужно завершить xid={0}, currentXid={1}, state={2}, flags={3}"
-#: org/postgresql/jdbc/AbstractBlobClob.java:241
-msgid "LOB positioning offsets start at 1."
+#: org/postgresql/xa/PGXAConnection.java:224
+msgid "Error disabling autocommit"
msgstr ""
-#: org/postgresql/jdbc/AbstractBlobClob.java:257
-msgid "free() was called on this LOB previously"
+#: org/postgresql/xa/PGXAConnection.java:261
+#, java-format
+msgid ""
+"tried to call end without corresponding start call. state={0}, start "
+"xid={1}, currentXid={2}, preparedXid={3}"
msgstr ""
+"Невозможно завершить транзакцию, т.к. транзакция не была начата. state={0}, "
+"start xid={1}, currentXid={2}, preparedXid={3}"
-# key: postgresql.stat.result
-#: org/postgresql/jdbc/BatchResultHandler.java:41
-#: org/postgresql/jdbc/PgConnection.java:474
-#: org/postgresql/jdbc/PgPreparedStatement.java:138
-#: org/postgresql/jdbc/PgStatement.java:299
-msgid "A result was returned when none was expected."
-msgstr "Результат возвращён когда его не ожидалось."
+#: org/postgresql/xa/PGXAConnection.java:297
+#, fuzzy, java-format
+msgid ""
+"Preparing already prepared transaction, the prepared xid {0}, prepare xid={1}"
+msgstr ""
+"Ошибка при откате подготовленной транзакции. rollback xid={0}, "
+"preparedXid={1}, currentXid={2}"
-# key: postgresql.stat.noresult
-#: org/postgresql/jdbc/BatchResultHandler.java:59
-msgid "Too many update results were returned."
-msgstr "Возвращено слишком много результатов обновления."
+#: org/postgresql/xa/PGXAConnection.java:300
+#, java-format
+msgid "Current connection does not have an associated xid. prepare xid={0}"
+msgstr ""
-# key: postgresql.stat.batch.error
-#: org/postgresql/jdbc/BatchResultHandler.java:88
+#: org/postgresql/xa/PGXAConnection.java:307
#, java-format
msgid ""
-"Batch entry {0} {1} was aborted. Call getNextException to see the cause."
+"Not implemented: Prepare must be issued using the same connection that "
+"started the transaction. currentXid={0}, prepare xid={1}"
msgstr ""
+"В каком соединении транзакцию начинали, в таком и вызывайте prepare. По-"
+"другому не работает. currentXid={0}, prepare xid={1}"
-#: org/postgresql/jdbc/EscapedFunctions.java:243
+#: org/postgresql/xa/PGXAConnection.java:311
#, java-format
-msgid "{0} function takes four and only four argument."
+msgid "Prepare called before end. prepare xid={0}, state={1}"
msgstr ""
+"Вызов prepare должен происходить только после вызова end. prepare xid={0}, "
+"state={1}"
-#: org/postgresql/jdbc/EscapedFunctions.java:273
-#: org/postgresql/jdbc/EscapedFunctions.java:347
-#: org/postgresql/jdbc/EscapedFunctions.java:752
-#: org/postgresql/jdbc/EscapedFunctions.java:790
+#: org/postgresql/xa/PGXAConnection.java:331
#, java-format
-msgid "{0} function takes two and only two arguments."
+msgid "Error preparing transaction. prepare xid={0}"
+msgstr "Ошибка при выполнении prepare для транзакции {0}"
+
+#: org/postgresql/xa/PGXAConnection.java:382
+msgid "Error during recover"
msgstr ""
-#: org/postgresql/jdbc/EscapedFunctions.java:291
-#: org/postgresql/jdbc/EscapedFunctions.java:329
-#: org/postgresql/jdbc/EscapedFunctions.java:449
-#: org/postgresql/jdbc/EscapedFunctions.java:464
-#: org/postgresql/jdbc/EscapedFunctions.java:479
-#: org/postgresql/jdbc/EscapedFunctions.java:494
-#: org/postgresql/jdbc/EscapedFunctions.java:509
-#: org/postgresql/jdbc/EscapedFunctions.java:524
-#: org/postgresql/jdbc/EscapedFunctions.java:539
-#: org/postgresql/jdbc/EscapedFunctions.java:554
-#: org/postgresql/jdbc/EscapedFunctions.java:569
-#: org/postgresql/jdbc/EscapedFunctions.java:584
-#: org/postgresql/jdbc/EscapedFunctions.java:599
-#: org/postgresql/jdbc/EscapedFunctions.java:614
-#: org/postgresql/jdbc/EscapedFunctions.java:778
+#: org/postgresql/xa/PGXAConnection.java:438
#, java-format
-msgid "{0} function takes one and only one argument."
+msgid ""
+"Error rolling back prepared transaction. rollback xid={0}, preparedXid={1}, "
+"currentXid={2}"
msgstr ""
+"Ошибка при откате подготовленной транзакции. rollback xid={0}, "
+"preparedXid={1}, currentXid={2}"
-#: org/postgresql/jdbc/EscapedFunctions.java:313
-#: org/postgresql/jdbc/EscapedFunctions.java:394
+#: org/postgresql/xa/PGXAConnection.java:471
#, java-format
-msgid "{0} function takes two or three arguments."
+msgid ""
+"One-phase commit called for xid {0} but connection was prepared with xid {1}"
msgstr ""
-#: org/postgresql/jdbc/EscapedFunctions.java:419
-#: org/postgresql/jdbc/EscapedFunctions.java:434
-#: org/postgresql/jdbc/EscapedFunctions.java:737
-#: org/postgresql/jdbc/EscapedFunctions.java:767
+#: org/postgresql/xa/PGXAConnection.java:479
+msgid ""
+"Not implemented: one-phase commit must be issued using the same connection "
+"that was used to start it"
+msgstr ""
+
+#: org/postgresql/xa/PGXAConnection.java:483
#, java-format
-msgid "{0} function doesn''t take any argument."
+msgid "One-phase commit with unknown xid. commit xid={0}, currentXid={1}"
msgstr ""
-#: org/postgresql/jdbc/EscapedFunctions.java:630
-#: org/postgresql/jdbc/EscapedFunctions.java:683
+#: org/postgresql/xa/PGXAConnection.java:487
#, java-format
-msgid "{0} function takes three and only three arguments."
+msgid "commit called before end. commit xid={0}, state={1}"
msgstr ""
+"Операция commit должна вызываться только после операции end. commit xid={0}, "
+"state={1}"
-# key: postgresql.unimplemented
-#: org/postgresql/jdbc/EscapedFunctions.java:643
-#: org/postgresql/jdbc/EscapedFunctions.java:664
-#: org/postgresql/jdbc/EscapedFunctions.java:667
-#: org/postgresql/jdbc/EscapedFunctions.java:700
-#: org/postgresql/jdbc/EscapedFunctions.java:713
-#: org/postgresql/jdbc/EscapedFunctions.java:716
+#: org/postgresql/xa/PGXAConnection.java:498
#, java-format
-msgid "Interval {0} not yet implemented"
-msgstr "Интеврвал {0} ещё не реализован"
+msgid "Error during one-phase commit. commit xid={0}"
+msgstr "Ошибка при однофазной фиксации транзакции. commit xid={0}"
-# key: postgresql.arr.range
-#: org/postgresql/jdbc/PgArray.java:166 org/postgresql/jdbc/PgArray.java:822
+#: org/postgresql/xa/PGXAConnection.java:517
+msgid ""
+"Not implemented: 2nd phase commit must be issued using an idle connection. "
+"commit xid={0}, currentXid={1}, state={2], transactionState={3}"
+msgstr ""
+"Духфазная фиксация работает только, если соединение неактивно (state=idle и "
+"транзакцция отсутствует). commit xid={0}, currentXid={1}, state={2], "
+"transactionState={3}"
+
+#: org/postgresql/xa/PGXAConnection.java:550
#, java-format
-msgid "The array index is out of range: {0}"
-msgstr "Индекс массива вне диапазона: {0}"
+msgid ""
+"Error committing prepared transaction. commit xid={0}, preparedXid={1}, "
+"currentXid={2}"
+msgstr ""
+"Ошибка при фиксации подготовленной транзакции. commit xid={0}, "
+"preparedXid={1}, currentXid={2}"
-# key: postgresql.arr.range
-#: org/postgresql/jdbc/PgArray.java:183 org/postgresql/jdbc/PgArray.java:839
+#: org/postgresql/xa/PGXAConnection.java:567
#, java-format
-msgid "The array index is out of range: {0}, number of elements: {1}."
-msgstr "Индекс массива вне диапазона: {0}. Допустимые значения: 1..{1}"
+msgid "Heuristic commit/rollback not supported. forget xid={0}"
+msgstr ""
-# key: postgresql.con.invalidchar
-#: org/postgresql/jdbc/PgArray.java:215
-#: org/postgresql/jdbc/PgResultSet.java:1885
-#: org/postgresql/util/HStoreConverter.java:38
-#: org/postgresql/util/HStoreConverter.java:69
-msgid ""
-"Invalid character data was found. This is most likely caused by stored data "
-"containing characters that are invalid for the character set the database "
-"was created in. The most common example of this is storing 8bit data in a "
-"SQL_ASCII database."
+#: org/postgresql/jdbc/PgSQLXML.java:147
+msgid "Unable to decode xml data."
msgstr ""
-"Найдены неверные символьные данные. Причиной этого скорее всего являются "
-"хранимые данные содержащие символы не соответствующие набору символов базы. "
-"Типичным примером этого является хранение 8-битных данных в базе SQL_ASCII."
-# key: postgresql.call.noreturnval
-#: org/postgresql/jdbc/PgCallableStatement.java:90
-#: org/postgresql/jdbc/PgCallableStatement.java:96
-msgid "A CallableStatement was executed with nothing returned."
+#: org/postgresql/jdbc/PgSQLXML.java:150
+#, java-format
+msgid "Unknown XML Source class: {0}"
msgstr ""
-#: org/postgresql/jdbc/PgCallableStatement.java:107
-msgid "A CallableStatement was executed with an invalid number of parameters"
+# key: postgresql.con.creobj
+#: org/postgresql/jdbc/PgSQLXML.java:193
+msgid "Unable to create SAXResult for SQLXML."
+msgstr "Невозможно создать SAXResult для SQLXML"
+
+#: org/postgresql/jdbc/PgSQLXML.java:208
+msgid "Unable to create StAXResult for SQLXML"
msgstr ""
-#: org/postgresql/jdbc/PgCallableStatement.java:139
+#: org/postgresql/jdbc/PgSQLXML.java:213
#, java-format
-msgid ""
-"A CallableStatement function was executed and the out parameter {0} was of "
-"type {1} however type {2} was registered."
+msgid "Unknown XML Result class: {0}"
msgstr ""
-#: org/postgresql/jdbc/PgCallableStatement.java:195
+#: org/postgresql/jdbc/PgSQLXML.java:225
+msgid "This SQLXML object has already been freed."
+msgstr "Этот объект SQLXML уже был закрыт"
+
+#: org/postgresql/jdbc/PgSQLXML.java:234
msgid ""
-"This statement does not declare an OUT parameter. Use '{' ?= call ... '}' "
-"to declare one."
+"This SQLXML object has not been initialized, so you cannot retrieve data "
+"from it."
msgstr ""
-#: org/postgresql/jdbc/PgCallableStatement.java:239
-msgid "wasNull cannot be call before fetching a result."
+#: org/postgresql/jdbc/PgSQLXML.java:247
+#, java-format
+msgid "Failed to convert binary xml data to encoding: {0}."
msgstr ""
-# key: postgresql.call.wrongget
-#: org/postgresql/jdbc/PgCallableStatement.java:377
-#: org/postgresql/jdbc/PgCallableStatement.java:396
-#, java-format
-msgid ""
-"Parameter of type {0} was registered, but call to get{1} (sqltype={2}) was "
-"made."
+#: org/postgresql/jdbc/PgSQLXML.java:273
+msgid "Unable to convert DOMResult SQLXML data to a string."
msgstr ""
-# key: postgresql.call.noreturntype
-#: org/postgresql/jdbc/PgCallableStatement.java:417
+#: org/postgresql/jdbc/PgSQLXML.java:287
msgid ""
-"A CallableStatement was declared, but no call to registerOutParameter(1, "
-"<some type>) was made."
+"This SQLXML object has already been initialized, so you cannot manipulate it "
+"further."
msgstr ""
-#: org/postgresql/jdbc/PgCallableStatement.java:423
-msgid "No function outputs were registered."
-msgstr ""
+#: org/postgresql/jdbc/PSQLSavepoint.java:37
+#: org/postgresql/jdbc/PSQLSavepoint.java:51
+#: org/postgresql/jdbc/PSQLSavepoint.java:69
+msgid "Cannot reference a savepoint after it has been released."
+msgstr ""
+
+#: org/postgresql/jdbc/PSQLSavepoint.java:42
+msgid "Cannot retrieve the id of a named savepoint."
+msgstr ""
+
+#: org/postgresql/jdbc/PSQLSavepoint.java:56
+msgid "Cannot retrieve the name of an unnamed savepoint."
+msgstr ""
+
+# key: postgresql.arr.range
+#: org/postgresql/jdbc/PgArray.java:157 org/postgresql/jdbc/PgArray.java:844
+#, java-format
+msgid "The array index is out of range: {0}"
+msgstr "Индекс массива вне диапазона: {0}"
+
+# key: postgresql.arr.range
+#: org/postgresql/jdbc/PgArray.java:178 org/postgresql/jdbc/PgArray.java:861
+#, java-format
+msgid "The array index is out of range: {0}, number of elements: {1}."
+msgstr "Индекс массива вне диапазона: {0}. Допустимые значения: 1..{1}"
+
+# key: postgresql.arr.range
+#: org/postgresql/jdbc/PgParameterMetaData.java:83
+#, java-format
+msgid "The parameter index is out of range: {0}, number of parameters: {1}."
+msgstr "Индекс параметра вне диапазона: {0}. Допустимые значения: 1..{1}"
+
+# key: postgresql.stat.noresult
+#: org/postgresql/jdbc/BatchResultHandler.java:92
+msgid "Too many update results were returned."
+msgstr "Возвращено слишком много результатов обновления."
-#: org/postgresql/jdbc/PgCallableStatement.java:429
+#: org/postgresql/jdbc/BatchResultHandler.java:146
+#, java-format
msgid ""
-"Results cannot be retrieved from a CallableStatement before it is executed."
+"Batch entry {0} {1} was aborted: {2} Call getNextException to see other "
+"errors in the batch."
msgstr ""
# key: postgresql.prep.type
-#: org/postgresql/jdbc/PgConnection.java:312
+#: org/postgresql/jdbc/PgConnection.java:272
#, java-format
msgid "Unsupported value for stringtype parameter: {0}"
msgstr "Неподдерживаемое значение для параметра stringtype: {0}"
# key: postgresql.stat.noresult
-#: org/postgresql/jdbc/PgConnection.java:457
-#: org/postgresql/jdbc/PgPreparedStatement.java:115
-#: org/postgresql/jdbc/PgStatement.java:282
-#: org/postgresql/jdbc/TypeInfoCache.java:230
-#: org/postgresql/jdbc/TypeInfoCache.java:370
-#: org/postgresql/jdbc/TypeInfoCache.java:412
+#: org/postgresql/jdbc/PgConnection.java:424
+#: org/postgresql/jdbc/PgStatement.java:225
+#: org/postgresql/jdbc/TypeInfoCache.java:226
+#: org/postgresql/jdbc/TypeInfoCache.java:371
+#: org/postgresql/jdbc/TypeInfoCache.java:411
+#: org/postgresql/jdbc/TypeInfoCache.java:484
#: org/postgresql/jdbc/TypeInfoCache.java:489
-#: org/postgresql/jdbc/TypeInfoCache.java:494
-#: org/postgresql/jdbc/TypeInfoCache.java:535
-#: org/postgresql/jdbc/TypeInfoCache.java:540
+#: org/postgresql/jdbc/TypeInfoCache.java:526
+#: org/postgresql/jdbc/TypeInfoCache.java:531
+#: org/postgresql/jdbc/PgPreparedStatement.java:119
msgid "No results were returned by the query."
msgstr "Запрос не вернул результатов."
-#: org/postgresql/jdbc/PgConnection.java:578
+# key: postgresql.stat.result
+#: org/postgresql/jdbc/PgConnection.java:441
+#: org/postgresql/jdbc/PgStatement.java:254
+msgid "A result was returned when none was expected."
+msgstr "Результат возвращён когда его не ожидалось."
+
+#: org/postgresql/jdbc/PgConnection.java:545
msgid "Custom type maps are not supported."
msgstr ""
# key: postgresql.con.creobj
-#: org/postgresql/jdbc/PgConnection.java:620
+#: org/postgresql/jdbc/PgConnection.java:587
#, java-format
msgid "Failed to create object for: {0}."
msgstr "Ошибка при создании объект для: {0}."
-#: org/postgresql/jdbc/PgConnection.java:672
+#: org/postgresql/jdbc/PgConnection.java:641
#, java-format
msgid "Unable to load the class {0} responsible for the datatype {1}"
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:724
+#: org/postgresql/jdbc/PgConnection.java:693
msgid ""
"Cannot change transaction read-only property in the middle of a transaction."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:775
+#: org/postgresql/jdbc/PgConnection.java:756
msgid "Cannot commit when autoCommit is enabled."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:786
-#: org/postgresql/jdbc/PgConnection.java:1358
-#: org/postgresql/jdbc/PgConnection.java:1395
+#: org/postgresql/jdbc/PgConnection.java:767
+#: org/postgresql/jdbc/PgConnection.java:1384
+#: org/postgresql/jdbc/PgConnection.java:1428
msgid "This connection has been closed."
msgstr "Соединение уже было закрыто"
-#: org/postgresql/jdbc/PgConnection.java:796
+#: org/postgresql/jdbc/PgConnection.java:777
msgid "Cannot rollback when autoCommit is enabled."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:870
+#: org/postgresql/jdbc/PgConnection.java:827
msgid ""
"Cannot change transaction isolation level in the middle of a transaction."
msgstr ""
# key: postgresql.con.isolevel
-#: org/postgresql/jdbc/PgConnection.java:876
+#: org/postgresql/jdbc/PgConnection.java:833
#, java-format
msgid "Transaction isolation level {0} not supported."
msgstr "Уровень изоляции транзакций {0} не поддерживается."
-#: org/postgresql/jdbc/PgConnection.java:921
+#: org/postgresql/jdbc/PgConnection.java:878
msgid "Finalizing a Connection that was never closed:"
msgstr ""
"Соединение «утекло». Проверьте, что в коде приложения вызывается connection."
"close(). Далее следует стектрейс того места, где создавалось проблемное "
"соединение"
-#: org/postgresql/jdbc/PgConnection.java:1009
+#: org/postgresql/jdbc/PgConnection.java:945
msgid "Unable to translate data into the desired encoding."
msgstr ""
# key: postgresql.input.fetch.gt0
-#: org/postgresql/jdbc/PgConnection.java:1081
-#: org/postgresql/jdbc/PgResultSet.java:1782
-#: org/postgresql/jdbc/PgStatement.java:1053
+#: org/postgresql/jdbc/PgConnection.java:1008
+#: org/postgresql/jdbc/PgStatement.java:903
+#: org/postgresql/jdbc/PgResultSet.java:1817
msgid "Fetch size must be a value greater to or equal to 0."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:1311
+#: org/postgresql/jdbc/PgConnection.java:1289
+#: org/postgresql/jdbc/PgConnection.java:1330
#, java-format
msgid "Unable to find server array type for provided name {0}."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:1327
+#: org/postgresql/jdbc/PgConnection.java:1312
+#, fuzzy, java-format
+msgid "Invalid elements {0}"
+msgstr "Неверные флаги {0}"
+
+#: org/postgresql/jdbc/PgConnection.java:1348
#, java-format
msgid "Invalid timeout ({0}<0)."
msgstr "Значение таймаута должно быть неотрицательным: {0}"
-#: org/postgresql/jdbc/PgConnection.java:1340
+#: org/postgresql/jdbc/PgConnection.java:1372
msgid "Validating connection."
msgstr ""
# key: postgresql.con.creobj
-#: org/postgresql/jdbc/PgConnection.java:1375
+#: org/postgresql/jdbc/PgConnection.java:1405
#, java-format
msgid "Failed to set ClientInfo property: {0}"
msgstr "Невозможно установить свойство ClientInfo: {0}"
-#: org/postgresql/jdbc/PgConnection.java:1383
+#: org/postgresql/jdbc/PgConnection.java:1415
msgid "ClientInfo property not supported."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:1408
+#: org/postgresql/jdbc/PgConnection.java:1441
msgid "One ore more ClientInfo failed."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:1517
-#, java-format
-msgid "Unknown ResultSet holdability setting: {0}."
+#: org/postgresql/jdbc/PgConnection.java:1540
+msgid "Network timeout must be a value greater than or equal to 0."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:1531
-#: org/postgresql/jdbc/PgConnection.java:1554
-#: org/postgresql/jdbc/PgConnection.java:1576
-#: org/postgresql/jdbc/PgConnection.java:1587
-msgid "Server versions prior to 8.0 do not support savepoints."
+#: org/postgresql/jdbc/PgConnection.java:1552
+msgid "Unable to set network timeout."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:1535
-#: org/postgresql/jdbc/PgConnection.java:1558
+#: org/postgresql/jdbc/PgConnection.java:1563
+msgid "Unable to get network timeout."
+msgstr ""
+
+#: org/postgresql/jdbc/PgConnection.java:1580
+#, java-format
+msgid "Unknown ResultSet holdability setting: {0}."
+msgstr ""
+
+#: org/postgresql/jdbc/PgConnection.java:1598
+#: org/postgresql/jdbc/PgConnection.java:1619
msgid "Cannot establish a savepoint in auto-commit mode."
msgstr ""
# key: postgresql.con.isolevel
-#: org/postgresql/jdbc/PgConnection.java:1635
+#: org/postgresql/jdbc/PgConnection.java:1685
msgid "Returning autogenerated keys is not supported."
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:78
+# key: postgresql.stat.noresult
+#: org/postgresql/jdbc/PgStatement.java:235
+msgid "Multiple ResultSets were returned by the query."
+msgstr ""
+
+#: org/postgresql/jdbc/PgStatement.java:316
+msgid "Can''t use executeWithFlags(int) on a Statement."
+msgstr ""
+
+# key: postgresql.input.rows.gt0
+#: org/postgresql/jdbc/PgStatement.java:509
+msgid "Maximum number of rows must be a value grater than or equal to 0."
+msgstr ""
+
+# key: postgresql.input.query.gt0
+#: org/postgresql/jdbc/PgStatement.java:550
+msgid "Query timeout must be a value greater than or equals to 0."
+msgstr ""
+
+# key: postgresql.input.field.gt0
+#: org/postgresql/jdbc/PgStatement.java:590
+msgid "The maximum field size must be a value greater than or equal to 0."
+msgstr ""
+
+#: org/postgresql/jdbc/PgStatement.java:689
+msgid "This statement has been closed."
+msgstr "Этот Sstatement был закрыт."
+
+#: org/postgresql/jdbc/PgStatement.java:895
+#: org/postgresql/jdbc/PgResultSet.java:878
+#, java-format
+msgid "Invalid fetch direction constant: {0}."
+msgstr ""
+
+#: org/postgresql/jdbc/PgStatement.java:1145
+#: org/postgresql/jdbc/PgStatement.java:1173
+msgid "Returning autogenerated keys by column index is not supported."
+msgstr ""
+
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:66
msgid ""
"Unable to determine a value for MaxIndexKeys due to missing system catalog "
"data."
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:100
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:89
msgid "Unable to find name datatype in the system catalogs."
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1117
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1028
msgid "proname"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1117
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1028
msgid "oid"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1119
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1714
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1030
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1481
msgid "typtype"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1122
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1033
msgid "proargtypes"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1732
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1499
msgid "adsrc"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1872
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1963
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1512
+msgid "attidentity"
+msgstr ""
+
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1608
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1684
msgid "rolname"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1873
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1964
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1609
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1685
msgid "relacl"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1878
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1615
msgid "attacl"
msgstr ""
-# key: postgresql.arr.range
-#: org/postgresql/jdbc/PgParameterMetaData.java:86
+#: org/postgresql/jdbc/AbstractBlobClob.java:78
+msgid ""
+"Truncation of large objects is only implemented in 8.3 and later servers."
+msgstr ""
+
+#: org/postgresql/jdbc/AbstractBlobClob.java:83
+msgid "Cannot truncate LOB to a negative length."
+msgstr ""
+
+#: org/postgresql/jdbc/AbstractBlobClob.java:90
+#: org/postgresql/jdbc/AbstractBlobClob.java:234
#, java-format
-msgid "The parameter index is out of range: {0}, number of parameters: {1}."
-msgstr "Индекс параметра вне диапазона: {0}. Допустимые значения: 1..{1}"
+msgid "PostgreSQL LOBs can only index to: {0}"
+msgstr ""
-#: org/postgresql/jdbc/PgPreparedStatement.java:102
-#: org/postgresql/jdbc/PgPreparedStatement.java:128
-#: org/postgresql/jdbc/PgPreparedStatement.java:150
-#: org/postgresql/jdbc/PgPreparedStatement.java:1108
-msgid ""
-"Can''t use query methods that take a query string on a PreparedStatement."
+#: org/postgresql/jdbc/AbstractBlobClob.java:230
+msgid "LOB positioning offsets start at 1."
msgstr ""
-# key: postgresql.stat.noresult
-#: org/postgresql/jdbc/PgPreparedStatement.java:119
-#: org/postgresql/jdbc/PgStatement.java:286
-msgid "Multiple ResultSets were returned by the query."
+#: org/postgresql/jdbc/AbstractBlobClob.java:246
+msgid "free() was called on this LOB previously"
+msgstr ""
+
+#: org/postgresql/jdbc/PgPreparedStatement.java:106
+#: org/postgresql/jdbc/PgPreparedStatement.java:127
+#: org/postgresql/jdbc/PgPreparedStatement.java:139
+#: org/postgresql/jdbc/PgPreparedStatement.java:1035
+msgid ""
+"Can''t use query methods that take a query string on a PreparedStatement."
msgstr ""
# key: postgresql.prep.type
-#: org/postgresql/jdbc/PgPreparedStatement.java:270
+#: org/postgresql/jdbc/PgPreparedStatement.java:249
msgid "Unknown Types value."
msgstr "Неизвестное значение Types."
-#: org/postgresql/jdbc/PgPreparedStatement.java:417
-#: org/postgresql/jdbc/PgPreparedStatement.java:486
-#: org/postgresql/jdbc/PgPreparedStatement.java:1251
-#: org/postgresql/jdbc/PgPreparedStatement.java:1583
+#: org/postgresql/jdbc/PgPreparedStatement.java:382
+#: org/postgresql/jdbc/PgPreparedStatement.java:439
+#: org/postgresql/jdbc/PgPreparedStatement.java:1191
+#: org/postgresql/jdbc/PgPreparedStatement.java:1490
#, java-format
msgid "Invalid stream length {0}."
msgstr "Неверная длина потока {0}."
-#: org/postgresql/jdbc/PgPreparedStatement.java:447
+#: org/postgresql/jdbc/PgPreparedStatement.java:411
#, java-format
msgid "The JVM claims not to support the {0} encoding."
msgstr ""
-#: org/postgresql/jdbc/PgPreparedStatement.java:450
-#: org/postgresql/jdbc/PgPreparedStatement.java:519
-#: org/postgresql/jdbc/PgResultSet.java:1075
-#: org/postgresql/jdbc/PgResultSet.java:1109
+#: org/postgresql/jdbc/PgPreparedStatement.java:414
+#: org/postgresql/jdbc/PgResultSet.java:1122
+#: org/postgresql/jdbc/PgResultSet.java:1156
msgid "Provided InputStream failed."
msgstr ""
# key: postgresql.con.type
-#: org/postgresql/jdbc/PgPreparedStatement.java:536
-#: org/postgresql/jdbc/PgPreparedStatement.java:1170
+#: org/postgresql/jdbc/PgPreparedStatement.java:460
+#: org/postgresql/jdbc/PgPreparedStatement.java:1096
#, java-format
msgid "Unknown type {0}."
msgstr "Неизвестный тип {0}."
-#: org/postgresql/jdbc/PgPreparedStatement.java:553
+#: org/postgresql/jdbc/PgPreparedStatement.java:477
msgid "No hstore extension installed."
msgstr ""
-#: org/postgresql/jdbc/PgPreparedStatement.java:683
-#: org/postgresql/jdbc/PgPreparedStatement.java:705
-#: org/postgresql/jdbc/PgPreparedStatement.java:715
-#: org/postgresql/jdbc/PgPreparedStatement.java:725
+#: org/postgresql/jdbc/PgPreparedStatement.java:619
+#: org/postgresql/jdbc/PgPreparedStatement.java:642
+#: org/postgresql/jdbc/PgPreparedStatement.java:652
+#: org/postgresql/jdbc/PgPreparedStatement.java:664
#, java-format
msgid "Cannot cast an instance of {0} to type {1}"
msgstr ""
# key: postgresql.prep.type
-#: org/postgresql/jdbc/PgPreparedStatement.java:741
+#: org/postgresql/jdbc/PgPreparedStatement.java:682
#, java-format
msgid "Unsupported Types value: {0}"
msgstr "Неподдерживаемый java.sql.Types тип: {0}"
-#: org/postgresql/jdbc/PgPreparedStatement.java:970
+#: org/postgresql/jdbc/PgPreparedStatement.java:894
#, java-format
msgid "Cannot convert an instance of {0} to type {1}"
msgstr ""
-#: org/postgresql/jdbc/PgPreparedStatement.java:1040
+#: org/postgresql/jdbc/PgPreparedStatement.java:968
#, java-format
msgid ""
"Can''t infer the SQL type to use for an instance of {0}. Use setObject() "
"with an explicit Types value to specify the type to use."
msgstr ""
-#: org/postgresql/jdbc/PgPreparedStatement.java:1207
-#: org/postgresql/jdbc/PgPreparedStatement.java:1303
-#: org/postgresql/jdbc/PgPreparedStatement.java:1340
+#: org/postgresql/jdbc/PgPreparedStatement.java:1133
+#: org/postgresql/jdbc/PgPreparedStatement.java:1233
msgid "Unexpected error writing large object to database."
msgstr ""
-#: org/postgresql/jdbc/PgPreparedStatement.java:1278
-#: org/postgresql/jdbc/PgResultSet.java:1163
+#: org/postgresql/jdbc/PgPreparedStatement.java:1178
+#: org/postgresql/jdbc/PgResultSet.java:1210
msgid "Provided Reader failed."
msgstr ""
-#: org/postgresql/jdbc/PgPreparedStatement.java:1542
-#: org/postgresql/util/StreamWrapper.java:59
-msgid "Object is too large to send over the protocol."
+#: org/postgresql/jdbc/BooleanTypeUtil.java:99
+#, java-format
+msgid "Cannot cast to boolean: \"{0}\""
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:285
+#: org/postgresql/jdbc/PgResultSet.java:280
msgid ""
"Operation requires a scrollable ResultSet, but this ResultSet is "
"FORWARD_ONLY."
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:456
-msgid "Unexpected error while decoding character data from a large object."
-msgstr ""
-
-#: org/postgresql/jdbc/PgResultSet.java:507
-#: org/postgresql/jdbc/PgResultSet.java:537
-#: org/postgresql/jdbc/PgResultSet.java:570
-#: org/postgresql/jdbc/PgResultSet.java:2964
+#: org/postgresql/jdbc/PgResultSet.java:492
+#: org/postgresql/jdbc/PgResultSet.java:532
+#: org/postgresql/jdbc/PgResultSet.java:556
+#: org/postgresql/jdbc/PgResultSet.java:594
+#: org/postgresql/jdbc/PgResultSet.java:624
#: org/postgresql/jdbc/PgResultSet.java:3008
+#: org/postgresql/jdbc/PgResultSet.java:3052
#, java-format
msgid "Cannot convert the column of type {0} to requested type {1}."
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:789
-#: org/postgresql/jdbc/PgResultSet.java:810
-#: org/postgresql/jdbc/PgResultSet.java:1797
+#: org/postgresql/jdbc/PgResultSet.java:838
+#: org/postgresql/jdbc/PgResultSet.java:859
+#: org/postgresql/jdbc/PgResultSet.java:1832
msgid "Can''t use relative move methods while on the insert row."
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:829
-#: org/postgresql/jdbc/PgStatement.java:1045
-#, java-format
-msgid "Invalid fetch direction constant: {0}."
-msgstr ""
-
-#: org/postgresql/jdbc/PgResultSet.java:840
+#: org/postgresql/jdbc/PgResultSet.java:889
msgid "Cannot call cancelRowUpdates() when on the insert row."
-msgstr ""
-
-# key: postgresql.updateable.oninsertrow
-#: org/postgresql/jdbc/PgResultSet.java:856
-msgid "Cannot call deleteRow() when on the insert row."
-msgstr ""
-
-# key: postgresql.updateable.beforestartdelete
-#: org/postgresql/jdbc/PgResultSet.java:863
-msgid ""
-"Currently positioned before the start of the ResultSet. You cannot call "
-"deleteRow() here."
-msgstr ""
-
-# key: postgresql.updateable.afterlastdelete
-#: org/postgresql/jdbc/PgResultSet.java:869
-msgid ""
-"Currently positioned after the end of the ResultSet. You cannot call "
-"deleteRow() here."
-msgstr ""
-
-#: org/postgresql/jdbc/PgResultSet.java:873
-msgid "There are no rows in this ResultSet."
-msgstr "Невозможно удалить строку, т.к. в текущем ResultSet’е строк вообще нет"
-
-# key: postgresql.updateable.notoninsertrow
-#: org/postgresql/jdbc/PgResultSet.java:914
-msgid "Not on the insert row."
-msgstr ""
-
-#: org/postgresql/jdbc/PgResultSet.java:916
-msgid "You must specify at least one column value to insert a row."
-msgstr ""
-
-#: org/postgresql/jdbc/PgResultSet.java:1072
-#: org/postgresql/jdbc/PgResultSet.java:1706
-#: org/postgresql/jdbc/PgResultSet.java:2377
-#: org/postgresql/jdbc/PgResultSet.java:2402
-#, java-format
-msgid "The JVM claims not to support the encoding: {0}"
-msgstr ""
-
-#: org/postgresql/jdbc/PgResultSet.java:1214
-msgid "Can''t refresh the insert row."
-msgstr ""
-
-#: org/postgresql/jdbc/PgResultSet.java:1280
-msgid "Cannot call updateRow() when on the insert row."
-msgstr ""
-
-#: org/postgresql/jdbc/PgResultSet.java:1287
-#: org/postgresql/jdbc/PgResultSet.java:3025
-msgid ""
-"Cannot update the ResultSet because it is either before the start or after "
-"the end of the results."
-msgstr ""
-
-#: org/postgresql/jdbc/PgResultSet.java:1486
-msgid "ResultSets with concurrency CONCUR_READ_ONLY cannot be updated."
-msgstr ""
-
-#: org/postgresql/jdbc/PgResultSet.java:1555
-#, java-format
-msgid "No primary key found for table {0}."
-msgstr ""
-
-#: org/postgresql/jdbc/PgResultSet.java:1941
-#: org/postgresql/jdbc/PgResultSet.java:1946
-#: org/postgresql/jdbc/PgResultSet.java:1986
-#: org/postgresql/jdbc/PgResultSet.java:1992
-#: org/postgresql/jdbc/PgResultSet.java:2790
-#: org/postgresql/jdbc/PgResultSet.java:2796
-#: org/postgresql/jdbc/PgResultSet.java:2820
-#: org/postgresql/jdbc/PgResultSet.java:2825
-#: org/postgresql/jdbc/PgResultSet.java:2841
-#: org/postgresql/jdbc/PgResultSet.java:2862
-#: org/postgresql/jdbc/PgResultSet.java:2873
-#: org/postgresql/jdbc/PgResultSet.java:2886
-#: org/postgresql/jdbc/PgResultSet.java:3013
-#, java-format
-msgid "Bad value for type {0} : {1}"
-msgstr ""
-
-#: org/postgresql/jdbc/PgResultSet.java:2564
-#, java-format
-msgid "The column name {0} was not found in this ResultSet."
-msgstr "Колонки {0} не найдено в этом ResultSet’’е."
-
-# key: postgresql.updateable.notupdateable
-#: org/postgresql/jdbc/PgResultSet.java:2689
-msgid ""
-"ResultSet is not updateable. The query that generated this result set must "
-"select only one table, and must select all primary keys from that table. See "
-"the JDBC 2.1 API Specification, section 5.6 for more details."
-msgstr ""
-
-#: org/postgresql/jdbc/PgResultSet.java:2701
-msgid "This ResultSet is closed."
-msgstr "ResultSet закрыт."
-
-# key: postgresql.res.nextrequired
-#: org/postgresql/jdbc/PgResultSet.java:2732
-msgid "ResultSet not positioned properly, perhaps you need to call next."
-msgstr ""
-
-#: org/postgresql/jdbc/PgResultSet.java:3045
-msgid "Invalid UUID data."
-msgstr ""
-
-#: org/postgresql/jdbc/PgSQLXML.java:150
-msgid "Unable to decode xml data."
-msgstr ""
-
-#: org/postgresql/jdbc/PgSQLXML.java:153
-#, java-format
-msgid "Unknown XML Source class: {0}"
-msgstr ""
-
-# key: postgresql.con.creobj
-#: org/postgresql/jdbc/PgSQLXML.java:196
-msgid "Unable to create SAXResult for SQLXML."
-msgstr "Невозможно создать SAXResult для SQLXML"
-
-#: org/postgresql/jdbc/PgSQLXML.java:211
-msgid "Unable to create StAXResult for SQLXML"
-msgstr ""
-
-#: org/postgresql/jdbc/PgSQLXML.java:216
-#, java-format
-msgid "Unknown XML Result class: {0}"
-msgstr ""
-
-#: org/postgresql/jdbc/PgSQLXML.java:228
-msgid "This SQLXML object has already been freed."
-msgstr "Этот объект SQLXML уже был закрыт"
-
-#: org/postgresql/jdbc/PgSQLXML.java:237
-msgid ""
-"This SQLXML object has not been initialized, so you cannot retrieve data "
-"from it."
-msgstr ""
-
-#: org/postgresql/jdbc/PgSQLXML.java:250
-#, java-format
-msgid "Failed to convert binary xml data to encoding: {0}."
-msgstr ""
-
-#: org/postgresql/jdbc/PgSQLXML.java:276
-msgid "Unable to convert DOMResult SQLXML data to a string."
-msgstr ""
-
-#: org/postgresql/jdbc/PgSQLXML.java:290
-msgid ""
-"This SQLXML object has already been initialized, so you cannot manipulate it "
-"further."
-msgstr ""
-
-#: org/postgresql/jdbc/PgStatement.java:325
-msgid "Can''t use executeWithFlags(int) on a Statement."
-msgstr ""
-
-# key: postgresql.input.rows.gt0
-#: org/postgresql/jdbc/PgStatement.java:484
-msgid "Maximum number of rows must be a value grater than or equal to 0."
-msgstr ""
-
-# key: postgresql.input.query.gt0
-#: org/postgresql/jdbc/PgStatement.java:525
-msgid "Query timeout must be a value greater than or equals to 0."
-msgstr ""
-
-# key: postgresql.input.field.gt0
-#: org/postgresql/jdbc/PgStatement.java:561
-msgid "The maximum field size must be a value greater than or equal to 0."
-msgstr ""
-
-#: org/postgresql/jdbc/PgStatement.java:871
-msgid "This statement has been closed."
-msgstr "Этот Sstatement был закрыт."
-
-#: org/postgresql/jdbc/PgStatement.java:1148
-msgid ""
-"Returning autogenerated keys is only supported for 8.2 and later servers."
-msgstr ""
-
-#: org/postgresql/jdbc/PgStatement.java:1326
-#: org/postgresql/jdbc/PgStatement.java:1357
-msgid "Returning autogenerated keys by column index is not supported."
-msgstr ""
-
-#: org/postgresql/jdbc/PSQLSavepoint.java:40
-#: org/postgresql/jdbc/PSQLSavepoint.java:54
-#: org/postgresql/jdbc/PSQLSavepoint.java:72
-msgid "Cannot reference a savepoint after it has been released."
-msgstr ""
-
-#: org/postgresql/jdbc/PSQLSavepoint.java:45
-msgid "Cannot retrieve the id of a named savepoint."
-msgstr ""
-
-#: org/postgresql/jdbc/PSQLSavepoint.java:59
-msgid "Cannot retrieve the name of an unnamed savepoint."
-msgstr ""
-
-#: org/postgresql/jdbc/TimestampUtils.java:298
-#, java-format
-msgid "Bad value for type timestamp/date/time: {1}"
-msgstr ""
-
-#: org/postgresql/jdbc/TimestampUtils.java:359
-msgid ""
-"Infinite value found for timestamp/date. This cannot be represented as time."
-msgstr ""
-
-# key: postgresql.prep.type
-#: org/postgresql/jdbc/TimestampUtils.java:674
-#: org/postgresql/jdbc/TimestampUtils.java:710
-#: org/postgresql/jdbc/TimestampUtils.java:757
-#, java-format
-msgid "Unsupported binary encoding of {0}."
-msgstr "Бинарная передача не поддерживается для типа {0}"
-
-# key: postgresql.lo.init
-#: org/postgresql/largeobject/LargeObjectManager.java:147
-msgid "Failed to initialize LargeObject API"
-msgstr "Ошибка при инициализации LargeObject API"
-
-#: org/postgresql/largeobject/LargeObjectManager.java:265
-#: org/postgresql/largeobject/LargeObjectManager.java:308
-msgid "Large Objects may not be used in auto-commit mode."
-msgstr ""
-"Большие объекты не могут использоваться в режиме авто-подтверждения (auto-"
-"commit)."
-
-# key: postgresql.prep.type
-#: org/postgresql/osgi/PGDataSourceFactory.java:85
-#, java-format
-msgid "Unsupported properties: {0}"
-msgstr "Указанные свойства не поддерживаются: {0}"
+msgstr ""
-#: org/postgresql/PGProperty.java:450 org/postgresql/PGProperty.java:470
-#, java-format
-msgid "{0} parameter value must be an integer but was: {1}"
+# key: postgresql.updateable.oninsertrow
+#: org/postgresql/jdbc/PgResultSet.java:905
+msgid "Cannot call deleteRow() when on the insert row."
msgstr ""
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:125
+# key: postgresql.updateable.beforestartdelete
+#: org/postgresql/jdbc/PgResultSet.java:912
msgid ""
-"Could not find a java cryptographic algorithm: X.509 CertificateFactory not "
-"available."
+"Currently positioned before the start of the ResultSet. You cannot call "
+"deleteRow() here."
msgstr ""
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:135
-#, java-format
-msgid "Could not open SSL certificate file {0}."
+# key: postgresql.updateable.afterlastdelete
+#: org/postgresql/jdbc/PgResultSet.java:918
+msgid ""
+"Currently positioned after the end of the ResultSet. You cannot call "
+"deleteRow() here."
msgstr ""
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:140
-#, java-format
-msgid "Loading the SSL certificate {0} into a KeyManager failed."
-msgstr ""
+#: org/postgresql/jdbc/PgResultSet.java:922
+msgid "There are no rows in this ResultSet."
+msgstr "Невозможно удалить строку, т.к. в текущем ResultSet’е строк вообще нет"
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:195
-msgid "Enter SSL password: "
+# key: postgresql.updateable.notoninsertrow
+#: org/postgresql/jdbc/PgResultSet.java:963
+msgid "Not on the insert row."
msgstr ""
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:202
-msgid "Could not read password for SSL key file, console is not available."
+#: org/postgresql/jdbc/PgResultSet.java:965
+msgid "You must specify at least one column value to insert a row."
msgstr ""
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:207
+#: org/postgresql/jdbc/PgResultSet.java:1119
+#: org/postgresql/jdbc/PgResultSet.java:1754
+#: org/postgresql/jdbc/PgResultSet.java:2416
+#: org/postgresql/jdbc/PgResultSet.java:2437
#, java-format
-msgid "Could not read password for SSL key file by callbackhandler {0}."
+msgid "The JVM claims not to support the encoding: {0}"
msgstr ""
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:226
-#, java-format
-msgid "Could not decrypt SSL key file {0}."
+#: org/postgresql/jdbc/PgResultSet.java:1261
+msgid "Can''t refresh the insert row."
msgstr ""
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:240
-#, java-format
-msgid "Could not read SSL key file {0}."
+#: org/postgresql/jdbc/PgResultSet.java:1328
+msgid "Cannot call updateRow() when on the insert row."
msgstr ""
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:243
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:162
-#, java-format
-msgid "Could not find a java cryptographic algorithm: {0}."
+#: org/postgresql/jdbc/PgResultSet.java:1335
+#: org/postgresql/jdbc/PgResultSet.java:3069
+msgid ""
+"Cannot update the ResultSet because it is either before the start or after "
+"the end of the results."
msgstr ""
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:90
-#, java-format
-msgid "The password callback class provided {0} could not be instantiated."
-msgstr "Невозможно создать password callback с помощью указанного класса {0}"
+#: org/postgresql/jdbc/PgResultSet.java:1535
+msgid "ResultSets with concurrency CONCUR_READ_ONLY cannot be updated."
+msgstr ""
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:123
+#: org/postgresql/jdbc/PgResultSet.java:1603
#, java-format
-msgid "Could not open SSL root certificate file {0}."
+msgid "No primary key found for table {0}."
msgstr ""
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:139
+#: org/postgresql/jdbc/PgResultSet.java:2011
+#: org/postgresql/jdbc/PgResultSet.java:2016
+#: org/postgresql/jdbc/PgResultSet.java:2803
+#: org/postgresql/jdbc/PgResultSet.java:2809
+#: org/postgresql/jdbc/PgResultSet.java:2834
+#: org/postgresql/jdbc/PgResultSet.java:2840
+#: org/postgresql/jdbc/PgResultSet.java:2864
+#: org/postgresql/jdbc/PgResultSet.java:2869
+#: org/postgresql/jdbc/PgResultSet.java:2885
+#: org/postgresql/jdbc/PgResultSet.java:2906
+#: org/postgresql/jdbc/PgResultSet.java:2917
+#: org/postgresql/jdbc/PgResultSet.java:2930
+#: org/postgresql/jdbc/PgResultSet.java:3057
#, java-format
-msgid "Could not read SSL root certificate file {0}."
+msgid "Bad value for type {0} : {1}"
msgstr ""
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:143
+#: org/postgresql/jdbc/PgResultSet.java:2589
#, java-format
-msgid "Loading the SSL root certificate {0} into a TrustManager failed."
-msgstr ""
+msgid "The column name {0} was not found in this ResultSet."
+msgstr "Колонки {0} не найдено в этом ResultSet’’е."
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:156
-msgid "Could not initialize SSL context."
+# key: postgresql.updateable.notupdateable
+#: org/postgresql/jdbc/PgResultSet.java:2725
+msgid ""
+"ResultSet is not updateable. The query that generated this result set must "
+"select only one table, and must select all primary keys from that table. See "
+"the JDBC 2.1 API Specification, section 5.6 for more details."
msgstr ""
-#: org/postgresql/ssl/MakeSSL.java:52
-#, java-format
-msgid "The SSLSocketFactory class provided {0} could not be instantiated."
-msgstr "Невозможно создать SSLSocketFactory с помощью указанного класса {0}"
+#: org/postgresql/jdbc/PgResultSet.java:2737
+msgid "This ResultSet is closed."
+msgstr "ResultSet закрыт."
-#: org/postgresql/ssl/MakeSSL.java:67
-#, java-format
-msgid "SSL error: {0}"
+# key: postgresql.res.nextrequired
+#: org/postgresql/jdbc/PgResultSet.java:2768
+msgid "ResultSet not positioned properly, perhaps you need to call next."
msgstr ""
-#: org/postgresql/ssl/MakeSSL.java:78
-#, java-format
-msgid "The HostnameVerifier class provided {0} could not be instantiated."
-msgstr "Невозможно создать HostnameVerifier с помощью указанного класса {0}"
+#: org/postgresql/jdbc/PgResultSet.java:3089
+msgid "Invalid UUID data."
+msgstr ""
-#: org/postgresql/ssl/MakeSSL.java:84
+# key: postgresql.con.isolevel
+#: org/postgresql/jdbc/PgResultSet.java:3178
+#: org/postgresql/jdbc/PgResultSet.java:3185
+#: org/postgresql/jdbc/PgResultSet.java:3196
+#: org/postgresql/jdbc/PgResultSet.java:3207
+#: org/postgresql/jdbc/PgResultSet.java:3218
+#: org/postgresql/jdbc/PgResultSet.java:3229
+#: org/postgresql/jdbc/PgResultSet.java:3240
+#: org/postgresql/jdbc/PgResultSet.java:3251
+#: org/postgresql/jdbc/PgResultSet.java:3262
+#: org/postgresql/jdbc/PgResultSet.java:3269
+#: org/postgresql/jdbc/PgResultSet.java:3276
+#: org/postgresql/jdbc/PgResultSet.java:3287
+#: org/postgresql/jdbc/PgResultSet.java:3304
+#: org/postgresql/jdbc/PgResultSet.java:3311
+#: org/postgresql/jdbc/PgResultSet.java:3318
+#: org/postgresql/jdbc/PgResultSet.java:3329
+#: org/postgresql/jdbc/PgResultSet.java:3336
+#: org/postgresql/jdbc/PgResultSet.java:3343
+#: org/postgresql/jdbc/PgResultSet.java:3381
+#: org/postgresql/jdbc/PgResultSet.java:3388
+#: org/postgresql/jdbc/PgResultSet.java:3395
+#: org/postgresql/jdbc/PgResultSet.java:3415
+#: org/postgresql/jdbc/PgResultSet.java:3428
+#, fuzzy, java-format
+msgid "conversion to {0} from {1} not supported"
+msgstr "Уровень изоляции транзакций {0} не поддерживается."
+
+#: org/postgresql/jdbc/TimestampUtils.java:355
+#: org/postgresql/jdbc/TimestampUtils.java:423
#, java-format
-msgid "The hostname {0} could not be verified by hostnameverifier {1}."
+msgid "Bad value for type timestamp/date/time: {1}"
msgstr ""
-#: org/postgresql/ssl/MakeSSL.java:93
+# key: postgresql.prep.type
+#: org/postgresql/jdbc/TimestampUtils.java:858
+#: org/postgresql/jdbc/TimestampUtils.java:915
+#: org/postgresql/jdbc/TimestampUtils.java:961
+#: org/postgresql/jdbc/TimestampUtils.java:1010
#, java-format
-msgid "The hostname {0} could not be verified."
+msgid "Unsupported binary encoding of {0}."
+msgstr "Бинарная передача не поддерживается для типа {0}"
+
+# key: postgresql.call.noreturnval
+#: org/postgresql/jdbc/PgCallableStatement.java:86
+#: org/postgresql/jdbc/PgCallableStatement.java:96
+msgid "A CallableStatement was executed with nothing returned."
msgstr ""
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:167
-msgid "The sslfactoryarg property may not be empty."
+#: org/postgresql/jdbc/PgCallableStatement.java:107
+msgid "A CallableStatement was executed with an invalid number of parameters"
msgstr ""
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:183
+#: org/postgresql/jdbc/PgCallableStatement.java:145
+#, java-format
msgid ""
-"The environment variable containing the server's SSL certificate must not be "
-"empty."
+"A CallableStatement function was executed and the out parameter {0} was of "
+"type {1} however type {2} was registered."
msgstr ""
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:191
+#: org/postgresql/jdbc/PgCallableStatement.java:202
msgid ""
-"The system property containing the server's SSL certificate must not be "
-"empty."
+"This statement does not declare an OUT parameter. Use '{' ?= call ... '}' "
+"to declare one."
+msgstr ""
+
+#: org/postgresql/jdbc/PgCallableStatement.java:246
+msgid "wasNull cannot be call before fetching a result."
msgstr ""
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:198
+# key: postgresql.call.wrongget
+#: org/postgresql/jdbc/PgCallableStatement.java:384
+#: org/postgresql/jdbc/PgCallableStatement.java:403
+#, java-format
msgid ""
-"The sslfactoryarg property must start with the prefix file:, classpath:, "
-"env:, sys:, or -----BEGIN CERTIFICATE-----."
+"Parameter of type {0} was registered, but call to get{1} (sqltype={2}) was "
+"made."
msgstr ""
-# key: postgresql.con.sslfail
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:210
-msgid "An error occurred reading the certificate"
-msgstr "Ошибка при чтении сертификата"
+# key: postgresql.call.noreturntype
+#: org/postgresql/jdbc/PgCallableStatement.java:424
+msgid ""
+"A CallableStatement was declared, but no call to registerOutParameter(1, "
+"<some type>) was made."
+msgstr ""
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:243
-msgid "No X509TrustManager found"
+#: org/postgresql/jdbc/PgCallableStatement.java:430
+msgid "No function outputs were registered."
msgstr ""
-# key: postgresql.money
-#: org/postgresql/util/PGInterval.java:155
-msgid "Conversion of interval failed"
-msgstr "Невозможно обработать PGInterval: {0}"
+#: org/postgresql/jdbc/PgCallableStatement.java:436
+msgid ""
+"Results cannot be retrieved from a CallableStatement before it is executed."
+msgstr ""
-# key: postgresql.money
-#: org/postgresql/util/PGmoney.java:65
-msgid "Conversion of money failed."
-msgstr "Ошибка при преобразовании типа money."
+# key: postgresql.prep.type
+#: org/postgresql/jdbc/PgCallableStatement.java:703
+#, fuzzy, java-format
+msgid "Unsupported type conversion to {1}."
+msgstr "Бинарная передача не поддерживается для типа {0}"
-# key: postgresql.error.detail
-#: org/postgresql/util/ServerErrorMessage.java:165
+#: org/postgresql/jdbc/EscapedFunctions.java:240
#, java-format
-msgid "Detail: {0}"
-msgstr "Подробности: {0}"
+msgid "{0} function takes four and only four argument."
+msgstr ""
-# key: postgresql.error.hint
-#: org/postgresql/util/ServerErrorMessage.java:170
+#: org/postgresql/jdbc/EscapedFunctions.java:270
+#: org/postgresql/jdbc/EscapedFunctions.java:344
+#: org/postgresql/jdbc/EscapedFunctions.java:749
+#: org/postgresql/jdbc/EscapedFunctions.java:787
#, java-format
-msgid "Hint: {0}"
-msgstr "Подсказка: {0}"
+msgid "{0} function takes two and only two arguments."
+msgstr ""
-# key: postgresql.error.position
-#: org/postgresql/util/ServerErrorMessage.java:174
+#: org/postgresql/jdbc/EscapedFunctions.java:288
+#: org/postgresql/jdbc/EscapedFunctions.java:326
+#: org/postgresql/jdbc/EscapedFunctions.java:446
+#: org/postgresql/jdbc/EscapedFunctions.java:461
+#: org/postgresql/jdbc/EscapedFunctions.java:476
+#: org/postgresql/jdbc/EscapedFunctions.java:491
+#: org/postgresql/jdbc/EscapedFunctions.java:506
+#: org/postgresql/jdbc/EscapedFunctions.java:521
+#: org/postgresql/jdbc/EscapedFunctions.java:536
+#: org/postgresql/jdbc/EscapedFunctions.java:551
+#: org/postgresql/jdbc/EscapedFunctions.java:566
+#: org/postgresql/jdbc/EscapedFunctions.java:581
+#: org/postgresql/jdbc/EscapedFunctions.java:596
+#: org/postgresql/jdbc/EscapedFunctions.java:611
+#: org/postgresql/jdbc/EscapedFunctions.java:775
#, java-format
-msgid "Position: {0}"
-msgstr "Позиция: {0}"
+msgid "{0} function takes one and only one argument."
+msgstr ""
-# key: postgresql.error.where
-#: org/postgresql/util/ServerErrorMessage.java:178
+#: org/postgresql/jdbc/EscapedFunctions.java:310
+#: org/postgresql/jdbc/EscapedFunctions.java:391
#, java-format
-msgid "Where: {0}"
-msgstr "Где: {0}"
+msgid "{0} function takes two or three arguments."
+msgstr ""
-#: org/postgresql/util/ServerErrorMessage.java:184
+#: org/postgresql/jdbc/EscapedFunctions.java:416
+#: org/postgresql/jdbc/EscapedFunctions.java:431
+#: org/postgresql/jdbc/EscapedFunctions.java:734
+#: org/postgresql/jdbc/EscapedFunctions.java:764
#, java-format
-msgid "Internal Query: {0}"
+msgid "{0} function doesn''t take any argument."
msgstr ""
-# key: postgresql.error.position
-#: org/postgresql/util/ServerErrorMessage.java:188
-#, fuzzy, java-format
-msgid "Internal Position: {0}"
-msgstr "Позиция: {0}"
-
-# key: postgresql.error.location
-#: org/postgresql/util/ServerErrorMessage.java:195
+#: org/postgresql/jdbc/EscapedFunctions.java:627
+#: org/postgresql/jdbc/EscapedFunctions.java:680
#, java-format
-msgid "Location: File: {0}, Routine: {1}, Line: {2}"
-msgstr "Местонахождение: Файл {0}, Процедура: {1}, Строка: {2}"
+msgid "{0} function takes three and only three arguments."
+msgstr ""
-#: org/postgresql/util/ServerErrorMessage.java:200
+# key: postgresql.unimplemented
+#: org/postgresql/jdbc/EscapedFunctions.java:640
+#: org/postgresql/jdbc/EscapedFunctions.java:661
+#: org/postgresql/jdbc/EscapedFunctions.java:664
+#: org/postgresql/jdbc/EscapedFunctions.java:697
+#: org/postgresql/jdbc/EscapedFunctions.java:710
+#: org/postgresql/jdbc/EscapedFunctions.java:713
#, java-format
-msgid "Server SQLState: {0}"
-msgstr "SQLState сервера: {0}"
-
-#: org/postgresql/xa/PGXAConnection.java:148
-msgid ""
-"Transaction control methods setAutoCommit(true), commit, rollback and "
-"setSavePoint not allowed while an XA transaction is active."
-msgstr ""
+msgid "Interval {0} not yet implemented"
+msgstr "Интеврвал {0} ещё не реализован"
-#: org/postgresql/xa/PGXAConnection.java:196
-#: org/postgresql/xa/PGXAConnection.java:265
-msgid "Invalid flags"
+#: org/postgresql/PGProperty.java:535 org/postgresql/PGProperty.java:555
+#, java-format
+msgid "{0} parameter value must be an integer but was: {1}"
msgstr ""
-#: org/postgresql/xa/PGXAConnection.java:200
-#: org/postgresql/xa/PGXAConnection.java:269
-#: org/postgresql/xa/PGXAConnection.java:437
-msgid "xid must not be null"
-msgstr ""
+# key: postgresql.lo.init
+#: org/postgresql/largeobject/LargeObjectManager.java:144
+msgid "Failed to initialize LargeObject API"
+msgstr "Ошибка при инициализации LargeObject API"
-#: org/postgresql/xa/PGXAConnection.java:204
-msgid "Connection is busy with another transaction"
+#: org/postgresql/largeobject/LargeObjectManager.java:262
+#: org/postgresql/largeobject/LargeObjectManager.java:305
+msgid "Large Objects may not be used in auto-commit mode."
msgstr ""
+"Большие объекты не могут использоваться в режиме авто-подтверждения (auto-"
+"commit)."
-# key: postgresql.unimplemented
-#: org/postgresql/xa/PGXAConnection.java:213
-#: org/postgresql/xa/PGXAConnection.java:279
-msgid "suspend/resume not implemented"
-msgstr "Операции XA suspend/resume не реализованы"
+# key: postgresql.geo.box
+#: org/postgresql/copy/PGCopyInputStream.java:51
+#, java-format
+msgid "Copying from database failed: {0}"
+msgstr "Ошибка при обработке ответа команды COPY: {0}"
-# key: postgresql.con.isolevel
-#: org/postgresql/xa/PGXAConnection.java:219
-#: org/postgresql/xa/PGXAConnection.java:224
-#: org/postgresql/xa/PGXAConnection.java:228
-msgid "Transaction interleaving not implemented"
-msgstr ""
+#: org/postgresql/copy/PGCopyInputStream.java:67
+#: org/postgresql/copy/PGCopyOutputStream.java:94
+msgid "This copy stream is closed."
+msgstr "Поток уже был закрыт"
-#: org/postgresql/xa/PGXAConnection.java:239
-msgid "Error disabling autocommit"
+#: org/postgresql/copy/PGCopyInputStream.java:110
+msgid "Read from copy failed."
msgstr ""
-#: org/postgresql/xa/PGXAConnection.java:273
-msgid "tried to call end without corresponding start call"
-msgstr ""
+#: org/postgresql/copy/CopyManager.java:53
+#, java-format
+msgid "Requested CopyIn but got {0}"
+msgstr "Ожидался ответ CopyIn, а получен {0}"
-#: org/postgresql/xa/PGXAConnection.java:305
-msgid ""
-"Not implemented: Prepare must be issued using the same connection that "
-"started the transaction"
-msgstr ""
+#: org/postgresql/copy/CopyManager.java:64
+#, java-format
+msgid "Requested CopyOut but got {0}"
+msgstr "Ожидался ответ CopyOut, а получен {0}"
-#: org/postgresql/xa/PGXAConnection.java:309
-msgid "Prepare called before end"
-msgstr ""
+#: org/postgresql/copy/CopyManager.java:75
+#, fuzzy, java-format
+msgid "Requested CopyDual but got {0}"
+msgstr "Ожидался ответ CopyOut, а получен {0}"
-#: org/postgresql/xa/PGXAConnection.java:317
-msgid "Server versions prior to 8.1 do not support two-phase commit."
-msgstr ""
+#: org/postgresql/copy/PGCopyOutputStream.java:71
+#, java-format
+msgid "Cannot write to copy a byte of value {0}"
+msgstr "Значение byte должно быть в диапазоне 0..255, переданное значение: {0}"
-#: org/postgresql/xa/PGXAConnection.java:334
-msgid "Error preparing transaction"
+#: org/postgresql/fastpath/Fastpath.java:80
+#, java-format
+msgid "Fastpath call {0} - No result was returned and we expected a numeric."
msgstr ""
-#: org/postgresql/xa/PGXAConnection.java:349
-msgid "Invalid flag"
+# key: postgresql.fp.expint
+#: org/postgresql/fastpath/Fastpath.java:157
+#, java-format
+msgid "Fastpath call {0} - No result was returned and we expected an integer."
msgstr ""
-#: org/postgresql/xa/PGXAConnection.java:384
-msgid "Error during recover"
+#: org/postgresql/fastpath/Fastpath.java:165
+#, java-format
+msgid ""
+"Fastpath call {0} - No result was returned or wrong size while expecting an "
+"integer."
msgstr ""
-#: org/postgresql/xa/PGXAConnection.java:423
-#: org/postgresql/xa/PGXAConnection.java:426
-msgid "Error rolling back prepared transaction"
-msgstr ""
+# key: postgresql.stat.result
+#: org/postgresql/fastpath/Fastpath.java:182
+#, java-format
+msgid "Fastpath call {0} - No result was returned and we expected a long."
+msgstr "Вызов fastpath {0} ничего не вернул, а ожидалось long"
-#: org/postgresql/xa/PGXAConnection.java:464
+#: org/postgresql/fastpath/Fastpath.java:190
+#, java-format
msgid ""
-"Not implemented: one-phase commit must be issued using the same connection "
-"that was used to start it"
+"Fastpath call {0} - No result was returned or wrong size while expecting a "
+"long."
msgstr ""
-#: org/postgresql/xa/PGXAConnection.java:468
-msgid "commit called before end"
+# key: postgresql.fp.unknown
+#: org/postgresql/fastpath/Fastpath.java:302
+#, java-format
+msgid "The fastpath function {0} is unknown."
msgstr ""
-#: org/postgresql/xa/PGXAConnection.java:478
-msgid "Error during one-phase commit"
-msgstr ""
+# key: postgresql.con.refused
+#~ msgid ""
+#~ "Connection refused. Check that the hostname and port are correct and that "
+#~ "the postmaster is accepting TCP/IP connections."
+#~ msgstr ""
+#~ "Подсоединение отклонено. Проверьте что хост и порт указаны правильно и "
+#~ "что postmaster принимает TCP/IP-подсоединения."
-#: org/postgresql/xa/PGXAConnection.java:497
-msgid ""
-"Not implemented: 2nd phase commit must be issued using an idle connection"
-msgstr ""
+# key: postgresql.con.failed
+#~ msgid "The connection url is invalid."
+#~ msgstr "Неверное значение connection url"
-#: org/postgresql/xa/PGXAConnection.java:513
-msgid "Error committing prepared transaction"
-msgstr ""
+# key: postgresql.con.misc
+#~ msgid "Connection rejected: {0}."
+#~ msgstr "Подсоединение отвергнуто: {0}."
-#: org/postgresql/xa/PGXAConnection.java:529
-msgid "Heuristic commit/rollback not supported"
-msgstr ""
+# key: postgresql.con.backend
+#~ msgid "Backend start-up failed: {0}."
+#~ msgstr "Запуск бэкенда не удался: {0}."
+
+#~ msgid "Copy not implemented for protocol version 2"
+#~ msgstr "Команда COPY не реализована для протокола версии 2"
#~ msgid "The class {0} does not implement org.postgresql.util.PGobject."
#~ msgstr "Класс {0} не реализует org.postgresql.util.PGobject."
diff --git a/pgjdbc/src/main/java/org/postgresql/translation/sr.po b/pgjdbc/src/main/java/org/postgresql/translation/sr.po
index 23fdc97..7b45c1e 100644
--- a/pgjdbc/src/main/java/org/postgresql/translation/sr.po
+++ b/pgjdbc/src/main/java/org/postgresql/translation/sr.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PostgreSQL 8.1\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-01-07 13:37+0300\n"
+"POT-Creation-Date: 2018-03-10 23:24+0300\n"
"PO-Revision-Date: 2009-05-26 11:13+0100\n"
"Last-Translator: Bojan Škaljac <skaljac (at) gmail.com>\n"
"Language-Team: Srpski <skaljac at gmail.com>\n"
@@ -19,395 +19,390 @@ msgstr ""
"X-Poedit-Language: Serbian\n"
"X-Poedit-Country: YUGOSLAVIA\n"
-#: org/postgresql/copy/CopyManager.java:57
-#, java-format
-msgid "Requested CopyIn but got {0}"
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:164
+msgid "The sslfactoryarg property may not be empty."
msgstr ""
-#: org/postgresql/copy/CopyManager.java:69
-#, java-format
-msgid "Requested CopyOut but got {0}"
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:180
+msgid ""
+"The environment variable containing the server's SSL certificate must not be "
+"empty."
msgstr ""
-#: org/postgresql/copy/PGCopyInputStream.java:54
-#, java-format
-msgid "Copying from database failed: {0}"
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:188
+msgid ""
+"The system property containing the server's SSL certificate must not be "
+"empty."
+msgstr ""
+
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:195
+msgid ""
+"The sslfactoryarg property must start with the prefix file:, classpath:, "
+"env:, sys:, or -----BEGIN CERTIFICATE-----."
msgstr ""
-#: org/postgresql/copy/PGCopyInputStream.java:70
-#: org/postgresql/copy/PGCopyOutputStream.java:97
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:207
#, fuzzy
-msgid "This copy stream is closed."
-msgstr "ResultSet je zatvoren."
+msgid "An error occurred reading the certificate"
+msgstr "Greška se dogodila prilikom podešavanja SSL konekcije."
-#: org/postgresql/copy/PGCopyInputStream.java:113
-msgid "Read from copy failed."
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:240
+msgid "No X509TrustManager found"
msgstr ""
-#: org/postgresql/copy/PGCopyOutputStream.java:74
-#, java-format
-msgid "Cannot write to copy a byte of value {0}"
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:133
+msgid ""
+"Could not find a java cryptographic algorithm: X.509 CertificateFactory not "
+"available."
msgstr ""
-#: org/postgresql/core/ConnectionFactory.java:74
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:143
#, java-format
-msgid "A connection could not be made using the requested protocol {0}."
-msgstr "Konekciju nije moguće kreirati uz pomoć protokola {0}."
+msgid "Could not open SSL certificate file {0}."
+msgstr ""
-#: org/postgresql/core/Oid.java:114
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:148
#, java-format
-msgid "oid type {0} not known and not a number"
+msgid "Loading the SSL certificate {0} into a KeyManager failed."
msgstr ""
-#: org/postgresql/core/Parser.java:616
-#, java-format
-msgid "Malformed function or procedure escape syntax at offset {0}."
-msgstr "Pogrešna sintaksa u funkciji ili proceduri na poziciji {0}."
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:205
+msgid "Enter SSL password: "
+msgstr ""
-#: org/postgresql/core/PGStream.java:497
-#, java-format
-msgid "Premature end of input stream, expected {0} bytes, but only read {1}."
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:212
+msgid "Could not read password for SSL key file, console is not available."
msgstr ""
-"Prevremen završetak ulaznog toka podataka,očekivano {0} bajtova, a pročitano "
-"samo {1}."
-#: org/postgresql/core/PGStream.java:538
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:217
#, java-format
-msgid "Expected an EOF from server, got: {0}"
-msgstr "Očekivan EOF od servera, a dobijeno: {0}"
-
-#: org/postgresql/core/SetupQueryRunner.java:90
-msgid "An unexpected result was returned by a query."
-msgstr "Nepredviđen rezultat je vraćen od strane upita."
+msgid "Could not read password for SSL key file by callbackhandler {0}."
+msgstr ""
-#: org/postgresql/core/UTF8Encoding.java:31
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:236
#, java-format
-msgid ""
-"Illegal UTF-8 sequence: byte {0} of {1} byte sequence is not 10xxxxxx: {2}"
+msgid "Could not decrypt SSL key file {0}."
msgstr ""
-"Ilegalna UTF-8 sekvenca: bajt {0} od {1} bajtova sekvence nije 10xxxxxx: {2}"
-#: org/postgresql/core/UTF8Encoding.java:69
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:250
#, java-format
-msgid "Illegal UTF-8 sequence: {0} bytes used to encode a {1} byte value: {2}"
+msgid "Could not read SSL key file {0}."
msgstr ""
-"Ilegalna UTF-8 sekvenca: {0} bytes used to encode a {1} byte value: {2}"
-#: org/postgresql/core/UTF8Encoding.java:104
-#: org/postgresql/core/UTF8Encoding.java:131
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:253
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:176
#, java-format
-msgid "Illegal UTF-8 sequence: initial byte is {0}: {1}"
-msgstr "Ilegalna UTF-8 sekvenca: inicijalni bajt je {0}: {1}"
+msgid "Could not find a java cryptographic algorithm: {0}."
+msgstr ""
+
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:99
+#, fuzzy, java-format
+msgid "The password callback class provided {0} could not be instantiated."
+msgstr "SSLSocketFactory klasa koju pruža {0} se nemože instancirati."
-#: org/postgresql/core/UTF8Encoding.java:137
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:132
#, java-format
-msgid "Illegal UTF-8 sequence: final value is out of range: {0}"
-msgstr "Ilegalna UTF-8 sekvenca: finalna vrednost je van opsega: {0}"
+msgid "Could not open SSL root certificate file {0}."
+msgstr ""
-#: org/postgresql/core/UTF8Encoding.java:153
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:147
#, java-format
-msgid "Illegal UTF-8 sequence: final value is a surrogate value: {0}"
-msgstr "Ilegalna UTF-8 sekvenca: finalna vrednost je zamena vrednosti: {0}"
+msgid "Could not read SSL root certificate file {0}."
+msgstr ""
-#: org/postgresql/core/Utils.java:119 org/postgresql/core/Utils.java:136
-msgid "Zero bytes may not occur in string parameters."
-msgstr "Nula bajtovji se ne smeju pojavljivati u string parametrima."
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:151
+#, java-format
+msgid "Loading the SSL root certificate {0} into a TrustManager failed."
+msgstr ""
-#: org/postgresql/core/Utils.java:146 org/postgresql/core/Utils.java:217
-msgid "No IOException expected from StringBuffer or StringBuilder"
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:170
+msgid "Could not initialize SSL context."
msgstr ""
-#: org/postgresql/core/Utils.java:206
-msgid "Zero bytes may not occur in identifiers."
-msgstr "Nula bajtovji se ne smeju pojavljivati u identifikatorima."
+#: org/postgresql/ssl/MakeSSL.java:52
+#, java-format
+msgid "The SSLSocketFactory class provided {0} could not be instantiated."
+msgstr "SSLSocketFactory klasa koju pruža {0} se nemože instancirati."
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:72
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:87
-#, fuzzy, java-format
-msgid "Invalid sslmode value: {0}"
-msgstr "Nevažeća dužina toka {0}."
+#: org/postgresql/ssl/MakeSSL.java:67
+#, java-format
+msgid "SSL error: {0}"
+msgstr ""
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:87
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:111
+#: org/postgresql/ssl/MakeSSL.java:78
#, fuzzy, java-format
-msgid "Invalid targetServerType value: {0}"
-msgstr "Nevažeća dužina toka {0}."
+msgid "The HostnameVerifier class provided {0} could not be instantiated."
+msgstr "SSLSocketFactory klasa koju pruža {0} se nemože instancirati."
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:152
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:228
+#: org/postgresql/ssl/MakeSSL.java:84
#, java-format
-msgid "Could not find a server with specified targetServerType: {0}"
+msgid "The hostname {0} could not be verified by hostnameverifier {1}."
msgstr ""
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:172
-msgid ""
-"Connection refused. Check that the hostname and port are correct and that "
-"the postmaster is accepting TCP/IP connections."
+#: org/postgresql/ssl/MakeSSL.java:93
+#, java-format
+msgid "The hostname {0} could not be verified."
msgstr ""
-"Konekcija odbijena. Proverite dali je ime domćina (host) koretno i da "
-"postmaster podržava TCP/IP konekcije."
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:181
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:262
-msgid "The connection attempt failed."
-msgstr "Pokušaj konektovanja propao."
+#: org/postgresql/gss/GssAction.java:126
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2550
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2581
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2585
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2640
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2650
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2659
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:655
+msgid "Protocol error. Session setup failed."
+msgstr "Greška protokola. Zakazivanje sesije propalo."
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:192
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:273
-#, fuzzy
-msgid "The connection url is invalid."
-msgstr "Pokušaj konektovanja propao."
+#: org/postgresql/gss/GssAction.java:137 org/postgresql/gss/MakeGSS.java:66
+#: org/postgresql/gss/MakeGSS.java:74
+msgid "GSS Authentication failed"
+msgstr ""
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:218
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:233
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:324
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:339
-msgid "The server does not support SSL."
-msgstr "Server ne podržava SSL."
+#: org/postgresql/core/Parser.java:933
+#, java-format
+msgid "Malformed function or procedure escape syntax at offset {0}."
+msgstr "Pogrešna sintaksa u funkciji ili proceduri na poziciji {0}."
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:249
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:355
-msgid "An error occurred while setting up the SSL connection."
-msgstr "Greška se dogodila prilikom podešavanja SSL konekcije."
+#: org/postgresql/core/SocketFactoryFactory.java:41
+#, fuzzy, java-format
+msgid "The SocketFactory class provided {0} could not be instantiated."
+msgstr "SSLSocketFactory klasa koju pruža {0} se nemože instancirati."
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:300
-#, java-format
-msgid "Connection rejected: {0}."
-msgstr "Konekcija odbačena: {0}."
+#: org/postgresql/core/Utils.java:93 org/postgresql/core/Utils.java:110
+msgid "Zero bytes may not occur in string parameters."
+msgstr "Nula bajtovji se ne smeju pojavljivati u string parametrima."
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:321
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:349
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:375
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:456
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:486
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:515
-msgid ""
-"The server requested password-based authentication, but no password was "
-"provided."
+#: org/postgresql/core/Utils.java:120 org/postgresql/core/Utils.java:170
+msgid "No IOException expected from StringBuffer or StringBuilder"
msgstr ""
-"Server zahteva autentifikaciju baziranu na šifri, ali šifra nije prosleđena."
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:405
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:625
+#: org/postgresql/core/Utils.java:159
+msgid "Zero bytes may not occur in identifiers."
+msgstr "Nula bajtovji se ne smeju pojavljivati u identifikatorima."
+
+#: org/postgresql/core/UTF8Encoding.java:28
#, java-format
msgid ""
-"The authentication type {0} is not supported. Check that you have configured "
-"the pg_hba.conf file to include the client''s IP address or subnet, and that "
-"it is using an authentication scheme supported by the driver."
+"Illegal UTF-8 sequence: byte {0} of {1} byte sequence is not 10xxxxxx: {2}"
msgstr ""
-"Tip autentifikacije {0} nije podržan. Proverite dali imate podešen pg_hba."
-"conf fajl koji uključuje klijentovu IP adresu ili podmrežu, i da ta mreža "
-"koristi šemu autentifikacije koja je podržana od strane ovog drajvera."
-
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:412
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:455
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:632
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:688
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:744
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:754
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:763
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:774
-#: org/postgresql/gss/GssAction.java:130
-msgid "Protocol error. Session setup failed."
-msgstr "Greška protokola. Zakazivanje sesije propalo."
-
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:443
-#, java-format
-msgid "Backend start-up failed: {0}."
-msgstr "Pozadinsko startovanje propalo: {0}."
-
-#: org/postgresql/core/v2/FastpathParameterList.java:63
-#: org/postgresql/core/v2/FastpathParameterList.java:89
-#: org/postgresql/core/v2/FastpathParameterList.java:100
-#: org/postgresql/core/v2/FastpathParameterList.java:111
-#: org/postgresql/core/v2/SimpleParameterList.java:70
-#: org/postgresql/core/v2/SimpleParameterList.java:94
-#: org/postgresql/core/v2/SimpleParameterList.java:105
-#: org/postgresql/core/v2/SimpleParameterList.java:116
-#: org/postgresql/core/v2/SimpleParameterList.java:127
-#: org/postgresql/core/v3/CompositeParameterList.java:36
-#: org/postgresql/core/v3/SimpleParameterList.java:53
-#: org/postgresql/core/v3/SimpleParameterList.java:64
-#: org/postgresql/jdbc/PgResultSet.java:2715
-#: org/postgresql/jdbc/PgResultSetMetaData.java:472
-#, java-format
-msgid "The column index is out of range: {0}, number of columns: {1}."
-msgstr "Indeks kolone van osega: {0}, broj kolona: {1}."
+"Ilegalna UTF-8 sekvenca: bajt {0} od {1} bajtova sekvence nije 10xxxxxx: {2}"
-#: org/postgresql/core/v2/FastpathParameterList.java:164
-#: org/postgresql/core/v2/SimpleParameterList.java:191
-#: org/postgresql/core/v3/SimpleParameterList.java:225
+#: org/postgresql/core/UTF8Encoding.java:66
#, java-format
-msgid "No value specified for parameter {0}."
-msgstr "Nije zadata vrednost za parametar {0}."
+msgid "Illegal UTF-8 sequence: {0} bytes used to encode a {1} byte value: {2}"
+msgstr ""
+"Ilegalna UTF-8 sekvenca: {0} bytes used to encode a {1} byte value: {2}"
-#: org/postgresql/core/v2/QueryExecutorImpl.java:87
-#: org/postgresql/core/v2/QueryExecutorImpl.java:347
-#: org/postgresql/core/v3/QueryExecutorImpl.java:404
-#: org/postgresql/core/v3/QueryExecutorImpl.java:465
+#: org/postgresql/core/UTF8Encoding.java:102
+#: org/postgresql/core/UTF8Encoding.java:129
#, java-format
-msgid "Expected command status BEGIN, got {0}."
-msgstr "Očekivan status komande je BEGIN, a dobijeno je {0}."
+msgid "Illegal UTF-8 sequence: initial byte is {0}: {1}"
+msgstr "Ilegalna UTF-8 sekvenca: inicijalni bajt je {0}: {1}"
-#: org/postgresql/core/v2/QueryExecutorImpl.java:92
-#: org/postgresql/core/v3/QueryExecutorImpl.java:470
-#: org/postgresql/jdbc/PgResultSet.java:1731
+#: org/postgresql/core/UTF8Encoding.java:135
#, java-format
-msgid "Unexpected command status: {0}."
-msgstr "Neočekivan komandni status: {0}."
-
-#: org/postgresql/core/v2/QueryExecutorImpl.java:127
-#: org/postgresql/core/v2/QueryExecutorImpl.java:136
-#: org/postgresql/core/v2/QueryExecutorImpl.java:185
-#: org/postgresql/core/v2/QueryExecutorImpl.java:376
-#: org/postgresql/core/v3/QueryExecutorImpl.java:226
-#: org/postgresql/core/v3/QueryExecutorImpl.java:364
-#: org/postgresql/core/v3/QueryExecutorImpl.java:441
-#: org/postgresql/core/v3/QueryExecutorImpl.java:505
-#: org/postgresql/core/v3/QueryExecutorImpl.java:587
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2211
-#: org/postgresql/util/StreamWrapper.java:133
-#, fuzzy
-msgid "An I/O error occurred while sending to the backend."
-msgstr ""
-"Ulazno/izlazna greška se dogodila prilikom slanja podataka pozadinskom "
-"procesu."
+msgid "Illegal UTF-8 sequence: final value is out of range: {0}"
+msgstr "Ilegalna UTF-8 sekvenca: finalna vrednost je van opsega: {0}"
-#: org/postgresql/core/v2/QueryExecutorImpl.java:180
-#: org/postgresql/core/v2/QueryExecutorImpl.java:235
-#: org/postgresql/core/v2/QueryExecutorImpl.java:249
-#: org/postgresql/core/v3/QueryExecutorImpl.java:582
-#: org/postgresql/core/v3/QueryExecutorImpl.java:642
+#: org/postgresql/core/UTF8Encoding.java:151
#, java-format
-msgid "Unknown Response Type {0}."
-msgstr "Nepoznat tip odziva {0}."
+msgid "Illegal UTF-8 sequence: final value is a surrogate value: {0}"
+msgstr "Ilegalna UTF-8 sekvenca: finalna vrednost je zamena vrednosti: {0}"
-#: org/postgresql/core/v2/QueryExecutorImpl.java:453
-#: org/postgresql/core/v2/QueryExecutorImpl.java:503
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1962
-msgid "Ran out of memory retrieving query results."
-msgstr "Nestalo je memorije prilikom preuzimanja rezultata upita."
+#: org/postgresql/core/SetupQueryRunner.java:64
+msgid "An unexpected result was returned by a query."
+msgstr "Nepredviđen rezultat je vraćen od strane upita."
-#: org/postgresql/core/v2/QueryExecutorImpl.java:640
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2328
+#: org/postgresql/core/PGStream.java:486
#, java-format
-msgid "Unable to interpret the update count in command completion tag: {0}."
-msgstr ""
-"Neuspešno prekidanje prebrojavanja ažurivanja u tagu zakompletiranje "
-"komandi: {0}."
-
-#: org/postgresql/core/v2/QueryExecutorImpl.java:654
-msgid "Copy not implemented for protocol version 2"
+msgid "Premature end of input stream, expected {0} bytes, but only read {1}."
msgstr ""
+"Prevremen završetak ulaznog toka podataka,očekivano {0} bajtova, a pročitano "
+"samo {1}."
-#: org/postgresql/core/v2/SocketFactoryFactory.java:36
-#, fuzzy, java-format
-msgid "The SocketFactory class provided {0} could not be instantiated."
-msgstr "SSLSocketFactory klasa koju pruža {0} se nemože instancirati."
+#: org/postgresql/core/PGStream.java:528
+#, java-format
+msgid "Expected an EOF from server, got: {0}"
+msgstr "Očekivan EOF od servera, a dobijeno: {0}"
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:253
-#, fuzzy, java-format
-msgid ""
-"Connection to {0} refused. Check that the hostname and port are correct and "
-"that the postmaster is accepting TCP/IP connections."
+#: org/postgresql/core/v3/CopyOperationImpl.java:54
+msgid "CommandComplete expected COPY but got: "
msgstr ""
-"Konekcija odbijena. Proverite dali je ime domćina (host) koretno i da "
-"postmaster podržava TCP/IP konekcije."
-#: org/postgresql/core/v3/CopyOperationImpl.java:57
-msgid "CommandComplete expected COPY but got: "
+#: org/postgresql/core/v3/CopyInImpl.java:47
+msgid "CopyIn copy direction can't receive data"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:83
+#: org/postgresql/core/v3/QueryExecutorImpl.java:161
msgid "Tried to obtain lock while already holding it"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:98
+#: org/postgresql/core/v3/QueryExecutorImpl.java:177
msgid "Tried to break lock on database connection"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:115
+#: org/postgresql/core/v3/QueryExecutorImpl.java:195
#, fuzzy
msgid "Interrupted while waiting to obtain lock on database connection"
msgstr "Prekinut pokušaj konektovanja."
-#: org/postgresql/core/v3/QueryExecutorImpl.java:220
+#: org/postgresql/core/v3/QueryExecutorImpl.java:327
msgid "Unable to bind parameter values for statement."
msgstr "Nije moguće naći vrednost vezivnog parametra za izjavu (statement)."
-#: org/postgresql/core/v3/QueryExecutorImpl.java:689
+#: org/postgresql/core/v3/QueryExecutorImpl.java:333
+#: org/postgresql/core/v3/QueryExecutorImpl.java:485
+#: org/postgresql/core/v3/QueryExecutorImpl.java:559
+#: org/postgresql/core/v3/QueryExecutorImpl.java:602
+#: org/postgresql/core/v3/QueryExecutorImpl.java:729
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2372
+#: org/postgresql/util/StreamWrapper.java:130
+#, fuzzy
+msgid "An I/O error occurred while sending to the backend."
+msgstr ""
+"Ulazno/izlazna greška se dogodila prilikom slanja podataka pozadinskom "
+"procesu."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:534
+#: org/postgresql/core/v3/QueryExecutorImpl.java:576
+#, java-format
+msgid "Expected command status BEGIN, got {0}."
+msgstr "Očekivan status komande je BEGIN, a dobijeno je {0}."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:581
+#: org/postgresql/jdbc/PgResultSet.java:1778
+#, java-format
+msgid "Unexpected command status: {0}."
+msgstr "Neočekivan komandni status: {0}."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:687
+#, fuzzy
+msgid "An error occurred while trying to get the socket timeout."
+msgstr ""
+"Ulazno/izlazna greška se dogodila prilikom slanja podataka pozadinskom "
+"procesu."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:722
+#: org/postgresql/core/v3/QueryExecutorImpl.java:798
+#, java-format
+msgid "Unknown Response Type {0}."
+msgstr "Nepoznat tip odziva {0}."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:745
+#, fuzzy
+msgid "An error occurred while trying to reset the socket timeout."
+msgstr ""
+"Ulazno/izlazna greška se dogodila prilikom slanja podataka pozadinskom "
+"procesu."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:843
msgid "Database connection failed when starting copy"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:724
+#: org/postgresql/core/v3/QueryExecutorImpl.java:878
msgid "Tried to cancel an inactive copy operation"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:765
+#: org/postgresql/core/v3/QueryExecutorImpl.java:917
msgid "Database connection failed when canceling copy operation"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:781
+#: org/postgresql/core/v3/QueryExecutorImpl.java:933
msgid "Missing expected error response to copy cancel request"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:785
+#: org/postgresql/core/v3/QueryExecutorImpl.java:937
#, java-format
msgid "Got {0} error responses to single copy cancel request"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:800
+#: org/postgresql/core/v3/QueryExecutorImpl.java:952
msgid "Tried to end inactive copy"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:815
+#: org/postgresql/core/v3/QueryExecutorImpl.java:967
msgid "Database connection failed when ending copy"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:833
-#: org/postgresql/core/v3/QueryExecutorImpl.java:855
+#: org/postgresql/core/v3/QueryExecutorImpl.java:985
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1005
msgid "Tried to write to an inactive copy operation"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:848
-#: org/postgresql/core/v3/QueryExecutorImpl.java:863
+#: org/postgresql/core/v3/QueryExecutorImpl.java:998
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1013
msgid "Database connection failed when writing to copy"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:877
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1028
msgid "Tried to read from inactive copy"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:884
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1035
msgid "Database connection failed when reading from copy"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:956
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1101
#, java-format
msgid "Received CommandComplete ''{0}'' without an active copy operation"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:983
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1126
#, java-format
msgid "Got CopyInResponse from server during an active {0}"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:999
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1140
#, java-format
msgid "Got CopyOutResponse from server during an active {0}"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1017
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1154
+#, java-format
+msgid "Got CopyBothResponse from server during an active {0}"
+msgstr ""
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1170
msgid "Got CopyData without an active copy operation"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1021
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1174
#, fuzzy, java-format
msgid "Unexpected copydata from server for {0}"
msgstr "Očekivan EOF od servera, a dobijeno: {0}"
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1061
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2037
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1234
+#, java-format
+msgid "Unexpected packet type during copy: {0}"
+msgstr ""
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1524
+#, java-format
+msgid ""
+"Bind message length {0} too long. This can be caused by very large or "
+"incorrect length specifications on InputStream parameters."
+msgstr ""
+"Dužina vezivne poruke {0} prevelika. Ovo je možda rezultat veoma velike ili "
+"pogrešne dužine specifikacije za InputStream parametre."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2145
+msgid "Ran out of memory retrieving query results."
+msgstr "Nestalo je memorije prilikom preuzimanja rezultata upita."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2313
+msgid "The driver currently does not support COPY operations."
+msgstr "Drajver trenutno ne podržava COPY operacije."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2487
+#, fuzzy, java-format
+msgid "Unable to parse the count in command completion tag: {0}."
+msgstr ""
+"Neuspešno prekidanje prebrojavanja ažurivanja u tagu zakompletiranje "
+"komandi: {0}."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2603
#, fuzzy, java-format
msgid ""
"The server''s client_encoding parameter was changed to {0}. The JDBC driver "
@@ -416,8 +411,7 @@ msgstr ""
"Serverov client_encoding parametar je promenjen u {0}.JDBC darajver zahteva "
"UNICODE client_encoding za uspešno izvršavanje operacije."
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1069
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2045
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2611
#, java-format
msgid ""
"The server''s DateStyle parameter was changed to {0}. The JDBC driver "
@@ -426,8 +420,7 @@ msgstr ""
"Serverov DataStyle parametar promenjen u {0}. JDBC zahteva da DateStyle "
"počinje sa ISO za uspešno završavanje operacije."
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1083
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2059
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2624
#, java-format
msgid ""
"The server''s standard_conforming_strings parameter was reported as {0}. The "
@@ -436,64 +429,194 @@ msgstr ""
"Serverov standard_conforming_strings parametar javlja {0}. JDBC drajver "
"ocekuje on ili off."
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1122
+#: org/postgresql/core/v3/SimpleParameterList.java:54
+#: org/postgresql/core/v3/SimpleParameterList.java:65
+#: org/postgresql/core/v3/CompositeParameterList.java:33
+#: org/postgresql/jdbc/PgResultSetMetaData.java:493
+#: org/postgresql/jdbc/PgResultSet.java:2751
#, java-format
-msgid "Unexpected packet type during copy: {0}"
+msgid "The column index is out of range: {0}, number of columns: {1}."
+msgstr "Indeks kolone van osega: {0}, broj kolona: {1}."
+
+#: org/postgresql/core/v3/SimpleParameterList.java:257
+#, java-format
+msgid "No value specified for parameter {0}."
+msgstr "Nije zadata vrednost za parametar {0}."
+
+#: org/postgresql/core/v3/SimpleParameterList.java:431
+#, fuzzy, java-format
+msgid "Added parameters index out of range: {0}, number of columns: {1}."
+msgstr "Index parametra je van opsega: {0}, broj parametara je: {1}."
+
+#: org/postgresql/core/v3/replication/V3ReplicationProtocol.java:133
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:257
+msgid "The connection attempt failed."
+msgstr "Pokušaj konektovanja propao."
+
+#: org/postgresql/core/v3/replication/V3PGReplicationStream.java:144
+#, java-format
+msgid "Unexpected packet type during replication: {0}"
+msgstr ""
+
+#: org/postgresql/core/v3/replication/V3PGReplicationStream.java:269
+#, fuzzy
+msgid "This replication stream has been closed."
+msgstr "Konekcija je već zatvorena."
+
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:109
+#, fuzzy, java-format
+msgid "Invalid sslmode value: {0}"
+msgstr "Nevažeća dužina toka {0}."
+
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:124
+#, fuzzy, java-format
+msgid "Invalid targetServerType value: {0}"
+msgstr "Nevažeća dužina toka {0}."
+
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:246
+#, fuzzy, java-format
+msgid ""
+"Connection to {0} refused. Check that the hostname and port are correct and "
+"that the postmaster is accepting TCP/IP connections."
msgstr ""
+"Konekcija odbijena. Proverite dali je ime domćina (host) koretno i da "
+"postmaster podržava TCP/IP konekcije."
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1393
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:272
#, java-format
+msgid "Could not find a server with specified targetServerType: {0}"
+msgstr ""
+
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:366
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:379
+msgid "The server does not support SSL."
+msgstr "Server ne podržava SSL."
+
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:393
+msgid "An error occurred while setting up the SSL connection."
+msgstr "Greška se dogodila prilikom podešavanja SSL konekcije."
+
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:494
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:521
msgid ""
-"Bind message length {0} too long. This can be caused by very large or "
-"incorrect length specifications on InputStream parameters."
+"The server requested password-based authentication, but no password was "
+"provided."
msgstr ""
-"Dužina vezivne poruke {0} prevelika. Ovo je možda rezultat veoma velike ili "
-"pogrešne dužine specifikacije za InputStream parametre."
+"Server zahteva autentifikaciju baziranu na šifri, ali šifra nije prosleđena."
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2131
-msgid "The driver currently does not support COPY operations."
-msgstr "Drajver trenutno ne podržava COPY operacije."
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:624
+msgid ""
+"SCRAM authentication is not supported by this driver. You need JDK >= 8 and "
+"pgjdbc >= 42.2.0 (not \".jre\" vesions)"
+msgstr ""
-#: org/postgresql/Driver.java:234
-msgid "Error loading default settings from driverconfig.properties"
-msgstr "Greška u čitanju standardnih podešavanja iz driverconfig.properties"
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:648
+#, java-format
+msgid ""
+"The authentication type {0} is not supported. Check that you have configured "
+"the pg_hba.conf file to include the client''s IP address or subnet, and that "
+"it is using an authentication scheme supported by the driver."
+msgstr ""
+"Tip autentifikacije {0} nije podržan. Proverite dali imate podešen pg_hba."
+"conf fajl koji uključuje klijentovu IP adresu ili podmrežu, i da ta mreža "
+"koristi šemu autentifikacije koja je podržana od strane ovog drajvera."
-#: org/postgresql/Driver.java:247
-msgid "Properties for the driver contains a non-string value for the key "
+#: org/postgresql/core/ConnectionFactory.java:57
+#, java-format
+msgid "A connection could not be made using the requested protocol {0}."
+msgstr "Konekciju nije moguće kreirati uz pomoć protokola {0}."
+
+#: org/postgresql/core/Oid.java:116
+#, java-format
+msgid "oid type {0} not known and not a number"
msgstr ""
-#: org/postgresql/Driver.java:290
+#: org/postgresql/util/HStoreConverter.java:43
+#: org/postgresql/util/HStoreConverter.java:74
+#: org/postgresql/jdbc/PgArray.java:210
+#: org/postgresql/jdbc/PgResultSet.java:1924
msgid ""
-"Your security policy has prevented the connection from being attempted. You "
-"probably need to grant the connect java.net.SocketPermission to the database "
-"server host and port that you wish to connect to."
+"Invalid character data was found. This is most likely caused by stored data "
+"containing characters that are invalid for the character set the database "
+"was created in. The most common example of this is storing 8bit data in a "
+"SQL_ASCII database."
msgstr ""
-"Sigurnosna podešavanja su sprečila konekciju. Verovatno je potrebno da "
-"dozvolite konekciju klasi java.net.SocketPermission na bazu na serveru."
+"Pronađeni su nevažeći karakter podaci. Uzrok je najverovatnije to što "
+"pohranjeni podaci sadrže karaktere koji su nevažeći u setu karaktera sa "
+"kojima je baza kreirana. Npr. Čuvanje 8bit podataka u SQL_ASCII bazi "
+"podataka."
+
+#: org/postgresql/util/PGmoney.java:62
+msgid "Conversion of money failed."
+msgstr "Konverzija novca (money) propala."
+
+#: org/postgresql/util/StreamWrapper.java:56
+#: org/postgresql/jdbc/PgPreparedStatement.java:1449
+msgid "Object is too large to send over the protocol."
+msgstr ""
+
+#: org/postgresql/util/PGInterval.java:152
+msgid "Conversion of interval failed"
+msgstr "Konverzija intervala propala."
-#: org/postgresql/Driver.java:296 org/postgresql/Driver.java:362
+#: org/postgresql/util/ServerErrorMessage.java:45
+#, java-format
msgid ""
-"Something unusual has occurred to cause the driver to fail. Please report "
-"this exception."
+" (pgjdbc: autodetected server-encoding to be {0}, if the message is not "
+"readable, please check database logs and/or host, port, dbname, user, "
+"password, pg_hba.conf)"
msgstr ""
-"Nešto neobično se dogodilo i drajver je zakazao. Molim prijavite ovaj "
-"izuzetak."
-#: org/postgresql/Driver.java:370
-msgid "Connection attempt timed out."
-msgstr "Isteklo je vreme za pokušaj konektovanja."
+#: org/postgresql/util/ServerErrorMessage.java:176
+#, java-format
+msgid "Detail: {0}"
+msgstr "Detalji: {0}"
-#: org/postgresql/Driver.java:383
-msgid "Interrupted while attempting to connect."
-msgstr "Prekinut pokušaj konektovanja."
+#: org/postgresql/util/ServerErrorMessage.java:181
+#, java-format
+msgid "Hint: {0}"
+msgstr "Nagovest: {0}"
-#: org/postgresql/Driver.java:645
+#: org/postgresql/util/ServerErrorMessage.java:185
#, java-format
-msgid "Method {0} is not yet implemented."
-msgstr "Metod {0} nije još impelemtiran."
+msgid "Position: {0}"
+msgstr "Pozicija: {0}"
+
+#: org/postgresql/util/ServerErrorMessage.java:189
+#, java-format
+msgid "Where: {0}"
+msgstr "Gde: {0}"
+
+#: org/postgresql/util/ServerErrorMessage.java:195
+#, java-format
+msgid "Internal Query: {0}"
+msgstr "Interni upit: {0}"
+
+#: org/postgresql/util/ServerErrorMessage.java:199
+#, java-format
+msgid "Internal Position: {0}"
+msgstr "Interna pozicija: {0}"
+
+#: org/postgresql/util/ServerErrorMessage.java:206
+#, java-format
+msgid "Location: File: {0}, Routine: {1}, Line: {2}"
+msgstr "Lokacija: Fajl: {0}, Rutina: {1}, Linija: {2}"
+
+#: org/postgresql/util/ServerErrorMessage.java:211
+#, java-format
+msgid "Server SQLState: {0}"
+msgstr "SQLState servera: {0}"
+
+#: org/postgresql/ds/PGPoolingDataSource.java:269
+msgid "Failed to setup DataSource."
+msgstr ""
+
+#: org/postgresql/ds/PGPoolingDataSource.java:371
+msgid "DataSource has been closed."
+msgstr "DataSource je zatvoren."
-#: org/postgresql/ds/common/BaseDataSource.java:1037
-#: org/postgresql/ds/common/BaseDataSource.java:1047
+#: org/postgresql/ds/common/BaseDataSource.java:1132
+#: org/postgresql/ds/common/BaseDataSource.java:1142
#, fuzzy, java-format
msgid "Unsupported property name: {0}"
msgstr "Za tip nije podržana vrednost: {0}"
@@ -502,7 +625,7 @@ msgstr "Za tip nije podržana vrednost: {0}"
msgid "This PooledConnection has already been closed."
msgstr "PooledConnection je već zatvoren."
-#: org/postgresql/ds/PGPooledConnection.java:313
+#: org/postgresql/ds/PGPooledConnection.java:314
msgid ""
"Connection has been closed automatically because a new connection was opened "
"for the same PooledConnection or the PooledConnection has been closed."
@@ -510,401 +633,525 @@ msgstr ""
"Konekcija je zatvorena automatski zato što je nova konekcija otvorena za "
"isti PooledConnection ili je PooledConnection zatvoren."
-#: org/postgresql/ds/PGPooledConnection.java:314
+#: org/postgresql/ds/PGPooledConnection.java:315
msgid "Connection has been closed."
msgstr "Konekcija je već zatvorena."
-#: org/postgresql/ds/PGPooledConnection.java:418
+#: org/postgresql/ds/PGPooledConnection.java:420
msgid "Statement has been closed."
msgstr "Statemen je već zatvoren."
-#: org/postgresql/ds/PGPoolingDataSource.java:269
-msgid "Failed to setup DataSource."
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:68
+msgid "No SCRAM mechanism(s) advertised by the server"
msgstr ""
-#: org/postgresql/ds/PGPoolingDataSource.java:371
-msgid "DataSource has been closed."
-msgstr "DataSource je zatvoren."
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:81
+msgid "Invalid or unsupported by client SCRAM mechanisms"
+msgstr ""
-#: org/postgresql/fastpath/Fastpath.java:82
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:117
#, fuzzy, java-format
-msgid "Fastpath call {0} - No result was returned and we expected a numeric."
-msgstr ""
-"Fastpath poziv {0} - Nikakav rezultat nije vraćen a očekivan je integer."
+msgid "Invalid server-first-message: {0}"
+msgstr "Nevažeća dužina toka {0}."
-#: org/postgresql/fastpath/Fastpath.java:165
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:147
+#, fuzzy, java-format
+msgid "Invalid server-final-message: {0}"
+msgstr "Nevažeća dužina toka {0}."
+
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:153
#, java-format
-msgid "Fastpath call {0} - No result was returned and we expected an integer."
+msgid "SCRAM authentication failed, server returned error: {0}"
msgstr ""
-"Fastpath poziv {0} - Nikakav rezultat nije vraćen a očekivan je integer."
-#: org/postgresql/fastpath/Fastpath.java:174
-#, fuzzy, java-format
-msgid ""
-"Fastpath call {0} - No result was returned or wrong size while expecting an "
-"integer."
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:160
+msgid "Invalid server SCRAM signature"
msgstr ""
-"Fastpath poziv {0} - Nikakav rezultat nije vraćen a očekivan je integer."
-#: org/postgresql/fastpath/Fastpath.java:191
+#: org/postgresql/osgi/PGDataSourceFactory.java:82
#, fuzzy, java-format
-msgid "Fastpath call {0} - No result was returned and we expected a long."
+msgid "Unsupported properties: {0}"
+msgstr "Za tip nije podržana vrednost: {0}"
+
+#: org/postgresql/Driver.java:214
+msgid "Error loading default settings from driverconfig.properties"
+msgstr "Greška u čitanju standardnih podešavanja iz driverconfig.properties"
+
+#: org/postgresql/Driver.java:226
+msgid "Properties for the driver contains a non-string value for the key "
msgstr ""
-"Fastpath poziv {0} - Nikakav rezultat nije vraćen a očekivan je integer."
-#: org/postgresql/fastpath/Fastpath.java:200
-#, fuzzy, java-format
+#: org/postgresql/Driver.java:270
msgid ""
-"Fastpath call {0} - No result was returned or wrong size while expecting a "
-"long."
+"Your security policy has prevented the connection from being attempted. You "
+"probably need to grant the connect java.net.SocketPermission to the database "
+"server host and port that you wish to connect to."
msgstr ""
-"Fastpath poziv {0} - Nikakav rezultat nije vraćen a očekivan je integer."
+"Sigurnosna podešavanja su sprečila konekciju. Verovatno je potrebno da "
+"dozvolite konekciju klasi java.net.SocketPermission na bazu na serveru."
+
+#: org/postgresql/Driver.java:276 org/postgresql/Driver.java:408
+msgid ""
+"Something unusual has occurred to cause the driver to fail. Please report "
+"this exception."
+msgstr ""
+"Nešto neobično se dogodilo i drajver je zakazao. Molim prijavite ovaj "
+"izuzetak."
+
+#: org/postgresql/Driver.java:416
+msgid "Connection attempt timed out."
+msgstr "Isteklo je vreme za pokušaj konektovanja."
-#: org/postgresql/fastpath/Fastpath.java:312
+#: org/postgresql/Driver.java:429
+msgid "Interrupted while attempting to connect."
+msgstr "Prekinut pokušaj konektovanja."
+
+#: org/postgresql/Driver.java:682
#, java-format
-msgid "The fastpath function {0} is unknown."
-msgstr "Fastpath funkcija {0} je nepoznata."
+msgid "Method {0} is not yet implemented."
+msgstr "Metod {0} nije još impelemtiran."
-#: org/postgresql/geometric/PGbox.java:79
-#: org/postgresql/geometric/PGcircle.java:76
-#: org/postgresql/geometric/PGcircle.java:84
-#: org/postgresql/geometric/PGline.java:109
-#: org/postgresql/geometric/PGline.java:118
-#: org/postgresql/geometric/PGlseg.java:72
-#: org/postgresql/geometric/PGpoint.java:78
+#: org/postgresql/geometric/PGlseg.java:70
+#: org/postgresql/geometric/PGline.java:107
+#: org/postgresql/geometric/PGline.java:116
+#: org/postgresql/geometric/PGcircle.java:74
+#: org/postgresql/geometric/PGcircle.java:82
+#: org/postgresql/geometric/PGpoint.java:76
+#: org/postgresql/geometric/PGbox.java:77
#, java-format
msgid "Conversion to type {0} failed: {1}."
msgstr "Konverzija u tip {0} propala: {1}."
-#: org/postgresql/geometric/PGpath.java:73
+#: org/postgresql/geometric/PGpath.java:70
#, java-format
msgid "Cannot tell if path is open or closed: {0}."
msgstr "Nije moguće utvrditi dali je putanja otvorena ili zatvorena: {0}."
-#: org/postgresql/gss/GssAction.java:141 org/postgresql/gss/MakeGSS.java:69
-#: org/postgresql/gss/MakeGSS.java:77
-msgid "GSS Authentication failed"
-msgstr ""
-
-#: org/postgresql/jdbc/AbstractBlobClob.java:89
+#: org/postgresql/xa/PGXAConnection.java:128
msgid ""
-"Truncation of large objects is only implemented in 8.3 and later servers."
-msgstr ""
-"Skraćivanje velikih objekata je implementirano samo u 8.3 i novijim "
-"serverima."
-
-#: org/postgresql/jdbc/AbstractBlobClob.java:94
-msgid "Cannot truncate LOB to a negative length."
+"Transaction control methods setAutoCommit(true), commit, rollback and "
+"setSavePoint not allowed while an XA transaction is active."
msgstr ""
-#: org/postgresql/jdbc/AbstractBlobClob.java:101
-#: org/postgresql/jdbc/AbstractBlobClob.java:245
+#: org/postgresql/xa/PGXAConnection.java:177
+#: org/postgresql/xa/PGXAConnection.java:253
+#: org/postgresql/xa/PGXAConnection.java:347
#, java-format
-msgid "PostgreSQL LOBs can only index to: {0}"
-msgstr "PostgreSQL LOB mogu jedino da označavaju: {0}"
+msgid "Invalid flags {0}"
+msgstr "Nevažeće zastavice {0}"
-#: org/postgresql/jdbc/AbstractBlobClob.java:241
-msgid "LOB positioning offsets start at 1."
-msgstr "LOB pozicija ofset počinje kod 1."
-
-#: org/postgresql/jdbc/AbstractBlobClob.java:257
-msgid "free() was called on this LOB previously"
-msgstr "free() je pozvan na ovom LOB-u prethodno"
+#: org/postgresql/xa/PGXAConnection.java:181
+#: org/postgresql/xa/PGXAConnection.java:257
+#: org/postgresql/xa/PGXAConnection.java:449
+msgid "xid must not be null"
+msgstr "xid ne sme biti null"
-#: org/postgresql/jdbc/BatchResultHandler.java:41
-#: org/postgresql/jdbc/PgConnection.java:474
-#: org/postgresql/jdbc/PgPreparedStatement.java:138
-#: org/postgresql/jdbc/PgStatement.java:299
-msgid "A result was returned when none was expected."
-msgstr "Rezultat vraćen ali nikakav rezultat nije očekivan."
+#: org/postgresql/xa/PGXAConnection.java:185
+msgid "Connection is busy with another transaction"
+msgstr "Konekcija je zauzeta sa drugom transakciom."
-#: org/postgresql/jdbc/BatchResultHandler.java:59
-msgid "Too many update results were returned."
-msgstr "Previše rezultata za ažuriranje je vraćeno."
+#: org/postgresql/xa/PGXAConnection.java:194
+#: org/postgresql/xa/PGXAConnection.java:267
+msgid "suspend/resume not implemented"
+msgstr "obustavljanje/nastavljanje nije implementirano."
-#: org/postgresql/jdbc/BatchResultHandler.java:88
+#: org/postgresql/xa/PGXAConnection.java:202
+#: org/postgresql/xa/PGXAConnection.java:209
+#: org/postgresql/xa/PGXAConnection.java:213
#, java-format
msgid ""
-"Batch entry {0} {1} was aborted. Call getNextException to see the cause."
+"Invalid protocol state requested. Attempted transaction interleaving is not "
+"supported. xid={0}, currentXid={1}, state={2}, flags={3}"
msgstr ""
-"Smeša prijava {0} {1} je odbačena. Pozovite getNextException da proverite "
-"rezlog."
+"Preplitanje transakcija nije implementirano. xid={0}, currentXid={1}, "
+"state={2}, flags={3}"
-#: org/postgresql/jdbc/EscapedFunctions.java:243
-#, java-format
-msgid "{0} function takes four and only four argument."
-msgstr "Funkcija {0} prima četiri i samo četiri parametra."
+#: org/postgresql/xa/PGXAConnection.java:224
+msgid "Error disabling autocommit"
+msgstr "Greška u isključivanju autokomita"
-#: org/postgresql/jdbc/EscapedFunctions.java:273
-#: org/postgresql/jdbc/EscapedFunctions.java:347
-#: org/postgresql/jdbc/EscapedFunctions.java:752
-#: org/postgresql/jdbc/EscapedFunctions.java:790
+#: org/postgresql/xa/PGXAConnection.java:261
#, java-format
-msgid "{0} function takes two and only two arguments."
-msgstr "Funkcija {0} prima dva i samo dva parametra."
+msgid ""
+"tried to call end without corresponding start call. state={0}, start "
+"xid={1}, currentXid={2}, preparedXid={3}"
+msgstr ""
+"Pokušaj pozivanja kraja pre odgovarajućeg početka. state={0}, start xid={1}, "
+"currentXid={2}, preparedXid={3}"
-#: org/postgresql/jdbc/EscapedFunctions.java:291
-#: org/postgresql/jdbc/EscapedFunctions.java:329
-#: org/postgresql/jdbc/EscapedFunctions.java:449
-#: org/postgresql/jdbc/EscapedFunctions.java:464
-#: org/postgresql/jdbc/EscapedFunctions.java:479
-#: org/postgresql/jdbc/EscapedFunctions.java:494
-#: org/postgresql/jdbc/EscapedFunctions.java:509
-#: org/postgresql/jdbc/EscapedFunctions.java:524
-#: org/postgresql/jdbc/EscapedFunctions.java:539
-#: org/postgresql/jdbc/EscapedFunctions.java:554
-#: org/postgresql/jdbc/EscapedFunctions.java:569
-#: org/postgresql/jdbc/EscapedFunctions.java:584
-#: org/postgresql/jdbc/EscapedFunctions.java:599
-#: org/postgresql/jdbc/EscapedFunctions.java:614
-#: org/postgresql/jdbc/EscapedFunctions.java:778
+#: org/postgresql/xa/PGXAConnection.java:297
+#, fuzzy, java-format
+msgid ""
+"Preparing already prepared transaction, the prepared xid {0}, prepare xid={1}"
+msgstr ""
+"Greška prilikom povratka na prethodo pripremljenu transakciju. rollback "
+"xid={0}, preparedXid={1}, currentXid={2}"
+
+#: org/postgresql/xa/PGXAConnection.java:300
#, java-format
-msgid "{0} function takes one and only one argument."
-msgstr "Funkcija {0} prima jedan i samo jedan parametar."
+msgid "Current connection does not have an associated xid. prepare xid={0}"
+msgstr ""
-#: org/postgresql/jdbc/EscapedFunctions.java:313
-#: org/postgresql/jdbc/EscapedFunctions.java:394
+#: org/postgresql/xa/PGXAConnection.java:307
#, java-format
-msgid "{0} function takes two or three arguments."
-msgstr "Funkcija {0} prima dva ili tri parametra."
+msgid ""
+"Not implemented: Prepare must be issued using the same connection that "
+"started the transaction. currentXid={0}, prepare xid={1}"
+msgstr ""
+"Nije implementirano: Spremanje mora biti pozvano uz korišćenje iste "
+"konekcije koja se koristi za startovanje transakcije. currentXid={0}, "
+"prepare xid={1}"
-#: org/postgresql/jdbc/EscapedFunctions.java:419
-#: org/postgresql/jdbc/EscapedFunctions.java:434
-#: org/postgresql/jdbc/EscapedFunctions.java:737
-#: org/postgresql/jdbc/EscapedFunctions.java:767
+#: org/postgresql/xa/PGXAConnection.java:311
#, java-format
-msgid "{0} function doesn''t take any argument."
-msgstr "Funkcija {0} nema parametara."
+msgid "Prepare called before end. prepare xid={0}, state={1}"
+msgstr "Pripremanje poziva pre kraja. prepare xid={0}, state={1}"
-#: org/postgresql/jdbc/EscapedFunctions.java:630
-#: org/postgresql/jdbc/EscapedFunctions.java:683
+#: org/postgresql/xa/PGXAConnection.java:331
#, java-format
-msgid "{0} function takes three and only three arguments."
-msgstr "Funkcija {0} prima tri i samo tri parametra."
+msgid "Error preparing transaction. prepare xid={0}"
+msgstr "Greška u pripremanju transakcije. prepare xid={0}"
-#: org/postgresql/jdbc/EscapedFunctions.java:643
-#: org/postgresql/jdbc/EscapedFunctions.java:664
-#: org/postgresql/jdbc/EscapedFunctions.java:667
-#: org/postgresql/jdbc/EscapedFunctions.java:700
-#: org/postgresql/jdbc/EscapedFunctions.java:713
-#: org/postgresql/jdbc/EscapedFunctions.java:716
-#, java-format
-msgid "Interval {0} not yet implemented"
-msgstr "Interval {0} još nije implementiran."
+#: org/postgresql/xa/PGXAConnection.java:382
+msgid "Error during recover"
+msgstr "Greška prilikom oporavljanja."
-#: org/postgresql/jdbc/PgArray.java:166 org/postgresql/jdbc/PgArray.java:822
+#: org/postgresql/xa/PGXAConnection.java:438
#, java-format
-msgid "The array index is out of range: {0}"
-msgstr "Indeks niza je van opsega: {0}"
+msgid ""
+"Error rolling back prepared transaction. rollback xid={0}, preparedXid={1}, "
+"currentXid={2}"
+msgstr ""
+"Greška prilikom povratka na prethodo pripremljenu transakciju. rollback "
+"xid={0}, preparedXid={1}, currentXid={2}"
-#: org/postgresql/jdbc/PgArray.java:183 org/postgresql/jdbc/PgArray.java:839
+#: org/postgresql/xa/PGXAConnection.java:471
#, java-format
-msgid "The array index is out of range: {0}, number of elements: {1}."
-msgstr "Indeks niza je van opsega: {0}, broj elemenata: {1}."
+msgid ""
+"One-phase commit called for xid {0} but connection was prepared with xid {1}"
+msgstr ""
-#: org/postgresql/jdbc/PgArray.java:215
-#: org/postgresql/jdbc/PgResultSet.java:1885
-#: org/postgresql/util/HStoreConverter.java:38
-#: org/postgresql/util/HStoreConverter.java:69
+#: org/postgresql/xa/PGXAConnection.java:479
msgid ""
-"Invalid character data was found. This is most likely caused by stored data "
-"containing characters that are invalid for the character set the database "
-"was created in. The most common example of this is storing 8bit data in a "
-"SQL_ASCII database."
+"Not implemented: one-phase commit must be issued using the same connection "
+"that was used to start it"
msgstr ""
-"Pronađeni su nevažeći karakter podaci. Uzrok je najverovatnije to što "
-"pohranjeni podaci sadrže karaktere koji su nevažeći u setu karaktera sa "
-"kojima je baza kreirana. Npr. Čuvanje 8bit podataka u SQL_ASCII bazi "
-"podataka."
+"Nije implementirano: Commit iz jedne faze mora biti izdat uz korištenje iste "
+"konekcije koja je korištena za startovanje."
-#: org/postgresql/jdbc/PgCallableStatement.java:90
-#: org/postgresql/jdbc/PgCallableStatement.java:96
-msgid "A CallableStatement was executed with nothing returned."
-msgstr "CallableStatement je izvršen ali ništa nije vrećeno kao rezultat."
+#: org/postgresql/xa/PGXAConnection.java:483
+#, java-format
+msgid "One-phase commit with unknown xid. commit xid={0}, currentXid={1}"
+msgstr ""
-#: org/postgresql/jdbc/PgCallableStatement.java:107
-msgid "A CallableStatement was executed with an invalid number of parameters"
-msgstr "CallableStatement je izvršen sa nevažećim brojem parametara"
+#: org/postgresql/xa/PGXAConnection.java:487
+#, fuzzy, java-format
+msgid "commit called before end. commit xid={0}, state={1}"
+msgstr "commit pozvan pre kraja."
-#: org/postgresql/jdbc/PgCallableStatement.java:139
+#: org/postgresql/xa/PGXAConnection.java:498
#, java-format
+msgid "Error during one-phase commit. commit xid={0}"
+msgstr "Kreška prilikom commit-a iz jedne faze. commit xid={0}"
+
+#: org/postgresql/xa/PGXAConnection.java:517
msgid ""
-"A CallableStatement function was executed and the out parameter {0} was of "
-"type {1} however type {2} was registered."
+"Not implemented: 2nd phase commit must be issued using an idle connection. "
+"commit xid={0}, currentXid={1}, state={2], transactionState={3}"
msgstr ""
-"CallableStatement funkcija je izvršena dok je izlazni parametar {0} tipa {1} "
-"a tip {2} je registrovan kao izlazni parametar."
+"Nije implementirano: Dvofazni commit mora biti izdat uz korištenje "
+"besposlene konekcije. commit xid={0}, currentXid={1}, state={2], "
+"transactionState={3}"
-#: org/postgresql/jdbc/PgCallableStatement.java:195
+#: org/postgresql/xa/PGXAConnection.java:550
+#, fuzzy, java-format
msgid ""
-"This statement does not declare an OUT parameter. Use '{' ?= call ... '}' "
-"to declare one."
+"Error committing prepared transaction. commit xid={0}, preparedXid={1}, "
+"currentXid={2}"
msgstr ""
-"Izraz ne deklariše izlazni parametar. Koristite '{' ?= poziv ... '}' za "
-"deklarisanje."
+"Greška prilikom povratka na prethodo pripremljenu transakciju. commit "
+"xid={0}, preparedXid={1}, currentXid={2}"
-#: org/postgresql/jdbc/PgCallableStatement.java:239
-msgid "wasNull cannot be call before fetching a result."
-msgstr "wasNull nemože biti pozvan pre zahvatanja rezultata."
+#: org/postgresql/xa/PGXAConnection.java:567
+#, java-format
+msgid "Heuristic commit/rollback not supported. forget xid={0}"
+msgstr "Heuristički commit/rollback nije podržan. forget xid={0}"
-#: org/postgresql/jdbc/PgCallableStatement.java:377
-#: org/postgresql/jdbc/PgCallableStatement.java:396
+#: org/postgresql/jdbc/PgSQLXML.java:147
+msgid "Unable to decode xml data."
+msgstr "Neuspešno dekodiranje XML podataka."
+
+#: org/postgresql/jdbc/PgSQLXML.java:150
#, java-format
+msgid "Unknown XML Source class: {0}"
+msgstr "Nepoznata XML ulazna klasa: {0}"
+
+#: org/postgresql/jdbc/PgSQLXML.java:193
+msgid "Unable to create SAXResult for SQLXML."
+msgstr "Nije moguće kreirati SAXResult za SQLXML."
+
+#: org/postgresql/jdbc/PgSQLXML.java:208
+msgid "Unable to create StAXResult for SQLXML"
+msgstr "Nije moguće kreirati StAXResult za SQLXML"
+
+#: org/postgresql/jdbc/PgSQLXML.java:213
+#, java-format
+msgid "Unknown XML Result class: {0}"
+msgstr "nepoznata XML klasa rezultata: {0}"
+
+#: org/postgresql/jdbc/PgSQLXML.java:225
+msgid "This SQLXML object has already been freed."
+msgstr "Ovaj SQLXML je već obrisan."
+
+#: org/postgresql/jdbc/PgSQLXML.java:234
msgid ""
-"Parameter of type {0} was registered, but call to get{1} (sqltype={2}) was "
-"made."
+"This SQLXML object has not been initialized, so you cannot retrieve data "
+"from it."
msgstr ""
-"Parametar tipa {0} je registrovan,ali poziv za get{1} (sql tip={2}) je "
-"izvršen."
+"SQLXML objekat nije inicijalizovan tako da nije moguće preuzimati podatke iz "
+"njega."
+
+#: org/postgresql/jdbc/PgSQLXML.java:247
+#, java-format
+msgid "Failed to convert binary xml data to encoding: {0}."
+msgstr "Neuspešno konvertovanje binarnih XML podataka u kodnu stranu: {0}."
+
+#: org/postgresql/jdbc/PgSQLXML.java:273
+msgid "Unable to convert DOMResult SQLXML data to a string."
+msgstr "Nije moguće konvertovati DOMResult SQLXML podatke u string."
-#: org/postgresql/jdbc/PgCallableStatement.java:417
+#: org/postgresql/jdbc/PgSQLXML.java:287
msgid ""
-"A CallableStatement was declared, but no call to registerOutParameter(1, "
-"<some type>) was made."
+"This SQLXML object has already been initialized, so you cannot manipulate it "
+"further."
msgstr ""
-"CallableStatement jedeklarisan ali nije bilo poziva registerOutParameter (1, "
-"<neki_tip>)."
+"SQLXML objekat je već inicijalizovan, tako da ga nije moguće dodatno menjati."
-#: org/postgresql/jdbc/PgCallableStatement.java:423
-msgid "No function outputs were registered."
-msgstr "Nije registrovan nikakv izlaz iz funkcije."
+#: org/postgresql/jdbc/PSQLSavepoint.java:37
+#: org/postgresql/jdbc/PSQLSavepoint.java:51
+#: org/postgresql/jdbc/PSQLSavepoint.java:69
+msgid "Cannot reference a savepoint after it has been released."
+msgstr "Nije moguće referenciranje tačke snimanja nakon njenog oslobađanja."
+
+#: org/postgresql/jdbc/PSQLSavepoint.java:42
+msgid "Cannot retrieve the id of a named savepoint."
+msgstr "Nije moguće primiti id imena tačke snimanja."
+
+#: org/postgresql/jdbc/PSQLSavepoint.java:56
+msgid "Cannot retrieve the name of an unnamed savepoint."
+msgstr "Nije moguće izvaditi ime tačke snimanja koja nema ime."
+
+#: org/postgresql/jdbc/PgArray.java:157 org/postgresql/jdbc/PgArray.java:844
+#, java-format
+msgid "The array index is out of range: {0}"
+msgstr "Indeks niza je van opsega: {0}"
-#: org/postgresql/jdbc/PgCallableStatement.java:429
+#: org/postgresql/jdbc/PgArray.java:178 org/postgresql/jdbc/PgArray.java:861
+#, java-format
+msgid "The array index is out of range: {0}, number of elements: {1}."
+msgstr "Indeks niza je van opsega: {0}, broj elemenata: {1}."
+
+#: org/postgresql/jdbc/PgParameterMetaData.java:83
+#, java-format
+msgid "The parameter index is out of range: {0}, number of parameters: {1}."
+msgstr "Index parametra je van opsega: {0}, broj parametara je: {1}."
+
+#: org/postgresql/jdbc/BatchResultHandler.java:92
+msgid "Too many update results were returned."
+msgstr "Previše rezultata za ažuriranje je vraćeno."
+
+#: org/postgresql/jdbc/BatchResultHandler.java:146
+#, fuzzy, java-format
msgid ""
-"Results cannot be retrieved from a CallableStatement before it is executed."
+"Batch entry {0} {1} was aborted: {2} Call getNextException to see other "
+"errors in the batch."
msgstr ""
-"Razultat nemože da se primi iz CallableStatement pre nego što se on izvrši."
+"Smeša prijava {0} {1} je odbačena. Pozovite getNextException da proverite "
+"rezlog."
-#: org/postgresql/jdbc/PgConnection.java:312
+#: org/postgresql/jdbc/PgConnection.java:272
#, java-format
msgid "Unsupported value for stringtype parameter: {0}"
msgstr "Vrednost za parametar tipa string nije podržana: {0}"
-#: org/postgresql/jdbc/PgConnection.java:457
-#: org/postgresql/jdbc/PgPreparedStatement.java:115
-#: org/postgresql/jdbc/PgStatement.java:282
-#: org/postgresql/jdbc/TypeInfoCache.java:230
-#: org/postgresql/jdbc/TypeInfoCache.java:370
-#: org/postgresql/jdbc/TypeInfoCache.java:412
+#: org/postgresql/jdbc/PgConnection.java:424
+#: org/postgresql/jdbc/PgStatement.java:225
+#: org/postgresql/jdbc/TypeInfoCache.java:226
+#: org/postgresql/jdbc/TypeInfoCache.java:371
+#: org/postgresql/jdbc/TypeInfoCache.java:411
+#: org/postgresql/jdbc/TypeInfoCache.java:484
#: org/postgresql/jdbc/TypeInfoCache.java:489
-#: org/postgresql/jdbc/TypeInfoCache.java:494
-#: org/postgresql/jdbc/TypeInfoCache.java:535
-#: org/postgresql/jdbc/TypeInfoCache.java:540
+#: org/postgresql/jdbc/TypeInfoCache.java:526
+#: org/postgresql/jdbc/TypeInfoCache.java:531
+#: org/postgresql/jdbc/PgPreparedStatement.java:119
msgid "No results were returned by the query."
msgstr "Nikakav rezultat nije vraćen od strane upita."
-#: org/postgresql/jdbc/PgConnection.java:578
+#: org/postgresql/jdbc/PgConnection.java:441
+#: org/postgresql/jdbc/PgStatement.java:254
+msgid "A result was returned when none was expected."
+msgstr "Rezultat vraćen ali nikakav rezultat nije očekivan."
+
+#: org/postgresql/jdbc/PgConnection.java:545
msgid "Custom type maps are not supported."
msgstr "Mape sa korisnički definisanim tipovima nisu podržane."
-#: org/postgresql/jdbc/PgConnection.java:620
+#: org/postgresql/jdbc/PgConnection.java:587
#, java-format
msgid "Failed to create object for: {0}."
msgstr "Propao pokušaj kreiranja objekta za: {0}."
-#: org/postgresql/jdbc/PgConnection.java:672
+#: org/postgresql/jdbc/PgConnection.java:641
#, java-format
msgid "Unable to load the class {0} responsible for the datatype {1}"
msgstr "Nije moguće učitati kalsu {0} odgovornu za tip podataka {1}"
-#: org/postgresql/jdbc/PgConnection.java:724
+#: org/postgresql/jdbc/PgConnection.java:693
msgid ""
"Cannot change transaction read-only property in the middle of a transaction."
msgstr ""
"Nije moguće izmeniti read-only osobinu transakcije u sred izvršavanja "
"transakcije."
-#: org/postgresql/jdbc/PgConnection.java:775
+#: org/postgresql/jdbc/PgConnection.java:756
msgid "Cannot commit when autoCommit is enabled."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:786
-#: org/postgresql/jdbc/PgConnection.java:1358
-#: org/postgresql/jdbc/PgConnection.java:1395
+#: org/postgresql/jdbc/PgConnection.java:767
+#: org/postgresql/jdbc/PgConnection.java:1384
+#: org/postgresql/jdbc/PgConnection.java:1428
#, fuzzy
msgid "This connection has been closed."
msgstr "Konekcija je već zatvorena."
-#: org/postgresql/jdbc/PgConnection.java:796
+#: org/postgresql/jdbc/PgConnection.java:777
msgid "Cannot rollback when autoCommit is enabled."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:870
+#: org/postgresql/jdbc/PgConnection.java:827
msgid ""
"Cannot change transaction isolation level in the middle of a transaction."
msgstr ""
"Nije moguće izmeniti nivo izolacije transakcije u sred izvršavanja "
"transakcije."
-#: org/postgresql/jdbc/PgConnection.java:876
+#: org/postgresql/jdbc/PgConnection.java:833
#, java-format
msgid "Transaction isolation level {0} not supported."
msgstr "Nivo izolacije transakcije {0} nije podržan."
-#: org/postgresql/jdbc/PgConnection.java:921
+#: org/postgresql/jdbc/PgConnection.java:878
msgid "Finalizing a Connection that was never closed:"
msgstr "Dovršavanje konekcije koja nikada nije zatvorena:"
-#: org/postgresql/jdbc/PgConnection.java:1009
+#: org/postgresql/jdbc/PgConnection.java:945
msgid "Unable to translate data into the desired encoding."
msgstr "Nije moguće prevesti podatke u odabrani encoding format."
-#: org/postgresql/jdbc/PgConnection.java:1081
-#: org/postgresql/jdbc/PgResultSet.java:1782
-#: org/postgresql/jdbc/PgStatement.java:1053
+#: org/postgresql/jdbc/PgConnection.java:1008
+#: org/postgresql/jdbc/PgStatement.java:903
+#: org/postgresql/jdbc/PgResultSet.java:1817
msgid "Fetch size must be a value greater to or equal to 0."
msgstr "Doneta veličina mora biti vrednost veća ili jednaka 0."
-#: org/postgresql/jdbc/PgConnection.java:1311
+#: org/postgresql/jdbc/PgConnection.java:1289
+#: org/postgresql/jdbc/PgConnection.java:1330
#, java-format
msgid "Unable to find server array type for provided name {0}."
msgstr "Neuspešno nalaženje liste servera za zadato ime {0}."
-#: org/postgresql/jdbc/PgConnection.java:1327
+#: org/postgresql/jdbc/PgConnection.java:1312
+#, fuzzy, java-format
+msgid "Invalid elements {0}"
+msgstr "Nevažeće zastavice {0}"
+
+#: org/postgresql/jdbc/PgConnection.java:1348
#, fuzzy, java-format
msgid "Invalid timeout ({0}<0)."
msgstr "Nevažeća dužina toka {0}."
-#: org/postgresql/jdbc/PgConnection.java:1340
+#: org/postgresql/jdbc/PgConnection.java:1372
msgid "Validating connection."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:1375
+#: org/postgresql/jdbc/PgConnection.java:1405
#, fuzzy, java-format
msgid "Failed to set ClientInfo property: {0}"
msgstr "Propao pokušaj kreiranja objekta za: {0}."
-#: org/postgresql/jdbc/PgConnection.java:1383
+#: org/postgresql/jdbc/PgConnection.java:1415
msgid "ClientInfo property not supported."
msgstr "ClientInfo property nije podržan."
-#: org/postgresql/jdbc/PgConnection.java:1408
+#: org/postgresql/jdbc/PgConnection.java:1441
msgid "One ore more ClientInfo failed."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:1517
+#: org/postgresql/jdbc/PgConnection.java:1540
+#, fuzzy
+msgid "Network timeout must be a value greater than or equal to 0."
+msgstr "Tajm-aut mora biti vrednost veća ili jednaka 0."
+
+#: org/postgresql/jdbc/PgConnection.java:1552
+msgid "Unable to set network timeout."
+msgstr ""
+
+#: org/postgresql/jdbc/PgConnection.java:1563
+msgid "Unable to get network timeout."
+msgstr ""
+
+#: org/postgresql/jdbc/PgConnection.java:1580
#, java-format
msgid "Unknown ResultSet holdability setting: {0}."
msgstr ""
"Nepoznata ResultSet podešavanja za mogućnost držanja (holdability): {0}."
-#: org/postgresql/jdbc/PgConnection.java:1531
-#: org/postgresql/jdbc/PgConnection.java:1554
-#: org/postgresql/jdbc/PgConnection.java:1576
-#: org/postgresql/jdbc/PgConnection.java:1587
-msgid "Server versions prior to 8.0 do not support savepoints."
-msgstr "Verzije servera manje od 8.0 ne podržavaju tačke snimanja."
-
-#: org/postgresql/jdbc/PgConnection.java:1535
-#: org/postgresql/jdbc/PgConnection.java:1558
+#: org/postgresql/jdbc/PgConnection.java:1598
+#: org/postgresql/jdbc/PgConnection.java:1619
msgid "Cannot establish a savepoint in auto-commit mode."
msgstr "U auto-commit modu nije moguće podešavanje tački snimanja."
-#: org/postgresql/jdbc/PgConnection.java:1635
+#: org/postgresql/jdbc/PgConnection.java:1685
msgid "Returning autogenerated keys is not supported."
msgstr "Vraćanje autogenerisanih ključeva nije podržano."
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:78
+#: org/postgresql/jdbc/PgStatement.java:235
+msgid "Multiple ResultSets were returned by the query."
+msgstr "Višestruki ResultSet-vi su vraćeni od strane upita."
+
+#: org/postgresql/jdbc/PgStatement.java:316
+msgid "Can''t use executeWithFlags(int) on a Statement."
+msgstr ""
+
+#: org/postgresql/jdbc/PgStatement.java:509
+msgid "Maximum number of rows must be a value grater than or equal to 0."
+msgstr "Maksimalni broj redova mora biti vrednosti veće ili jednake 0."
+
+#: org/postgresql/jdbc/PgStatement.java:550
+msgid "Query timeout must be a value greater than or equals to 0."
+msgstr "Tajm-aut mora biti vrednost veća ili jednaka 0."
+
+#: org/postgresql/jdbc/PgStatement.java:590
+msgid "The maximum field size must be a value greater than or equal to 0."
+msgstr ""
+"Maksimalna vrednost veličine polja mora biti vrednost veća ili jednaka 0."
+
+#: org/postgresql/jdbc/PgStatement.java:689
+msgid "This statement has been closed."
+msgstr "Statement je zatvoren."
+
+#: org/postgresql/jdbc/PgStatement.java:895
+#: org/postgresql/jdbc/PgResultSet.java:878
+#, java-format
+msgid "Invalid fetch direction constant: {0}."
+msgstr "Pogrešna konstanta za direkciju donošenja: {0}."
+
+#: org/postgresql/jdbc/PgStatement.java:1145
+#: org/postgresql/jdbc/PgStatement.java:1173
+msgid "Returning autogenerated keys by column index is not supported."
+msgstr "Vraćanje autogenerisanih ključeva po kloloni nije podržano."
+
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:66
msgid ""
"Unable to determine a value for MaxIndexKeys due to missing system catalog "
"data."
@@ -912,118 +1159,136 @@ msgstr ""
"Nije moguće odrediti vrednost za MaxIndexKezs zbog nedostatka podataka u "
"sistemskom katalogu."
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:100
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:89
msgid "Unable to find name datatype in the system catalogs."
msgstr "Nije moguće pronaći ime tipa podatka u sistemskom katalogu."
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1117
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1028
msgid "proname"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1117
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1028
msgid "oid"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1119
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1714
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1030
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1481
msgid "typtype"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1122
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1033
msgid "proargtypes"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1732
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1499
msgid "adsrc"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1872
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1963
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1512
+msgid "attidentity"
+msgstr ""
+
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1608
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1684
msgid "rolname"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1873
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1964
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1609
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1685
msgid "relacl"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1878
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1615
msgid "attacl"
msgstr ""
-#: org/postgresql/jdbc/PgParameterMetaData.java:86
+#: org/postgresql/jdbc/AbstractBlobClob.java:78
+msgid ""
+"Truncation of large objects is only implemented in 8.3 and later servers."
+msgstr ""
+"Skraćivanje velikih objekata je implementirano samo u 8.3 i novijim "
+"serverima."
+
+#: org/postgresql/jdbc/AbstractBlobClob.java:83
+msgid "Cannot truncate LOB to a negative length."
+msgstr ""
+
+#: org/postgresql/jdbc/AbstractBlobClob.java:90
+#: org/postgresql/jdbc/AbstractBlobClob.java:234
#, java-format
-msgid "The parameter index is out of range: {0}, number of parameters: {1}."
-msgstr "Index parametra je van opsega: {0}, broj parametara je: {1}."
+msgid "PostgreSQL LOBs can only index to: {0}"
+msgstr "PostgreSQL LOB mogu jedino da označavaju: {0}"
-#: org/postgresql/jdbc/PgPreparedStatement.java:102
-#: org/postgresql/jdbc/PgPreparedStatement.java:128
-#: org/postgresql/jdbc/PgPreparedStatement.java:150
-#: org/postgresql/jdbc/PgPreparedStatement.java:1108
+#: org/postgresql/jdbc/AbstractBlobClob.java:230
+msgid "LOB positioning offsets start at 1."
+msgstr "LOB pozicija ofset počinje kod 1."
+
+#: org/postgresql/jdbc/AbstractBlobClob.java:246
+msgid "free() was called on this LOB previously"
+msgstr "free() je pozvan na ovom LOB-u prethodno"
+
+#: org/postgresql/jdbc/PgPreparedStatement.java:106
+#: org/postgresql/jdbc/PgPreparedStatement.java:127
+#: org/postgresql/jdbc/PgPreparedStatement.java:139
+#: org/postgresql/jdbc/PgPreparedStatement.java:1035
msgid ""
"Can''t use query methods that take a query string on a PreparedStatement."
msgstr ""
"Ne možete da koristite metode za upit koji uzimaju string iz upita u "
"PreparedStatement-u."
-#: org/postgresql/jdbc/PgPreparedStatement.java:119
-#: org/postgresql/jdbc/PgStatement.java:286
-msgid "Multiple ResultSets were returned by the query."
-msgstr "Višestruki ResultSet-vi su vraćeni od strane upita."
-
-#: org/postgresql/jdbc/PgPreparedStatement.java:270
+#: org/postgresql/jdbc/PgPreparedStatement.java:249
msgid "Unknown Types value."
msgstr "Nepoznata vrednost za Types."
-#: org/postgresql/jdbc/PgPreparedStatement.java:417
-#: org/postgresql/jdbc/PgPreparedStatement.java:486
-#: org/postgresql/jdbc/PgPreparedStatement.java:1251
-#: org/postgresql/jdbc/PgPreparedStatement.java:1583
+#: org/postgresql/jdbc/PgPreparedStatement.java:382
+#: org/postgresql/jdbc/PgPreparedStatement.java:439
+#: org/postgresql/jdbc/PgPreparedStatement.java:1191
+#: org/postgresql/jdbc/PgPreparedStatement.java:1490
#, java-format
msgid "Invalid stream length {0}."
msgstr "Nevažeća dužina toka {0}."
-#: org/postgresql/jdbc/PgPreparedStatement.java:447
+#: org/postgresql/jdbc/PgPreparedStatement.java:411
#, java-format
msgid "The JVM claims not to support the {0} encoding."
msgstr "JVM tvrdi da ne podržava {0} encoding."
-#: org/postgresql/jdbc/PgPreparedStatement.java:450
-#: org/postgresql/jdbc/PgPreparedStatement.java:519
-#: org/postgresql/jdbc/PgResultSet.java:1075
-#: org/postgresql/jdbc/PgResultSet.java:1109
+#: org/postgresql/jdbc/PgPreparedStatement.java:414
+#: org/postgresql/jdbc/PgResultSet.java:1122
+#: org/postgresql/jdbc/PgResultSet.java:1156
msgid "Provided InputStream failed."
msgstr "Pribaljeni InputStream zakazao."
-#: org/postgresql/jdbc/PgPreparedStatement.java:536
-#: org/postgresql/jdbc/PgPreparedStatement.java:1170
+#: org/postgresql/jdbc/PgPreparedStatement.java:460
+#: org/postgresql/jdbc/PgPreparedStatement.java:1096
#, java-format
msgid "Unknown type {0}."
msgstr "Nepoznat tip {0}."
-#: org/postgresql/jdbc/PgPreparedStatement.java:553
+#: org/postgresql/jdbc/PgPreparedStatement.java:477
msgid "No hstore extension installed."
msgstr ""
-#: org/postgresql/jdbc/PgPreparedStatement.java:683
-#: org/postgresql/jdbc/PgPreparedStatement.java:705
-#: org/postgresql/jdbc/PgPreparedStatement.java:715
-#: org/postgresql/jdbc/PgPreparedStatement.java:725
+#: org/postgresql/jdbc/PgPreparedStatement.java:619
+#: org/postgresql/jdbc/PgPreparedStatement.java:642
+#: org/postgresql/jdbc/PgPreparedStatement.java:652
+#: org/postgresql/jdbc/PgPreparedStatement.java:664
#, java-format
msgid "Cannot cast an instance of {0} to type {1}"
msgstr "Nije moguće kastovati instancu {0} u tip {1}"
-#: org/postgresql/jdbc/PgPreparedStatement.java:741
+#: org/postgresql/jdbc/PgPreparedStatement.java:682
#, java-format
msgid "Unsupported Types value: {0}"
msgstr "Za tip nije podržana vrednost: {0}"
-#: org/postgresql/jdbc/PgPreparedStatement.java:970
+#: org/postgresql/jdbc/PgPreparedStatement.java:894
#, java-format
msgid "Cannot convert an instance of {0} to type {1}"
msgstr "Nije moguće konvertovati instancu {0} u tip {1}"
-#: org/postgresql/jdbc/PgPreparedStatement.java:1040
+#: org/postgresql/jdbc/PgPreparedStatement.java:968
#, java-format
msgid ""
"Can''t infer the SQL type to use for an instance of {0}. Use setObject() "
@@ -1032,64 +1297,55 @@ msgstr ""
"Nije moguće zaključiti SQL tip koji bi se koristio sa instancom {0}. "
"Koristite setObject() sa zadatim eksplicitnim tipom vrednosti."
-#: org/postgresql/jdbc/PgPreparedStatement.java:1207
-#: org/postgresql/jdbc/PgPreparedStatement.java:1303
-#: org/postgresql/jdbc/PgPreparedStatement.java:1340
+#: org/postgresql/jdbc/PgPreparedStatement.java:1133
+#: org/postgresql/jdbc/PgPreparedStatement.java:1233
msgid "Unexpected error writing large object to database."
msgstr "Neočekivana greška prilikom upisa velikog objekta u bazu podataka."
-#: org/postgresql/jdbc/PgPreparedStatement.java:1278
-#: org/postgresql/jdbc/PgResultSet.java:1163
+#: org/postgresql/jdbc/PgPreparedStatement.java:1178
+#: org/postgresql/jdbc/PgResultSet.java:1210
msgid "Provided Reader failed."
msgstr "Pribavljeni čitač (Reader) zakazao."
-#: org/postgresql/jdbc/PgPreparedStatement.java:1542
-#: org/postgresql/util/StreamWrapper.java:59
-msgid "Object is too large to send over the protocol."
+#: org/postgresql/jdbc/BooleanTypeUtil.java:99
+#, java-format
+msgid "Cannot cast to boolean: \"{0}\""
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:285
+#: org/postgresql/jdbc/PgResultSet.java:280
msgid ""
"Operation requires a scrollable ResultSet, but this ResultSet is "
"FORWARD_ONLY."
msgstr ""
"Operacija zahteva skrolabilan ResultSet,ali ovaj ResultSet je FORWARD_ONLY."
-#: org/postgresql/jdbc/PgResultSet.java:456
-msgid "Unexpected error while decoding character data from a large object."
-msgstr "Neočekivana greška prilikom dekodiranja karaktera iz velikog objekta."
-
-#: org/postgresql/jdbc/PgResultSet.java:507
-#: org/postgresql/jdbc/PgResultSet.java:537
-#: org/postgresql/jdbc/PgResultSet.java:570
-#: org/postgresql/jdbc/PgResultSet.java:2964
+#: org/postgresql/jdbc/PgResultSet.java:492
+#: org/postgresql/jdbc/PgResultSet.java:532
+#: org/postgresql/jdbc/PgResultSet.java:556
+#: org/postgresql/jdbc/PgResultSet.java:594
+#: org/postgresql/jdbc/PgResultSet.java:624
#: org/postgresql/jdbc/PgResultSet.java:3008
+#: org/postgresql/jdbc/PgResultSet.java:3052
#, fuzzy, java-format
msgid "Cannot convert the column of type {0} to requested type {1}."
msgstr "Nije moguće konvertovati instancu {0} u tip {1}"
-#: org/postgresql/jdbc/PgResultSet.java:789
-#: org/postgresql/jdbc/PgResultSet.java:810
-#: org/postgresql/jdbc/PgResultSet.java:1797
+#: org/postgresql/jdbc/PgResultSet.java:838
+#: org/postgresql/jdbc/PgResultSet.java:859
+#: org/postgresql/jdbc/PgResultSet.java:1832
msgid "Can''t use relative move methods while on the insert row."
msgstr ""
"Ne može se koristiti metod relativnog pomeranja prilikom ubacivanja redova."
-#: org/postgresql/jdbc/PgResultSet.java:829
-#: org/postgresql/jdbc/PgStatement.java:1045
-#, java-format
-msgid "Invalid fetch direction constant: {0}."
-msgstr "Pogrešna konstanta za direkciju donošenja: {0}."
-
-#: org/postgresql/jdbc/PgResultSet.java:840
+#: org/postgresql/jdbc/PgResultSet.java:889
msgid "Cannot call cancelRowUpdates() when on the insert row."
msgstr "Nije moguće pozvati cancelRowUpdates() prilikom ubacivanja redova."
-#: org/postgresql/jdbc/PgResultSet.java:856
+#: org/postgresql/jdbc/PgResultSet.java:905
msgid "Cannot call deleteRow() when on the insert row."
msgstr "Nije moguće pozvati deleteRow() prilikom ubacivanja redova."
-#: org/postgresql/jdbc/PgResultSet.java:863
+#: org/postgresql/jdbc/PgResultSet.java:912
msgid ""
"Currently positioned before the start of the ResultSet. You cannot call "
"deleteRow() here."
@@ -1097,7 +1353,7 @@ msgstr ""
"Trenutna pozicija pre početka ResultSet-a. Ne možete pozvati deleteRow() na "
"toj poziciji."
-#: org/postgresql/jdbc/PgResultSet.java:869
+#: org/postgresql/jdbc/PgResultSet.java:918
msgid ""
"Currently positioned after the end of the ResultSet. You cannot call "
"deleteRow() here."
@@ -1105,75 +1361,75 @@ msgstr ""
"Trenutna pozicija posle kraja ResultSet-a. Ne možete pozvati deleteRow() na "
"toj poziciji."
-#: org/postgresql/jdbc/PgResultSet.java:873
+#: org/postgresql/jdbc/PgResultSet.java:922
msgid "There are no rows in this ResultSet."
msgstr "U ResultSet-u nema redova."
-#: org/postgresql/jdbc/PgResultSet.java:914
+#: org/postgresql/jdbc/PgResultSet.java:963
msgid "Not on the insert row."
msgstr "Nije mod ubacivanja redova."
-#: org/postgresql/jdbc/PgResultSet.java:916
+#: org/postgresql/jdbc/PgResultSet.java:965
msgid "You must specify at least one column value to insert a row."
msgstr ""
"Morate specificirati barem jednu vrednost za kolonu da bi ste ubacili red."
-#: org/postgresql/jdbc/PgResultSet.java:1072
-#: org/postgresql/jdbc/PgResultSet.java:1706
-#: org/postgresql/jdbc/PgResultSet.java:2377
-#: org/postgresql/jdbc/PgResultSet.java:2402
+#: org/postgresql/jdbc/PgResultSet.java:1119
+#: org/postgresql/jdbc/PgResultSet.java:1754
+#: org/postgresql/jdbc/PgResultSet.java:2416
+#: org/postgresql/jdbc/PgResultSet.java:2437
#, java-format
msgid "The JVM claims not to support the encoding: {0}"
msgstr "JVM tvrdi da ne podržava encoding: {0}"
-#: org/postgresql/jdbc/PgResultSet.java:1214
+#: org/postgresql/jdbc/PgResultSet.java:1261
msgid "Can''t refresh the insert row."
msgstr "Nije moguće osvežiti ubačeni red."
-#: org/postgresql/jdbc/PgResultSet.java:1280
+#: org/postgresql/jdbc/PgResultSet.java:1328
msgid "Cannot call updateRow() when on the insert row."
msgstr "Nije moguće pozvati updateRow() prilikom ubacivanja redova."
-#: org/postgresql/jdbc/PgResultSet.java:1287
-#: org/postgresql/jdbc/PgResultSet.java:3025
+#: org/postgresql/jdbc/PgResultSet.java:1335
+#: org/postgresql/jdbc/PgResultSet.java:3069
msgid ""
"Cannot update the ResultSet because it is either before the start or after "
"the end of the results."
msgstr ""
"Nije moguće ažurirati ResultSet zato što je ili početak ili kraj rezultata."
-#: org/postgresql/jdbc/PgResultSet.java:1486
+#: org/postgresql/jdbc/PgResultSet.java:1535
msgid "ResultSets with concurrency CONCUR_READ_ONLY cannot be updated."
msgstr "ResultSets sa osobinom CONCUR_READ_ONLY ne moeže biti ažuriran."
-#: org/postgresql/jdbc/PgResultSet.java:1555
+#: org/postgresql/jdbc/PgResultSet.java:1603
#, java-format
msgid "No primary key found for table {0}."
msgstr "Nije pronađen ključ za tabelu {0}."
-#: org/postgresql/jdbc/PgResultSet.java:1941
-#: org/postgresql/jdbc/PgResultSet.java:1946
-#: org/postgresql/jdbc/PgResultSet.java:1986
-#: org/postgresql/jdbc/PgResultSet.java:1992
-#: org/postgresql/jdbc/PgResultSet.java:2790
-#: org/postgresql/jdbc/PgResultSet.java:2796
-#: org/postgresql/jdbc/PgResultSet.java:2820
-#: org/postgresql/jdbc/PgResultSet.java:2825
-#: org/postgresql/jdbc/PgResultSet.java:2841
-#: org/postgresql/jdbc/PgResultSet.java:2862
-#: org/postgresql/jdbc/PgResultSet.java:2873
-#: org/postgresql/jdbc/PgResultSet.java:2886
-#: org/postgresql/jdbc/PgResultSet.java:3013
+#: org/postgresql/jdbc/PgResultSet.java:2011
+#: org/postgresql/jdbc/PgResultSet.java:2016
+#: org/postgresql/jdbc/PgResultSet.java:2803
+#: org/postgresql/jdbc/PgResultSet.java:2809
+#: org/postgresql/jdbc/PgResultSet.java:2834
+#: org/postgresql/jdbc/PgResultSet.java:2840
+#: org/postgresql/jdbc/PgResultSet.java:2864
+#: org/postgresql/jdbc/PgResultSet.java:2869
+#: org/postgresql/jdbc/PgResultSet.java:2885
+#: org/postgresql/jdbc/PgResultSet.java:2906
+#: org/postgresql/jdbc/PgResultSet.java:2917
+#: org/postgresql/jdbc/PgResultSet.java:2930
+#: org/postgresql/jdbc/PgResultSet.java:3057
#, java-format
msgid "Bad value for type {0} : {1}"
msgstr "Pogrešna vrednost za tip {0} : {1}"
-#: org/postgresql/jdbc/PgResultSet.java:2564
+#: org/postgresql/jdbc/PgResultSet.java:2589
#, java-format
msgid "The column name {0} was not found in this ResultSet."
msgstr "Ime kolone {0} nije pronadjeno u ResultSet."
-#: org/postgresql/jdbc/PgResultSet.java:2689
+#: org/postgresql/jdbc/PgResultSet.java:2725
msgid ""
"ResultSet is not updateable. The query that generated this result set must "
"select only one table, and must select all primary keys from that table. See "
@@ -1184,431 +1440,315 @@ msgstr ""
"tabele. Pogledajte API specifikaciju za JDBC 2.1, sekciju 5.6 za više "
"detalja."
-#: org/postgresql/jdbc/PgResultSet.java:2701
+#: org/postgresql/jdbc/PgResultSet.java:2737
msgid "This ResultSet is closed."
msgstr "ResultSet je zatvoren."
-#: org/postgresql/jdbc/PgResultSet.java:2732
+#: org/postgresql/jdbc/PgResultSet.java:2768
msgid "ResultSet not positioned properly, perhaps you need to call next."
msgstr ""
"ResultSet nije pravilno pozicioniran, možda je potrebno da pozovete next."
-#: org/postgresql/jdbc/PgResultSet.java:3045
+#: org/postgresql/jdbc/PgResultSet.java:3089
msgid "Invalid UUID data."
msgstr "Nevažeća UUID podatak."
-#: org/postgresql/jdbc/PgSQLXML.java:150
-msgid "Unable to decode xml data."
-msgstr "Neuspešno dekodiranje XML podataka."
-
-#: org/postgresql/jdbc/PgSQLXML.java:153
-#, java-format
-msgid "Unknown XML Source class: {0}"
-msgstr "Nepoznata XML ulazna klasa: {0}"
-
-#: org/postgresql/jdbc/PgSQLXML.java:196
-msgid "Unable to create SAXResult for SQLXML."
-msgstr "Nije moguće kreirati SAXResult za SQLXML."
+#: org/postgresql/jdbc/PgResultSet.java:3178
+#: org/postgresql/jdbc/PgResultSet.java:3185
+#: org/postgresql/jdbc/PgResultSet.java:3196
+#: org/postgresql/jdbc/PgResultSet.java:3207
+#: org/postgresql/jdbc/PgResultSet.java:3218
+#: org/postgresql/jdbc/PgResultSet.java:3229
+#: org/postgresql/jdbc/PgResultSet.java:3240
+#: org/postgresql/jdbc/PgResultSet.java:3251
+#: org/postgresql/jdbc/PgResultSet.java:3262
+#: org/postgresql/jdbc/PgResultSet.java:3269
+#: org/postgresql/jdbc/PgResultSet.java:3276
+#: org/postgresql/jdbc/PgResultSet.java:3287
+#: org/postgresql/jdbc/PgResultSet.java:3304
+#: org/postgresql/jdbc/PgResultSet.java:3311
+#: org/postgresql/jdbc/PgResultSet.java:3318
+#: org/postgresql/jdbc/PgResultSet.java:3329
+#: org/postgresql/jdbc/PgResultSet.java:3336
+#: org/postgresql/jdbc/PgResultSet.java:3343
+#: org/postgresql/jdbc/PgResultSet.java:3381
+#: org/postgresql/jdbc/PgResultSet.java:3388
+#: org/postgresql/jdbc/PgResultSet.java:3395
+#: org/postgresql/jdbc/PgResultSet.java:3415
+#: org/postgresql/jdbc/PgResultSet.java:3428
+#, fuzzy, java-format
+msgid "conversion to {0} from {1} not supported"
+msgstr "Nivo izolacije transakcije {0} nije podržan."
-#: org/postgresql/jdbc/PgSQLXML.java:211
-msgid "Unable to create StAXResult for SQLXML"
-msgstr "Nije moguće kreirati StAXResult za SQLXML"
+#: org/postgresql/jdbc/TimestampUtils.java:355
+#: org/postgresql/jdbc/TimestampUtils.java:423
+#, fuzzy, java-format
+msgid "Bad value for type timestamp/date/time: {1}"
+msgstr "Pogrešna vrednost za tip {0} : {1}"
-#: org/postgresql/jdbc/PgSQLXML.java:216
-#, java-format
-msgid "Unknown XML Result class: {0}"
-msgstr "nepoznata XML klasa rezultata: {0}"
+#: org/postgresql/jdbc/TimestampUtils.java:858
+#: org/postgresql/jdbc/TimestampUtils.java:915
+#: org/postgresql/jdbc/TimestampUtils.java:961
+#: org/postgresql/jdbc/TimestampUtils.java:1010
+#, fuzzy, java-format
+msgid "Unsupported binary encoding of {0}."
+msgstr "Za tip nije podržana vrednost: {0}"
-#: org/postgresql/jdbc/PgSQLXML.java:228
-msgid "This SQLXML object has already been freed."
-msgstr "Ovaj SQLXML je već obrisan."
+#: org/postgresql/jdbc/PgCallableStatement.java:86
+#: org/postgresql/jdbc/PgCallableStatement.java:96
+msgid "A CallableStatement was executed with nothing returned."
+msgstr "CallableStatement je izvršen ali ništa nije vrećeno kao rezultat."
-#: org/postgresql/jdbc/PgSQLXML.java:237
-msgid ""
-"This SQLXML object has not been initialized, so you cannot retrieve data "
-"from it."
-msgstr ""
-"SQLXML objekat nije inicijalizovan tako da nije moguće preuzimati podatke iz "
-"njega."
+#: org/postgresql/jdbc/PgCallableStatement.java:107
+msgid "A CallableStatement was executed with an invalid number of parameters"
+msgstr "CallableStatement je izvršen sa nevažećim brojem parametara"
-#: org/postgresql/jdbc/PgSQLXML.java:250
+#: org/postgresql/jdbc/PgCallableStatement.java:145
#, java-format
-msgid "Failed to convert binary xml data to encoding: {0}."
-msgstr "Neuspešno konvertovanje binarnih XML podataka u kodnu stranu: {0}."
-
-#: org/postgresql/jdbc/PgSQLXML.java:276
-msgid "Unable to convert DOMResult SQLXML data to a string."
-msgstr "Nije moguće konvertovati DOMResult SQLXML podatke u string."
-
-#: org/postgresql/jdbc/PgSQLXML.java:290
msgid ""
-"This SQLXML object has already been initialized, so you cannot manipulate it "
-"further."
+"A CallableStatement function was executed and the out parameter {0} was of "
+"type {1} however type {2} was registered."
msgstr ""
-"SQLXML objekat je već inicijalizovan, tako da ga nije moguće dodatno menjati."
+"CallableStatement funkcija je izvršena dok je izlazni parametar {0} tipa {1} "
+"a tip {2} je registrovan kao izlazni parametar."
-#: org/postgresql/jdbc/PgStatement.java:325
-msgid "Can''t use executeWithFlags(int) on a Statement."
+#: org/postgresql/jdbc/PgCallableStatement.java:202
+msgid ""
+"This statement does not declare an OUT parameter. Use '{' ?= call ... '}' "
+"to declare one."
msgstr ""
+"Izraz ne deklariše izlazni parametar. Koristite '{' ?= poziv ... '}' za "
+"deklarisanje."
-#: org/postgresql/jdbc/PgStatement.java:484
-msgid "Maximum number of rows must be a value grater than or equal to 0."
-msgstr "Maksimalni broj redova mora biti vrednosti veće ili jednake 0."
-
-#: org/postgresql/jdbc/PgStatement.java:525
-msgid "Query timeout must be a value greater than or equals to 0."
-msgstr "Tajm-aut mora biti vrednost veća ili jednaka 0."
+#: org/postgresql/jdbc/PgCallableStatement.java:246
+msgid "wasNull cannot be call before fetching a result."
+msgstr "wasNull nemože biti pozvan pre zahvatanja rezultata."
-#: org/postgresql/jdbc/PgStatement.java:561
-msgid "The maximum field size must be a value greater than or equal to 0."
+#: org/postgresql/jdbc/PgCallableStatement.java:384
+#: org/postgresql/jdbc/PgCallableStatement.java:403
+#, java-format
+msgid ""
+"Parameter of type {0} was registered, but call to get{1} (sqltype={2}) was "
+"made."
msgstr ""
-"Maksimalna vrednost veličine polja mora biti vrednost veća ili jednaka 0."
-
-#: org/postgresql/jdbc/PgStatement.java:871
-msgid "This statement has been closed."
-msgstr "Statement je zatvoren."
+"Parametar tipa {0} je registrovan,ali poziv za get{1} (sql tip={2}) je "
+"izvršen."
-#: org/postgresql/jdbc/PgStatement.java:1148
+#: org/postgresql/jdbc/PgCallableStatement.java:424
msgid ""
-"Returning autogenerated keys is only supported for 8.2 and later servers."
+"A CallableStatement was declared, but no call to registerOutParameter(1, "
+"<some type>) was made."
msgstr ""
-"Vraćanje autogenerisanih ključeva je podržano samo za verzije servera od 8.2 "
-"pa na dalje."
-
-#: org/postgresql/jdbc/PgStatement.java:1326
-#: org/postgresql/jdbc/PgStatement.java:1357
-msgid "Returning autogenerated keys by column index is not supported."
-msgstr "Vraćanje autogenerisanih ključeva po kloloni nije podržano."
-
-#: org/postgresql/jdbc/PSQLSavepoint.java:40
-#: org/postgresql/jdbc/PSQLSavepoint.java:54
-#: org/postgresql/jdbc/PSQLSavepoint.java:72
-msgid "Cannot reference a savepoint after it has been released."
-msgstr "Nije moguće referenciranje tačke snimanja nakon njenog oslobađanja."
-
-#: org/postgresql/jdbc/PSQLSavepoint.java:45
-msgid "Cannot retrieve the id of a named savepoint."
-msgstr "Nije moguće primiti id imena tačke snimanja."
-
-#: org/postgresql/jdbc/PSQLSavepoint.java:59
-msgid "Cannot retrieve the name of an unnamed savepoint."
-msgstr "Nije moguće izvaditi ime tačke snimanja koja nema ime."
+"CallableStatement jedeklarisan ali nije bilo poziva registerOutParameter (1, "
+"<neki_tip>)."
-#: org/postgresql/jdbc/TimestampUtils.java:298
-#, fuzzy, java-format
-msgid "Bad value for type timestamp/date/time: {1}"
-msgstr "Pogrešna vrednost za tip {0} : {1}"
+#: org/postgresql/jdbc/PgCallableStatement.java:430
+msgid "No function outputs were registered."
+msgstr "Nije registrovan nikakv izlaz iz funkcije."
-#: org/postgresql/jdbc/TimestampUtils.java:359
+#: org/postgresql/jdbc/PgCallableStatement.java:436
msgid ""
-"Infinite value found for timestamp/date. This cannot be represented as time."
+"Results cannot be retrieved from a CallableStatement before it is executed."
msgstr ""
-"Beskonačna vrednost je pronađena za tipestamp/date. To se nemože predstaviti "
-"kao vreme."
-
-#: org/postgresql/jdbc/TimestampUtils.java:674
-#: org/postgresql/jdbc/TimestampUtils.java:710
-#: org/postgresql/jdbc/TimestampUtils.java:757
-#, fuzzy, java-format
-msgid "Unsupported binary encoding of {0}."
-msgstr "Za tip nije podržana vrednost: {0}"
-
-#: org/postgresql/largeobject/LargeObjectManager.java:147
-msgid "Failed to initialize LargeObject API"
-msgstr "Propao pokušaj inicijalizacije LargeObject API-ja."
-
-#: org/postgresql/largeobject/LargeObjectManager.java:265
-#: org/postgresql/largeobject/LargeObjectManager.java:308
-msgid "Large Objects may not be used in auto-commit mode."
-msgstr "Veliki objekti (Large Object) se nemogu koristiti u auto-commit modu."
+"Razultat nemože da se primi iz CallableStatement pre nego što se on izvrši."
-#: org/postgresql/osgi/PGDataSourceFactory.java:85
+#: org/postgresql/jdbc/PgCallableStatement.java:703
#, fuzzy, java-format
-msgid "Unsupported properties: {0}"
+msgid "Unsupported type conversion to {1}."
msgstr "Za tip nije podržana vrednost: {0}"
-#: org/postgresql/PGProperty.java:450 org/postgresql/PGProperty.java:470
+#: org/postgresql/jdbc/EscapedFunctions.java:240
#, java-format
-msgid "{0} parameter value must be an integer but was: {1}"
-msgstr ""
-
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:125
-msgid ""
-"Could not find a java cryptographic algorithm: X.509 CertificateFactory not "
-"available."
-msgstr ""
+msgid "{0} function takes four and only four argument."
+msgstr "Funkcija {0} prima četiri i samo četiri parametra."
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:135
+#: org/postgresql/jdbc/EscapedFunctions.java:270
+#: org/postgresql/jdbc/EscapedFunctions.java:344
+#: org/postgresql/jdbc/EscapedFunctions.java:749
+#: org/postgresql/jdbc/EscapedFunctions.java:787
#, java-format
-msgid "Could not open SSL certificate file {0}."
-msgstr ""
+msgid "{0} function takes two and only two arguments."
+msgstr "Funkcija {0} prima dva i samo dva parametra."
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:140
+#: org/postgresql/jdbc/EscapedFunctions.java:288
+#: org/postgresql/jdbc/EscapedFunctions.java:326
+#: org/postgresql/jdbc/EscapedFunctions.java:446
+#: org/postgresql/jdbc/EscapedFunctions.java:461
+#: org/postgresql/jdbc/EscapedFunctions.java:476
+#: org/postgresql/jdbc/EscapedFunctions.java:491
+#: org/postgresql/jdbc/EscapedFunctions.java:506
+#: org/postgresql/jdbc/EscapedFunctions.java:521
+#: org/postgresql/jdbc/EscapedFunctions.java:536
+#: org/postgresql/jdbc/EscapedFunctions.java:551
+#: org/postgresql/jdbc/EscapedFunctions.java:566
+#: org/postgresql/jdbc/EscapedFunctions.java:581
+#: org/postgresql/jdbc/EscapedFunctions.java:596
+#: org/postgresql/jdbc/EscapedFunctions.java:611
+#: org/postgresql/jdbc/EscapedFunctions.java:775
#, java-format
-msgid "Loading the SSL certificate {0} into a KeyManager failed."
-msgstr ""
-
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:195
-msgid "Enter SSL password: "
-msgstr ""
+msgid "{0} function takes one and only one argument."
+msgstr "Funkcija {0} prima jedan i samo jedan parametar."
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:202
-msgid "Could not read password for SSL key file, console is not available."
-msgstr ""
+#: org/postgresql/jdbc/EscapedFunctions.java:310
+#: org/postgresql/jdbc/EscapedFunctions.java:391
+#, java-format
+msgid "{0} function takes two or three arguments."
+msgstr "Funkcija {0} prima dva ili tri parametra."
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:207
+#: org/postgresql/jdbc/EscapedFunctions.java:416
+#: org/postgresql/jdbc/EscapedFunctions.java:431
+#: org/postgresql/jdbc/EscapedFunctions.java:734
+#: org/postgresql/jdbc/EscapedFunctions.java:764
#, java-format
-msgid "Could not read password for SSL key file by callbackhandler {0}."
-msgstr ""
+msgid "{0} function doesn''t take any argument."
+msgstr "Funkcija {0} nema parametara."
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:226
+#: org/postgresql/jdbc/EscapedFunctions.java:627
+#: org/postgresql/jdbc/EscapedFunctions.java:680
#, java-format
-msgid "Could not decrypt SSL key file {0}."
-msgstr ""
+msgid "{0} function takes three and only three arguments."
+msgstr "Funkcija {0} prima tri i samo tri parametra."
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:240
+#: org/postgresql/jdbc/EscapedFunctions.java:640
+#: org/postgresql/jdbc/EscapedFunctions.java:661
+#: org/postgresql/jdbc/EscapedFunctions.java:664
+#: org/postgresql/jdbc/EscapedFunctions.java:697
+#: org/postgresql/jdbc/EscapedFunctions.java:710
+#: org/postgresql/jdbc/EscapedFunctions.java:713
#, java-format
-msgid "Could not read SSL key file {0}."
-msgstr ""
+msgid "Interval {0} not yet implemented"
+msgstr "Interval {0} još nije implementiran."
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:243
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:162
+#: org/postgresql/PGProperty.java:535 org/postgresql/PGProperty.java:555
#, java-format
-msgid "Could not find a java cryptographic algorithm: {0}."
+msgid "{0} parameter value must be an integer but was: {1}"
msgstr ""
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:90
-#, fuzzy, java-format
-msgid "The password callback class provided {0} could not be instantiated."
-msgstr "SSLSocketFactory klasa koju pruža {0} se nemože instancirati."
+#: org/postgresql/largeobject/LargeObjectManager.java:144
+msgid "Failed to initialize LargeObject API"
+msgstr "Propao pokušaj inicijalizacije LargeObject API-ja."
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:123
-#, java-format
-msgid "Could not open SSL root certificate file {0}."
-msgstr ""
+#: org/postgresql/largeobject/LargeObjectManager.java:262
+#: org/postgresql/largeobject/LargeObjectManager.java:305
+msgid "Large Objects may not be used in auto-commit mode."
+msgstr "Veliki objekti (Large Object) se nemogu koristiti u auto-commit modu."
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:139
+#: org/postgresql/copy/PGCopyInputStream.java:51
#, java-format
-msgid "Could not read SSL root certificate file {0}."
+msgid "Copying from database failed: {0}"
msgstr ""
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:143
-#, java-format
-msgid "Loading the SSL root certificate {0} into a TrustManager failed."
-msgstr ""
+#: org/postgresql/copy/PGCopyInputStream.java:67
+#: org/postgresql/copy/PGCopyOutputStream.java:94
+#, fuzzy
+msgid "This copy stream is closed."
+msgstr "ResultSet je zatvoren."
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:156
-msgid "Could not initialize SSL context."
+#: org/postgresql/copy/PGCopyInputStream.java:110
+msgid "Read from copy failed."
msgstr ""
-#: org/postgresql/ssl/MakeSSL.java:52
+#: org/postgresql/copy/CopyManager.java:53
#, java-format
-msgid "The SSLSocketFactory class provided {0} could not be instantiated."
-msgstr "SSLSocketFactory klasa koju pruža {0} se nemože instancirati."
-
-#: org/postgresql/ssl/MakeSSL.java:67
-#, java-format
-msgid "SSL error: {0}"
+msgid "Requested CopyIn but got {0}"
msgstr ""
-#: org/postgresql/ssl/MakeSSL.java:78
-#, fuzzy, java-format
-msgid "The HostnameVerifier class provided {0} could not be instantiated."
-msgstr "SSLSocketFactory klasa koju pruža {0} se nemože instancirati."
-
-#: org/postgresql/ssl/MakeSSL.java:84
+#: org/postgresql/copy/CopyManager.java:64
#, java-format
-msgid "The hostname {0} could not be verified by hostnameverifier {1}."
+msgid "Requested CopyOut but got {0}"
msgstr ""
-#: org/postgresql/ssl/MakeSSL.java:93
+#: org/postgresql/copy/CopyManager.java:75
#, java-format
-msgid "The hostname {0} could not be verified."
+msgid "Requested CopyDual but got {0}"
msgstr ""
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:167
-msgid "The sslfactoryarg property may not be empty."
+#: org/postgresql/copy/PGCopyOutputStream.java:71
+#, java-format
+msgid "Cannot write to copy a byte of value {0}"
msgstr ""
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:183
-msgid ""
-"The environment variable containing the server's SSL certificate must not be "
-"empty."
+#: org/postgresql/fastpath/Fastpath.java:80
+#, fuzzy, java-format
+msgid "Fastpath call {0} - No result was returned and we expected a numeric."
msgstr ""
+"Fastpath poziv {0} - Nikakav rezultat nije vraćen a očekivan je integer."
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:191
-msgid ""
-"The system property containing the server's SSL certificate must not be "
-"empty."
+#: org/postgresql/fastpath/Fastpath.java:157
+#, java-format
+msgid "Fastpath call {0} - No result was returned and we expected an integer."
msgstr ""
+"Fastpath poziv {0} - Nikakav rezultat nije vraćen a očekivan je integer."
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:198
+#: org/postgresql/fastpath/Fastpath.java:165
+#, fuzzy, java-format
msgid ""
-"The sslfactoryarg property must start with the prefix file:, classpath:, "
-"env:, sys:, or -----BEGIN CERTIFICATE-----."
-msgstr ""
-
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:210
-#, fuzzy
-msgid "An error occurred reading the certificate"
-msgstr "Greška se dogodila prilikom podešavanja SSL konekcije."
-
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:243
-msgid "No X509TrustManager found"
+"Fastpath call {0} - No result was returned or wrong size while expecting an "
+"integer."
msgstr ""
+"Fastpath poziv {0} - Nikakav rezultat nije vraćen a očekivan je integer."
-#: org/postgresql/util/PGInterval.java:155
-msgid "Conversion of interval failed"
-msgstr "Konverzija intervala propala."
-
-#: org/postgresql/util/PGmoney.java:65
-msgid "Conversion of money failed."
-msgstr "Konverzija novca (money) propala."
-
-#: org/postgresql/util/ServerErrorMessage.java:165
-#, java-format
-msgid "Detail: {0}"
-msgstr "Detalji: {0}"
-
-#: org/postgresql/util/ServerErrorMessage.java:170
-#, java-format
-msgid "Hint: {0}"
-msgstr "Nagovest: {0}"
-
-#: org/postgresql/util/ServerErrorMessage.java:174
-#, java-format
-msgid "Position: {0}"
-msgstr "Pozicija: {0}"
-
-#: org/postgresql/util/ServerErrorMessage.java:178
-#, java-format
-msgid "Where: {0}"
-msgstr "Gde: {0}"
-
-#: org/postgresql/util/ServerErrorMessage.java:184
-#, java-format
-msgid "Internal Query: {0}"
-msgstr "Interni upit: {0}"
-
-#: org/postgresql/util/ServerErrorMessage.java:188
-#, java-format
-msgid "Internal Position: {0}"
-msgstr "Interna pozicija: {0}"
-
-#: org/postgresql/util/ServerErrorMessage.java:195
-#, java-format
-msgid "Location: File: {0}, Routine: {1}, Line: {2}"
-msgstr "Lokacija: Fajl: {0}, Rutina: {1}, Linija: {2}"
-
-#: org/postgresql/util/ServerErrorMessage.java:200
-#, java-format
-msgid "Server SQLState: {0}"
-msgstr "SQLState servera: {0}"
-
-#: org/postgresql/xa/PGXAConnection.java:148
-msgid ""
-"Transaction control methods setAutoCommit(true), commit, rollback and "
-"setSavePoint not allowed while an XA transaction is active."
+#: org/postgresql/fastpath/Fastpath.java:182
+#, fuzzy, java-format
+msgid "Fastpath call {0} - No result was returned and we expected a long."
msgstr ""
+"Fastpath poziv {0} - Nikakav rezultat nije vraćen a očekivan je integer."
-#: org/postgresql/xa/PGXAConnection.java:196
-#: org/postgresql/xa/PGXAConnection.java:265
-msgid "Invalid flags"
-msgstr "Nevažeće zastavice"
-
-#: org/postgresql/xa/PGXAConnection.java:200
-#: org/postgresql/xa/PGXAConnection.java:269
-#: org/postgresql/xa/PGXAConnection.java:437
-msgid "xid must not be null"
-msgstr "xid ne sme biti null"
-
-#: org/postgresql/xa/PGXAConnection.java:204
-msgid "Connection is busy with another transaction"
-msgstr "Konekcija je zauzeta sa drugom transakciom."
-
-#: org/postgresql/xa/PGXAConnection.java:213
-#: org/postgresql/xa/PGXAConnection.java:279
-msgid "suspend/resume not implemented"
-msgstr "obustavljanje/nastavljanje nije implementirano."
-
-#: org/postgresql/xa/PGXAConnection.java:219
-#: org/postgresql/xa/PGXAConnection.java:224
-#: org/postgresql/xa/PGXAConnection.java:228
-msgid "Transaction interleaving not implemented"
-msgstr "Preplitanje transakcija nije implementirano."
-
-#: org/postgresql/xa/PGXAConnection.java:239
-msgid "Error disabling autocommit"
-msgstr "Greška u isključivanju autokomita"
-
-#: org/postgresql/xa/PGXAConnection.java:273
-msgid "tried to call end without corresponding start call"
-msgstr "Pokušaj pozivanja kraja pre odgovarajućeg početka."
-
-#: org/postgresql/xa/PGXAConnection.java:305
+#: org/postgresql/fastpath/Fastpath.java:190
+#, fuzzy, java-format
msgid ""
-"Not implemented: Prepare must be issued using the same connection that "
-"started the transaction"
+"Fastpath call {0} - No result was returned or wrong size while expecting a "
+"long."
msgstr ""
-"Nije implementirano: Spremanje mora biti pozvano uz korišćenje iste "
-"konekcije koja se koristi za startovanje transakcije."
-
-#: org/postgresql/xa/PGXAConnection.java:309
-msgid "Prepare called before end"
-msgstr "Pripremanje poziva pre kraja."
+"Fastpath poziv {0} - Nikakav rezultat nije vraćen a očekivan je integer."
-#: org/postgresql/xa/PGXAConnection.java:317
-msgid "Server versions prior to 8.1 do not support two-phase commit."
-msgstr "Verzije servera pre 8.1 verzije ne podržavaju commit iz dve faze."
+#: org/postgresql/fastpath/Fastpath.java:302
+#, java-format
+msgid "The fastpath function {0} is unknown."
+msgstr "Fastpath funkcija {0} je nepoznata."
-#: org/postgresql/xa/PGXAConnection.java:334
-msgid "Error preparing transaction"
-msgstr "Greška u pripremanju transakcije."
+#~ msgid ""
+#~ "Connection refused. Check that the hostname and port are correct and that "
+#~ "the postmaster is accepting TCP/IP connections."
+#~ msgstr ""
+#~ "Konekcija odbijena. Proverite dali je ime domćina (host) koretno i da "
+#~ "postmaster podržava TCP/IP konekcije."
-#: org/postgresql/xa/PGXAConnection.java:349
-msgid "Invalid flag"
-msgstr "Nevažeća zastavica (flag)"
+#, fuzzy
+#~ msgid "The connection url is invalid."
+#~ msgstr "Pokušaj konektovanja propao."
-#: org/postgresql/xa/PGXAConnection.java:384
-msgid "Error during recover"
-msgstr "Greška prilikom oporavljanja."
+#~ msgid "Connection rejected: {0}."
+#~ msgstr "Konekcija odbačena: {0}."
-#: org/postgresql/xa/PGXAConnection.java:423
-#: org/postgresql/xa/PGXAConnection.java:426
-msgid "Error rolling back prepared transaction"
-msgstr "Greška prilikom povratka na prethodo pripremljenu transakciju."
+#~ msgid "Backend start-up failed: {0}."
+#~ msgstr "Pozadinsko startovanje propalo: {0}."
-#: org/postgresql/xa/PGXAConnection.java:464
-msgid ""
-"Not implemented: one-phase commit must be issued using the same connection "
-"that was used to start it"
-msgstr ""
-"Nije implementirano: Commit iz jedne faze mora biti izdat uz korištenje iste "
-"konekcije koja je korištena za startovanje."
+#~ msgid "Server versions prior to 8.0 do not support savepoints."
+#~ msgstr "Verzije servera manje od 8.0 ne podržavaju tačke snimanja."
-#: org/postgresql/xa/PGXAConnection.java:468
-msgid "commit called before end"
-msgstr "commit pozvan pre kraja."
+#~ msgid "Unexpected error while decoding character data from a large object."
+#~ msgstr ""
+#~ "Neočekivana greška prilikom dekodiranja karaktera iz velikog objekta."
-#: org/postgresql/xa/PGXAConnection.java:478
-msgid "Error during one-phase commit"
-msgstr "Kreška prilikom commit-a iz jedne faze."
+#~ msgid ""
+#~ "Returning autogenerated keys is only supported for 8.2 and later servers."
+#~ msgstr ""
+#~ "Vraćanje autogenerisanih ključeva je podržano samo za verzije servera od "
+#~ "8.2 pa na dalje."
-#: org/postgresql/xa/PGXAConnection.java:497
-msgid ""
-"Not implemented: 2nd phase commit must be issued using an idle connection"
-msgstr ""
-"Nije implementirano: Dvofazni commit mora biti izdat uz korištenje "
-"besposlene konekcije."
+#~ msgid ""
+#~ "Infinite value found for timestamp/date. This cannot be represented as "
+#~ "time."
+#~ msgstr ""
+#~ "Beskonačna vrednost je pronađena za tipestamp/date. To se nemože "
+#~ "predstaviti kao vreme."
-#: org/postgresql/xa/PGXAConnection.java:513
-#, fuzzy
-msgid "Error committing prepared transaction"
-msgstr "Greška prilikom povratka na prethodo pripremljenu transakciju."
+#~ msgid "Server versions prior to 8.1 do not support two-phase commit."
+#~ msgstr "Verzije servera pre 8.1 verzije ne podržavaju commit iz dve faze."
-#: org/postgresql/xa/PGXAConnection.java:529
-msgid "Heuristic commit/rollback not supported"
-msgstr "Heuristički commit/rollback nije podržan."
+#~ msgid "Invalid flag"
+#~ msgstr "Nevažeća zastavica (flag)"
#~ msgid "The class {0} does not implement org.postgresql.util.PGobject."
#~ msgstr "Klasa {0} ne implementira org.postgresql.util.PGobject."
diff --git a/pgjdbc/src/main/java/org/postgresql/translation/tr.po b/pgjdbc/src/main/java/org/postgresql/translation/tr.po
index 5eb5579..b07cba4 100644
--- a/pgjdbc/src/main/java/org/postgresql/translation/tr.po
+++ b/pgjdbc/src/main/java/org/postgresql/translation/tr.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: jdbc-tr\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-01-07 13:37+0300\n"
+"POT-Creation-Date: 2018-03-10 23:24+0300\n"
"PO-Revision-Date: 2009-05-31 21:47+0200\n"
"Last-Translator: Devrim GÜNDÜZ <devrim at gunduz.org>\n"
"Language-Team: Turkish <pgsql-tr-genel at PostgreSQL.org>\n"
@@ -19,392 +19,383 @@ msgstr ""
"X-Poedit-Language: Turkish\n"
"X-Poedit-Country: TURKEY\n"
-#: org/postgresql/copy/CopyManager.java:57
-#, java-format
-msgid "Requested CopyIn but got {0}"
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:164
+msgid "The sslfactoryarg property may not be empty."
msgstr ""
-#: org/postgresql/copy/CopyManager.java:69
-#, java-format
-msgid "Requested CopyOut but got {0}"
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:180
+msgid ""
+"The environment variable containing the server's SSL certificate must not be "
+"empty."
msgstr ""
-#: org/postgresql/copy/PGCopyInputStream.java:54
-#, java-format
-msgid "Copying from database failed: {0}"
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:188
+msgid ""
+"The system property containing the server's SSL certificate must not be "
+"empty."
+msgstr ""
+
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:195
+msgid ""
+"The sslfactoryarg property must start with the prefix file:, classpath:, "
+"env:, sys:, or -----BEGIN CERTIFICATE-----."
msgstr ""
-#: org/postgresql/copy/PGCopyInputStream.java:70
-#: org/postgresql/copy/PGCopyOutputStream.java:97
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:207
#, fuzzy
-msgid "This copy stream is closed."
-msgstr "ResultSet kapalıdır."
+msgid "An error occurred reading the certificate"
+msgstr "SSL bağlantısı ayarlanırken bir hata oluştu."
-#: org/postgresql/copy/PGCopyInputStream.java:113
-msgid "Read from copy failed."
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:240
+msgid "No X509TrustManager found"
msgstr ""
-#: org/postgresql/copy/PGCopyOutputStream.java:74
-#, java-format
-msgid "Cannot write to copy a byte of value {0}"
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:133
+msgid ""
+"Could not find a java cryptographic algorithm: X.509 CertificateFactory not "
+"available."
msgstr ""
-#: org/postgresql/core/ConnectionFactory.java:74
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:143
#, java-format
-msgid "A connection could not be made using the requested protocol {0}."
-msgstr "İstenilen protokol ile bağlantı kurulamadı {0}"
+msgid "Could not open SSL certificate file {0}."
+msgstr ""
-#: org/postgresql/core/Oid.java:114
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:148
#, java-format
-msgid "oid type {0} not known and not a number"
+msgid "Loading the SSL certificate {0} into a KeyManager failed."
msgstr ""
-#: org/postgresql/core/Parser.java:616
-#, java-format
-msgid "Malformed function or procedure escape syntax at offset {0}."
-msgstr "{0} adresinde fonksiyon veya yordamda kaçış söz dizimi geçersiz."
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:205
+msgid "Enter SSL password: "
+msgstr ""
-#: org/postgresql/core/PGStream.java:497
-#, java-format
-msgid "Premature end of input stream, expected {0} bytes, but only read {1}."
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:212
+msgid "Could not read password for SSL key file, console is not available."
msgstr ""
-"Giriş akımında beklenmeyen dosya sonu, {0} bayt beklenirken sadece {1} bayt "
-"alındı."
-#: org/postgresql/core/PGStream.java:538
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:217
#, java-format
-msgid "Expected an EOF from server, got: {0}"
-msgstr "Sunucudan EOF beklendi; ama {0} alındı."
-
-#: org/postgresql/core/SetupQueryRunner.java:90
-msgid "An unexpected result was returned by a query."
-msgstr "Sorgu beklenmeyen bir sonuç döndürdü."
+msgid "Could not read password for SSL key file by callbackhandler {0}."
+msgstr ""
-#: org/postgresql/core/UTF8Encoding.java:31
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:236
#, java-format
-msgid ""
-"Illegal UTF-8 sequence: byte {0} of {1} byte sequence is not 10xxxxxx: {2}"
+msgid "Could not decrypt SSL key file {0}."
msgstr ""
-"Geçersiz UTF-8 çoklu bayt karakteri: {0}/{1} baytı 10xxxxxx değildir: {2}"
-#: org/postgresql/core/UTF8Encoding.java:69
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:250
#, java-format
-msgid "Illegal UTF-8 sequence: {0} bytes used to encode a {1} byte value: {2}"
+msgid "Could not read SSL key file {0}."
msgstr ""
-"Geçersiz UTF-8 çoklu bayt karakteri: {0} bayt, {1} bayt değeri kodlamak için "
-"kullanılmış: {2}"
-#: org/postgresql/core/UTF8Encoding.java:104
-#: org/postgresql/core/UTF8Encoding.java:131
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:253
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:176
#, java-format
-msgid "Illegal UTF-8 sequence: initial byte is {0}: {1}"
-msgstr "Geçersiz UTF-8 çoklu bayt karakteri: ilk bayt {0}: {1}"
+msgid "Could not find a java cryptographic algorithm: {0}."
+msgstr ""
-#: org/postgresql/core/UTF8Encoding.java:137
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:99
+#, fuzzy, java-format
+msgid "The password callback class provided {0} could not be instantiated."
+msgstr "SSLSocketFactory {0} ile örneklenmedi."
+
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:132
#, java-format
-msgid "Illegal UTF-8 sequence: final value is out of range: {0}"
-msgstr "Geçersiz UTF-8 çoklu bayt karakteri: son değer sıra dışıdır: {0}"
+msgid "Could not open SSL root certificate file {0}."
+msgstr ""
-#: org/postgresql/core/UTF8Encoding.java:153
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:147
#, java-format
-msgid "Illegal UTF-8 sequence: final value is a surrogate value: {0}"
-msgstr "Geçersiz UTF-8 çoklu bayt karakteri: son değer yapay bir değerdir: {0}"
+msgid "Could not read SSL root certificate file {0}."
+msgstr ""
-#: org/postgresql/core/Utils.java:119 org/postgresql/core/Utils.java:136
-msgid "Zero bytes may not occur in string parameters."
-msgstr "String parametrelerinde sıfır bayt olamaz."
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:151
+#, java-format
+msgid "Loading the SSL root certificate {0} into a TrustManager failed."
+msgstr ""
-#: org/postgresql/core/Utils.java:146 org/postgresql/core/Utils.java:217
-msgid "No IOException expected from StringBuffer or StringBuilder"
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:170
+msgid "Could not initialize SSL context."
msgstr ""
-#: org/postgresql/core/Utils.java:206
-msgid "Zero bytes may not occur in identifiers."
-msgstr "Belirteçlerde sıfır bayt olamaz."
+#: org/postgresql/ssl/MakeSSL.java:52
+#, java-format
+msgid "The SSLSocketFactory class provided {0} could not be instantiated."
+msgstr "SSLSocketFactory {0} ile örneklenmedi."
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:72
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:87
-#, fuzzy, java-format
-msgid "Invalid sslmode value: {0}"
-msgstr "Geçersiz akım uzunluğu {0}."
+#: org/postgresql/ssl/MakeSSL.java:67
+#, java-format
+msgid "SSL error: {0}"
+msgstr ""
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:87
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:111
+#: org/postgresql/ssl/MakeSSL.java:78
#, fuzzy, java-format
-msgid "Invalid targetServerType value: {0}"
-msgstr "Geçersiz akım uzunluğu {0}."
+msgid "The HostnameVerifier class provided {0} could not be instantiated."
+msgstr "SSLSocketFactory {0} ile örneklenmedi."
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:152
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:228
+#: org/postgresql/ssl/MakeSSL.java:84
#, java-format
-msgid "Could not find a server with specified targetServerType: {0}"
+msgid "The hostname {0} could not be verified by hostnameverifier {1}."
msgstr ""
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:172
-msgid ""
-"Connection refused. Check that the hostname and port are correct and that "
-"the postmaster is accepting TCP/IP connections."
+#: org/postgresql/ssl/MakeSSL.java:93
+#, java-format
+msgid "The hostname {0} could not be verified."
msgstr ""
-"Bağlantı reddedildi. Sunucu adı ve portun doğru olup olmadığını ve "
-"postmaster''in TCP/IP bağlantılarını kabul edip etmediğini kontrol ediniz."
-
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:181
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:262
-msgid "The connection attempt failed."
-msgstr "Bağlantı denemesi başarısız oldu."
-
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:192
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:273
-#, fuzzy
-msgid "The connection url is invalid."
-msgstr "Bağlantı denemesi başarısız oldu."
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:218
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:233
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:324
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:339
-msgid "The server does not support SSL."
-msgstr "Sunucu SSL desteklemiyor."
+#: org/postgresql/gss/GssAction.java:126
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2550
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2581
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2585
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2640
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2650
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2659
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:655
+msgid "Protocol error. Session setup failed."
+msgstr "Protokol hatası. Oturum kurulumu başarısız oldu."
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:249
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:355
-msgid "An error occurred while setting up the SSL connection."
-msgstr "SSL bağlantısı ayarlanırken bir hata oluştu."
+#: org/postgresql/gss/GssAction.java:137 org/postgresql/gss/MakeGSS.java:66
+#: org/postgresql/gss/MakeGSS.java:74
+msgid "GSS Authentication failed"
+msgstr ""
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:300
+#: org/postgresql/core/Parser.java:933
#, java-format
-msgid "Connection rejected: {0}."
-msgstr "Bağlantı reddedildi {0}"
+msgid "Malformed function or procedure escape syntax at offset {0}."
+msgstr "{0} adresinde fonksiyon veya yordamda kaçış söz dizimi geçersiz."
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:321
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:349
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:375
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:456
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:486
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:515
-msgid ""
-"The server requested password-based authentication, but no password was "
-"provided."
-msgstr "Sunucu şifre tabanlı yetkilendirme istedi; ancak bir şifre sağlanmadı."
+#: org/postgresql/core/SocketFactoryFactory.java:41
+#, fuzzy, java-format
+msgid "The SocketFactory class provided {0} could not be instantiated."
+msgstr "SSLSocketFactory {0} ile örneklenmedi."
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:405
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:625
-#, java-format
-msgid ""
-"The authentication type {0} is not supported. Check that you have configured "
-"the pg_hba.conf file to include the client''s IP address or subnet, and that "
-"it is using an authentication scheme supported by the driver."
+#: org/postgresql/core/Utils.java:93 org/postgresql/core/Utils.java:110
+msgid "Zero bytes may not occur in string parameters."
+msgstr "String parametrelerinde sıfır bayt olamaz."
+
+#: org/postgresql/core/Utils.java:120 org/postgresql/core/Utils.java:170
+msgid "No IOException expected from StringBuffer or StringBuilder"
msgstr ""
-"{0} yetkinlendirme tipi desteklenmemektedir. pg_hba.conf dosyanızı "
-"istemcinin IP adresini ya da subnetini içerecek şekilde ayarlayıp "
-"ayarlamadığınızı ve sürücü tarafından desteklenen yetkilendirme "
-"yöntemlerinden birisini kullanıp kullanmadığını kontrol ediniz."
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:412
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:455
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:632
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:688
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:744
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:754
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:763
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:774
-#: org/postgresql/gss/GssAction.java:130
-msgid "Protocol error. Session setup failed."
-msgstr "Protokol hatası. Oturum kurulumu başarısız oldu."
+#: org/postgresql/core/Utils.java:159
+msgid "Zero bytes may not occur in identifiers."
+msgstr "Belirteçlerde sıfır bayt olamaz."
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:443
-#, java-format
-msgid "Backend start-up failed: {0}."
-msgstr "Backend başlaması başarısız oldu: {0}"
-
-#: org/postgresql/core/v2/FastpathParameterList.java:63
-#: org/postgresql/core/v2/FastpathParameterList.java:89
-#: org/postgresql/core/v2/FastpathParameterList.java:100
-#: org/postgresql/core/v2/FastpathParameterList.java:111
-#: org/postgresql/core/v2/SimpleParameterList.java:70
-#: org/postgresql/core/v2/SimpleParameterList.java:94
-#: org/postgresql/core/v2/SimpleParameterList.java:105
-#: org/postgresql/core/v2/SimpleParameterList.java:116
-#: org/postgresql/core/v2/SimpleParameterList.java:127
-#: org/postgresql/core/v3/CompositeParameterList.java:36
-#: org/postgresql/core/v3/SimpleParameterList.java:53
-#: org/postgresql/core/v3/SimpleParameterList.java:64
-#: org/postgresql/jdbc/PgResultSet.java:2715
-#: org/postgresql/jdbc/PgResultSetMetaData.java:472
+#: org/postgresql/core/UTF8Encoding.java:28
#, java-format
-msgid "The column index is out of range: {0}, number of columns: {1}."
-msgstr "Sütun gçstergesi kapsam dışıdır: {0}, sütun sayısı: {1}."
+msgid ""
+"Illegal UTF-8 sequence: byte {0} of {1} byte sequence is not 10xxxxxx: {2}"
+msgstr ""
+"Geçersiz UTF-8 çoklu bayt karakteri: {0}/{1} baytı 10xxxxxx değildir: {2}"
-#: org/postgresql/core/v2/FastpathParameterList.java:164
-#: org/postgresql/core/v2/SimpleParameterList.java:191
-#: org/postgresql/core/v3/SimpleParameterList.java:225
+#: org/postgresql/core/UTF8Encoding.java:66
#, java-format
-msgid "No value specified for parameter {0}."
-msgstr "{0} parametresi için hiç bir değer belirtilmedi."
+msgid "Illegal UTF-8 sequence: {0} bytes used to encode a {1} byte value: {2}"
+msgstr ""
+"Geçersiz UTF-8 çoklu bayt karakteri: {0} bayt, {1} bayt değeri kodlamak için "
+"kullanılmış: {2}"
-#: org/postgresql/core/v2/QueryExecutorImpl.java:87
-#: org/postgresql/core/v2/QueryExecutorImpl.java:347
-#: org/postgresql/core/v3/QueryExecutorImpl.java:404
-#: org/postgresql/core/v3/QueryExecutorImpl.java:465
+#: org/postgresql/core/UTF8Encoding.java:102
+#: org/postgresql/core/UTF8Encoding.java:129
#, java-format
-msgid "Expected command status BEGIN, got {0}."
-msgstr "BEGIN komut durumunu beklenirken {0} alındı."
+msgid "Illegal UTF-8 sequence: initial byte is {0}: {1}"
+msgstr "Geçersiz UTF-8 çoklu bayt karakteri: ilk bayt {0}: {1}"
-#: org/postgresql/core/v2/QueryExecutorImpl.java:92
-#: org/postgresql/core/v3/QueryExecutorImpl.java:470
-#: org/postgresql/jdbc/PgResultSet.java:1731
+#: org/postgresql/core/UTF8Encoding.java:135
#, java-format
-msgid "Unexpected command status: {0}."
-msgstr "Beklenmeyen komut durumu: {0}."
-
-#: org/postgresql/core/v2/QueryExecutorImpl.java:127
-#: org/postgresql/core/v2/QueryExecutorImpl.java:136
-#: org/postgresql/core/v2/QueryExecutorImpl.java:185
-#: org/postgresql/core/v2/QueryExecutorImpl.java:376
-#: org/postgresql/core/v3/QueryExecutorImpl.java:226
-#: org/postgresql/core/v3/QueryExecutorImpl.java:364
-#: org/postgresql/core/v3/QueryExecutorImpl.java:441
-#: org/postgresql/core/v3/QueryExecutorImpl.java:505
-#: org/postgresql/core/v3/QueryExecutorImpl.java:587
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2211
-#: org/postgresql/util/StreamWrapper.java:133
-#, fuzzy
-msgid "An I/O error occurred while sending to the backend."
-msgstr "Backend''e gönderirken bir I/O hatası oluştu."
+msgid "Illegal UTF-8 sequence: final value is out of range: {0}"
+msgstr "Geçersiz UTF-8 çoklu bayt karakteri: son değer sıra dışıdır: {0}"
-#: org/postgresql/core/v2/QueryExecutorImpl.java:180
-#: org/postgresql/core/v2/QueryExecutorImpl.java:235
-#: org/postgresql/core/v2/QueryExecutorImpl.java:249
-#: org/postgresql/core/v3/QueryExecutorImpl.java:582
-#: org/postgresql/core/v3/QueryExecutorImpl.java:642
+#: org/postgresql/core/UTF8Encoding.java:151
#, java-format
-msgid "Unknown Response Type {0}."
-msgstr "Bilinmeyen yanıt tipi {0}"
+msgid "Illegal UTF-8 sequence: final value is a surrogate value: {0}"
+msgstr "Geçersiz UTF-8 çoklu bayt karakteri: son değer yapay bir değerdir: {0}"
-#: org/postgresql/core/v2/QueryExecutorImpl.java:453
-#: org/postgresql/core/v2/QueryExecutorImpl.java:503
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1962
-msgid "Ran out of memory retrieving query results."
-msgstr "Sorgu sonuçları alınırken bellek yetersiz."
+#: org/postgresql/core/SetupQueryRunner.java:64
+msgid "An unexpected result was returned by a query."
+msgstr "Sorgu beklenmeyen bir sonuç döndürdü."
-#: org/postgresql/core/v2/QueryExecutorImpl.java:640
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2328
+#: org/postgresql/core/PGStream.java:486
#, java-format
-msgid "Unable to interpret the update count in command completion tag: {0}."
-msgstr "Komut tamamlama etiketinde update sayısı yorumlanamıyor: {0}."
-
-#: org/postgresql/core/v2/QueryExecutorImpl.java:654
-msgid "Copy not implemented for protocol version 2"
+msgid "Premature end of input stream, expected {0} bytes, but only read {1}."
msgstr ""
+"Giriş akımında beklenmeyen dosya sonu, {0} bayt beklenirken sadece {1} bayt "
+"alındı."
-#: org/postgresql/core/v2/SocketFactoryFactory.java:36
-#, fuzzy, java-format
-msgid "The SocketFactory class provided {0} could not be instantiated."
-msgstr "SSLSocketFactory {0} ile örneklenmedi."
+#: org/postgresql/core/PGStream.java:528
+#, java-format
+msgid "Expected an EOF from server, got: {0}"
+msgstr "Sunucudan EOF beklendi; ama {0} alındı."
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:253
-#, fuzzy, java-format
-msgid ""
-"Connection to {0} refused. Check that the hostname and port are correct and "
-"that the postmaster is accepting TCP/IP connections."
+#: org/postgresql/core/v3/CopyOperationImpl.java:54
+msgid "CommandComplete expected COPY but got: "
msgstr ""
-"Bağlantı reddedildi. Sunucu adı ve portun doğru olup olmadığını ve "
-"postmaster''in TCP/IP bağlantılarını kabul edip etmediğini kontrol ediniz."
-#: org/postgresql/core/v3/CopyOperationImpl.java:57
-msgid "CommandComplete expected COPY but got: "
+#: org/postgresql/core/v3/CopyInImpl.java:47
+msgid "CopyIn copy direction can't receive data"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:83
+#: org/postgresql/core/v3/QueryExecutorImpl.java:161
msgid "Tried to obtain lock while already holding it"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:98
+#: org/postgresql/core/v3/QueryExecutorImpl.java:177
msgid "Tried to break lock on database connection"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:115
+#: org/postgresql/core/v3/QueryExecutorImpl.java:195
#, fuzzy
msgid "Interrupted while waiting to obtain lock on database connection"
msgstr "Bağlanırken kesildi."
-#: org/postgresql/core/v3/QueryExecutorImpl.java:220
+#: org/postgresql/core/v3/QueryExecutorImpl.java:327
msgid "Unable to bind parameter values for statement."
msgstr "Komut için parametre değerlei bağlanamadı."
-#: org/postgresql/core/v3/QueryExecutorImpl.java:689
+#: org/postgresql/core/v3/QueryExecutorImpl.java:333
+#: org/postgresql/core/v3/QueryExecutorImpl.java:485
+#: org/postgresql/core/v3/QueryExecutorImpl.java:559
+#: org/postgresql/core/v3/QueryExecutorImpl.java:602
+#: org/postgresql/core/v3/QueryExecutorImpl.java:729
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2372
+#: org/postgresql/util/StreamWrapper.java:130
+#, fuzzy
+msgid "An I/O error occurred while sending to the backend."
+msgstr "Backend''e gönderirken bir I/O hatası oluştu."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:534
+#: org/postgresql/core/v3/QueryExecutorImpl.java:576
+#, java-format
+msgid "Expected command status BEGIN, got {0}."
+msgstr "BEGIN komut durumunu beklenirken {0} alındı."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:581
+#: org/postgresql/jdbc/PgResultSet.java:1778
+#, java-format
+msgid "Unexpected command status: {0}."
+msgstr "Beklenmeyen komut durumu: {0}."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:687
+#, fuzzy
+msgid "An error occurred while trying to get the socket timeout."
+msgstr "Backend''e gönderirken bir I/O hatası oluştu."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:722
+#: org/postgresql/core/v3/QueryExecutorImpl.java:798
+#, java-format
+msgid "Unknown Response Type {0}."
+msgstr "Bilinmeyen yanıt tipi {0}"
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:745
+#, fuzzy
+msgid "An error occurred while trying to reset the socket timeout."
+msgstr "Backend''e gönderirken bir I/O hatası oluştu."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:843
msgid "Database connection failed when starting copy"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:724
+#: org/postgresql/core/v3/QueryExecutorImpl.java:878
msgid "Tried to cancel an inactive copy operation"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:765
+#: org/postgresql/core/v3/QueryExecutorImpl.java:917
msgid "Database connection failed when canceling copy operation"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:781
+#: org/postgresql/core/v3/QueryExecutorImpl.java:933
msgid "Missing expected error response to copy cancel request"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:785
+#: org/postgresql/core/v3/QueryExecutorImpl.java:937
#, java-format
msgid "Got {0} error responses to single copy cancel request"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:800
+#: org/postgresql/core/v3/QueryExecutorImpl.java:952
msgid "Tried to end inactive copy"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:815
+#: org/postgresql/core/v3/QueryExecutorImpl.java:967
msgid "Database connection failed when ending copy"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:833
-#: org/postgresql/core/v3/QueryExecutorImpl.java:855
+#: org/postgresql/core/v3/QueryExecutorImpl.java:985
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1005
msgid "Tried to write to an inactive copy operation"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:848
-#: org/postgresql/core/v3/QueryExecutorImpl.java:863
+#: org/postgresql/core/v3/QueryExecutorImpl.java:998
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1013
msgid "Database connection failed when writing to copy"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:877
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1028
msgid "Tried to read from inactive copy"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:884
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1035
msgid "Database connection failed when reading from copy"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:956
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1101
#, java-format
msgid "Received CommandComplete ''{0}'' without an active copy operation"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:983
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1126
#, java-format
msgid "Got CopyInResponse from server during an active {0}"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:999
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1140
#, java-format
msgid "Got CopyOutResponse from server during an active {0}"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1017
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1154
+#, java-format
+msgid "Got CopyBothResponse from server during an active {0}"
+msgstr ""
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1170
msgid "Got CopyData without an active copy operation"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1021
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1174
#, fuzzy, java-format
msgid "Unexpected copydata from server for {0}"
msgstr "Sunucudan EOF beklendi; ama {0} alındı."
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1061
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2037
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1234
+#, java-format
+msgid "Unexpected packet type during copy: {0}"
+msgstr ""
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1524
+#, java-format
+msgid ""
+"Bind message length {0} too long. This can be caused by very large or "
+"incorrect length specifications on InputStream parameters."
+msgstr ""
+"Bind mesaj uzunluğu ({0}) fazla uzun. Bu durum InputStream yalnış uzunluk "
+"belirtimlerden kaynaklanabilir."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2145
+msgid "Ran out of memory retrieving query results."
+msgstr "Sorgu sonuçları alınırken bellek yetersiz."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2313
+msgid "The driver currently does not support COPY operations."
+msgstr "Bu sunucu şu aşamada COPY işlemleri desteklememktedir."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2487
+#, fuzzy, java-format
+msgid "Unable to parse the count in command completion tag: {0}."
+msgstr "Komut tamamlama etiketinde update sayısı yorumlanamıyor: {0}."
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2603
#, fuzzy, java-format
msgid ""
"The server''s client_encoding parameter was changed to {0}. The JDBC driver "
@@ -414,8 +405,7 @@ msgstr ""
"sürücüsünün doğru çalışması için client_encoding parameteresinin UNICODE "
"olması gerekir."
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1069
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2045
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2611
#, java-format
msgid ""
"The server''s DateStyle parameter was changed to {0}. The JDBC driver "
@@ -424,8 +414,7 @@ msgstr ""
"Sunucunun DateStyle parametresi {0} olarak değiştirildi. JDBC sürücüsü doğru "
"işlemesi için DateStyle tanımının ISO işle başlamasını gerekir."
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1083
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2059
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2624
#, java-format
msgid ""
"The server''s standard_conforming_strings parameter was reported as {0}. The "
@@ -434,65 +423,194 @@ msgstr ""
"İstemcinin client_standard_conforming_strings parametresi {0} olarak "
"raporlandı. JDBC sürücüsü on ya da off olarak bekliyordu."
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1122
+#: org/postgresql/core/v3/SimpleParameterList.java:54
+#: org/postgresql/core/v3/SimpleParameterList.java:65
+#: org/postgresql/core/v3/CompositeParameterList.java:33
+#: org/postgresql/jdbc/PgResultSetMetaData.java:493
+#: org/postgresql/jdbc/PgResultSet.java:2751
#, java-format
-msgid "Unexpected packet type during copy: {0}"
-msgstr ""
+msgid "The column index is out of range: {0}, number of columns: {1}."
+msgstr "Sütun gçstergesi kapsam dışıdır: {0}, sütun sayısı: {1}."
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1393
+#: org/postgresql/core/v3/SimpleParameterList.java:257
#, java-format
-msgid ""
-"Bind message length {0} too long. This can be caused by very large or "
-"incorrect length specifications on InputStream parameters."
-msgstr ""
-"Bind mesaj uzunluğu ({0}) fazla uzun. Bu durum InputStream yalnış uzunluk "
-"belirtimlerden kaynaklanabilir."
+msgid "No value specified for parameter {0}."
+msgstr "{0} parametresi için hiç bir değer belirtilmedi."
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2131
-msgid "The driver currently does not support COPY operations."
-msgstr "Bu sunucu şu aşamada COPY işlemleri desteklememktedir."
+#: org/postgresql/core/v3/SimpleParameterList.java:431
+#, fuzzy, java-format
+msgid "Added parameters index out of range: {0}, number of columns: {1}."
+msgstr "Dizin göstergisi kapsam dışıdır: {0}, öğe sayısı: {1}."
-#: org/postgresql/Driver.java:234
-msgid "Error loading default settings from driverconfig.properties"
-msgstr "driverconfig.properties dosyasından varsayılan ayarları yükleme hatası"
+#: org/postgresql/core/v3/replication/V3ReplicationProtocol.java:133
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:257
+msgid "The connection attempt failed."
+msgstr "Bağlantı denemesi başarısız oldu."
-#: org/postgresql/Driver.java:247
-msgid "Properties for the driver contains a non-string value for the key "
+#: org/postgresql/core/v3/replication/V3PGReplicationStream.java:144
+#, java-format
+msgid "Unexpected packet type during replication: {0}"
msgstr ""
-#: org/postgresql/Driver.java:290
+#: org/postgresql/core/v3/replication/V3PGReplicationStream.java:269
+#, fuzzy
+msgid "This replication stream has been closed."
+msgstr "Bağlantı kapatıldı."
+
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:109
+#, fuzzy, java-format
+msgid "Invalid sslmode value: {0}"
+msgstr "Geçersiz akım uzunluğu {0}."
+
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:124
+#, fuzzy, java-format
+msgid "Invalid targetServerType value: {0}"
+msgstr "Geçersiz akım uzunluğu {0}."
+
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:246
+#, fuzzy, java-format
msgid ""
-"Your security policy has prevented the connection from being attempted. You "
-"probably need to grant the connect java.net.SocketPermission to the database "
-"server host and port that you wish to connect to."
+"Connection to {0} refused. Check that the hostname and port are correct and "
+"that the postmaster is accepting TCP/IP connections."
msgstr ""
-"Güvenlik politikanız bağlantının kurulmasını engelledi. java.net."
-"SocketPermission'a veritabanına ve de bağlanacağı porta bağlantı izni "
-"vermelisiniz."
+"Bağlantı reddedildi. Sunucu adı ve portun doğru olup olmadığını ve "
+"postmaster''in TCP/IP bağlantılarını kabul edip etmediğini kontrol ediniz."
-#: org/postgresql/Driver.java:296 org/postgresql/Driver.java:362
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:272
+#, java-format
+msgid "Could not find a server with specified targetServerType: {0}"
+msgstr ""
+
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:366
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:379
+msgid "The server does not support SSL."
+msgstr "Sunucu SSL desteklemiyor."
+
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:393
+msgid "An error occurred while setting up the SSL connection."
+msgstr "SSL bağlantısı ayarlanırken bir hata oluştu."
+
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:494
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:521
msgid ""
-"Something unusual has occurred to cause the driver to fail. Please report "
-"this exception."
+"The server requested password-based authentication, but no password was "
+"provided."
+msgstr "Sunucu şifre tabanlı yetkilendirme istedi; ancak bir şifre sağlanmadı."
+
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:624
+msgid ""
+"SCRAM authentication is not supported by this driver. You need JDK >= 8 and "
+"pgjdbc >= 42.2.0 (not \".jre\" vesions)"
msgstr ""
-"Sıradışı bir durum sürücünün hata vermesine sebep oldu. Lütfen bu durumu "
-"geliştiricilere bildirin."
-#: org/postgresql/Driver.java:370
-msgid "Connection attempt timed out."
-msgstr "Bağlantı denemesi zaman aşımına uğradı."
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:648
+#, java-format
+msgid ""
+"The authentication type {0} is not supported. Check that you have configured "
+"the pg_hba.conf file to include the client''s IP address or subnet, and that "
+"it is using an authentication scheme supported by the driver."
+msgstr ""
+"{0} yetkinlendirme tipi desteklenmemektedir. pg_hba.conf dosyanızı "
+"istemcinin IP adresini ya da subnetini içerecek şekilde ayarlayıp "
+"ayarlamadığınızı ve sürücü tarafından desteklenen yetkilendirme "
+"yöntemlerinden birisini kullanıp kullanmadığını kontrol ediniz."
-#: org/postgresql/Driver.java:383
-msgid "Interrupted while attempting to connect."
-msgstr "Bağlanırken kesildi."
+#: org/postgresql/core/ConnectionFactory.java:57
+#, java-format
+msgid "A connection could not be made using the requested protocol {0}."
+msgstr "İstenilen protokol ile bağlantı kurulamadı {0}"
-#: org/postgresql/Driver.java:645
+#: org/postgresql/core/Oid.java:116
#, java-format
-msgid "Method {0} is not yet implemented."
-msgstr "{0} yöntemi henüz kodlanmadı."
+msgid "oid type {0} not known and not a number"
+msgstr ""
+
+#: org/postgresql/util/HStoreConverter.java:43
+#: org/postgresql/util/HStoreConverter.java:74
+#: org/postgresql/jdbc/PgArray.java:210
+#: org/postgresql/jdbc/PgResultSet.java:1924
+msgid ""
+"Invalid character data was found. This is most likely caused by stored data "
+"containing characters that are invalid for the character set the database "
+"was created in. The most common example of this is storing 8bit data in a "
+"SQL_ASCII database."
+msgstr ""
+"Geçersiz karakterler bulunmuştur. Bunun sebebi, verilerde veritabanın "
+"desteklediği dil kodlamadaki karakterlerin dışında bir karaktere "
+"rastlamasıdır. Bunun en yaygın örneği 8 bitlik veriyi SQL_ASCII "
+"veritabanında saklamasıdır."
+
+#: org/postgresql/util/PGmoney.java:62
+msgid "Conversion of money failed."
+msgstr "Money dönüştürmesi başarısız."
+
+#: org/postgresql/util/StreamWrapper.java:56
+#: org/postgresql/jdbc/PgPreparedStatement.java:1449
+msgid "Object is too large to send over the protocol."
+msgstr ""
+
+#: org/postgresql/util/PGInterval.java:152
+msgid "Conversion of interval failed"
+msgstr "Interval dönüştürmesi başarısız."
+
+#: org/postgresql/util/ServerErrorMessage.java:45
+#, java-format
+msgid ""
+" (pgjdbc: autodetected server-encoding to be {0}, if the message is not "
+"readable, please check database logs and/or host, port, dbname, user, "
+"password, pg_hba.conf)"
+msgstr ""
+
+#: org/postgresql/util/ServerErrorMessage.java:176
+#, java-format
+msgid "Detail: {0}"
+msgstr "Ayrıntı: {0}"
+
+#: org/postgresql/util/ServerErrorMessage.java:181
+#, java-format
+msgid "Hint: {0}"
+msgstr "İpucu: {0}"
+
+#: org/postgresql/util/ServerErrorMessage.java:185
+#, java-format
+msgid "Position: {0}"
+msgstr "Position: {0}"
+
+#: org/postgresql/util/ServerErrorMessage.java:189
+#, java-format
+msgid "Where: {0}"
+msgstr "Where: {0}"
+
+#: org/postgresql/util/ServerErrorMessage.java:195
+#, java-format
+msgid "Internal Query: {0}"
+msgstr "Internal Query: {0}"
+
+#: org/postgresql/util/ServerErrorMessage.java:199
+#, java-format
+msgid "Internal Position: {0}"
+msgstr "Internal Position: {0}"
+
+#: org/postgresql/util/ServerErrorMessage.java:206
+#, java-format
+msgid "Location: File: {0}, Routine: {1}, Line: {2}"
+msgstr "Yer: Dosya: {0}, Yordam: {1}, Satır: {2}"
+
+#: org/postgresql/util/ServerErrorMessage.java:211
+#, java-format
+msgid "Server SQLState: {0}"
+msgstr "Sunucu SQLState: {0}"
+
+#: org/postgresql/ds/PGPoolingDataSource.java:269
+msgid "Failed to setup DataSource."
+msgstr ""
+
+#: org/postgresql/ds/PGPoolingDataSource.java:371
+msgid "DataSource has been closed."
+msgstr "DataSource kapatıldı."
-#: org/postgresql/ds/common/BaseDataSource.java:1037
-#: org/postgresql/ds/common/BaseDataSource.java:1047
+#: org/postgresql/ds/common/BaseDataSource.java:1132
+#: org/postgresql/ds/common/BaseDataSource.java:1142
#, fuzzy, java-format
msgid "Unsupported property name: {0}"
msgstr "Geçersiz Types değeri: {0}"
@@ -501,7 +619,7 @@ msgstr "Geçersiz Types değeri: {0}"
msgid "This PooledConnection has already been closed."
msgstr "Geçerli PooledConnection zaten önceden kapatıldı."
-#: org/postgresql/ds/PGPooledConnection.java:313
+#: org/postgresql/ds/PGPooledConnection.java:314
msgid ""
"Connection has been closed automatically because a new connection was opened "
"for the same PooledConnection or the PooledConnection has been closed."
@@ -509,507 +627,654 @@ msgstr ""
"PooledConnection kapatıldığı için veya aynı PooledConnection için yeni bir "
"bağlantı açıldığı için geçerli bağlantı otomatik kapatıldı."
-#: org/postgresql/ds/PGPooledConnection.java:314
+#: org/postgresql/ds/PGPooledConnection.java:315
msgid "Connection has been closed."
msgstr "Bağlantı kapatıldı."
-#: org/postgresql/ds/PGPooledConnection.java:418
+#: org/postgresql/ds/PGPooledConnection.java:420
msgid "Statement has been closed."
msgstr "Komut kapatıldı."
-#: org/postgresql/ds/PGPoolingDataSource.java:269
-msgid "Failed to setup DataSource."
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:68
+msgid "No SCRAM mechanism(s) advertised by the server"
msgstr ""
-#: org/postgresql/ds/PGPoolingDataSource.java:371
-msgid "DataSource has been closed."
-msgstr "DataSource kapatıldı."
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:81
+msgid "Invalid or unsupported by client SCRAM mechanisms"
+msgstr ""
-#: org/postgresql/fastpath/Fastpath.java:82
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:117
#, fuzzy, java-format
-msgid "Fastpath call {0} - No result was returned and we expected a numeric."
-msgstr "Fastpath call {0} - Integer beklenirken hiçbir sonuç getirilmedi."
+msgid "Invalid server-first-message: {0}"
+msgstr "Geçersiz akım uzunluğu {0}."
-#: org/postgresql/fastpath/Fastpath.java:165
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:147
+#, fuzzy, java-format
+msgid "Invalid server-final-message: {0}"
+msgstr "Geçersiz akım uzunluğu {0}."
+
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:153
#, java-format
-msgid "Fastpath call {0} - No result was returned and we expected an integer."
-msgstr "Fastpath call {0} - Integer beklenirken hiçbir sonuç getirilmedi."
+msgid "SCRAM authentication failed, server returned error: {0}"
+msgstr ""
-#: org/postgresql/fastpath/Fastpath.java:174
-#, fuzzy, java-format
-msgid ""
-"Fastpath call {0} - No result was returned or wrong size while expecting an "
-"integer."
-msgstr "Fastpath call {0} - Integer beklenirken hiçbir sonuç getirilmedi."
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:160
+msgid "Invalid server SCRAM signature"
+msgstr ""
-#: org/postgresql/fastpath/Fastpath.java:191
+#: org/postgresql/osgi/PGDataSourceFactory.java:82
#, fuzzy, java-format
-msgid "Fastpath call {0} - No result was returned and we expected a long."
-msgstr "Fastpath call {0} - Integer beklenirken hiçbir sonuç getirilmedi."
+msgid "Unsupported properties: {0}"
+msgstr "Geçersiz Types değeri: {0}"
-#: org/postgresql/fastpath/Fastpath.java:200
-#, fuzzy, java-format
+#: org/postgresql/Driver.java:214
+msgid "Error loading default settings from driverconfig.properties"
+msgstr "driverconfig.properties dosyasından varsayılan ayarları yükleme hatası"
+
+#: org/postgresql/Driver.java:226
+msgid "Properties for the driver contains a non-string value for the key "
+msgstr ""
+
+#: org/postgresql/Driver.java:270
msgid ""
-"Fastpath call {0} - No result was returned or wrong size while expecting a "
-"long."
-msgstr "Fastpath call {0} - Integer beklenirken hiçbir sonuç getirilmedi."
+"Your security policy has prevented the connection from being attempted. You "
+"probably need to grant the connect java.net.SocketPermission to the database "
+"server host and port that you wish to connect to."
+msgstr ""
+"Güvenlik politikanız bağlantının kurulmasını engelledi. java.net."
+"SocketPermission'a veritabanına ve de bağlanacağı porta bağlantı izni "
+"vermelisiniz."
-#: org/postgresql/fastpath/Fastpath.java:312
+#: org/postgresql/Driver.java:276 org/postgresql/Driver.java:408
+msgid ""
+"Something unusual has occurred to cause the driver to fail. Please report "
+"this exception."
+msgstr ""
+"Sıradışı bir durum sürücünün hata vermesine sebep oldu. Lütfen bu durumu "
+"geliştiricilere bildirin."
+
+#: org/postgresql/Driver.java:416
+msgid "Connection attempt timed out."
+msgstr "Bağlantı denemesi zaman aşımına uğradı."
+
+#: org/postgresql/Driver.java:429
+msgid "Interrupted while attempting to connect."
+msgstr "Bağlanırken kesildi."
+
+#: org/postgresql/Driver.java:682
#, java-format
-msgid "The fastpath function {0} is unknown."
-msgstr "{0} fastpath fonksiyonu bilinmemektedir."
+msgid "Method {0} is not yet implemented."
+msgstr "{0} yöntemi henüz kodlanmadı."
-#: org/postgresql/geometric/PGbox.java:79
-#: org/postgresql/geometric/PGcircle.java:76
-#: org/postgresql/geometric/PGcircle.java:84
-#: org/postgresql/geometric/PGline.java:109
-#: org/postgresql/geometric/PGline.java:118
-#: org/postgresql/geometric/PGlseg.java:72
-#: org/postgresql/geometric/PGpoint.java:78
+#: org/postgresql/geometric/PGlseg.java:70
+#: org/postgresql/geometric/PGline.java:107
+#: org/postgresql/geometric/PGline.java:116
+#: org/postgresql/geometric/PGcircle.java:74
+#: org/postgresql/geometric/PGcircle.java:82
+#: org/postgresql/geometric/PGpoint.java:76
+#: org/postgresql/geometric/PGbox.java:77
#, java-format
msgid "Conversion to type {0} failed: {1}."
msgstr "{0} veri tipine dönüştürme hatası: {1}."
-#: org/postgresql/geometric/PGpath.java:73
+#: org/postgresql/geometric/PGpath.java:70
#, java-format
msgid "Cannot tell if path is open or closed: {0}."
msgstr "Pathın açık mı kapalı olduğunu tespit edilemiyor: {0}."
-#: org/postgresql/gss/GssAction.java:141 org/postgresql/gss/MakeGSS.java:69
-#: org/postgresql/gss/MakeGSS.java:77
-msgid "GSS Authentication failed"
+#: org/postgresql/xa/PGXAConnection.java:128
+msgid ""
+"Transaction control methods setAutoCommit(true), commit, rollback and "
+"setSavePoint not allowed while an XA transaction is active."
+msgstr ""
+
+#: org/postgresql/xa/PGXAConnection.java:177
+#: org/postgresql/xa/PGXAConnection.java:253
+#: org/postgresql/xa/PGXAConnection.java:347
+#, java-format
+msgid "Invalid flags {0}"
+msgstr "Geçersiz seçenekler {0}"
+
+#: org/postgresql/xa/PGXAConnection.java:181
+#: org/postgresql/xa/PGXAConnection.java:257
+#: org/postgresql/xa/PGXAConnection.java:449
+msgid "xid must not be null"
+msgstr "xid null olamaz"
+
+#: org/postgresql/xa/PGXAConnection.java:185
+msgid "Connection is busy with another transaction"
+msgstr "Bağlantı, başka bir transaction tarafından meşgul ediliyor"
+
+#: org/postgresql/xa/PGXAConnection.java:194
+#: org/postgresql/xa/PGXAConnection.java:267
+msgid "suspend/resume not implemented"
+msgstr "suspend/resume desteklenmiyor"
+
+#: org/postgresql/xa/PGXAConnection.java:202
+#: org/postgresql/xa/PGXAConnection.java:209
+#: org/postgresql/xa/PGXAConnection.java:213
+#, java-format
+msgid ""
+"Invalid protocol state requested. Attempted transaction interleaving is not "
+"supported. xid={0}, currentXid={1}, state={2}, flags={3}"
msgstr ""
+"Transaction interleaving desteklenmiyor. xid={0}, currentXid={1}, state={2}, "
+"flags={3}"
-#: org/postgresql/jdbc/AbstractBlobClob.java:89
+#: org/postgresql/xa/PGXAConnection.java:224
+msgid "Error disabling autocommit"
+msgstr "autocommit'i devre dışı bırakma sırasında hata"
+
+#: org/postgresql/xa/PGXAConnection.java:261
+#, java-format
msgid ""
-"Truncation of large objects is only implemented in 8.3 and later servers."
-msgstr "Large objectlerin temizlenmesi 8.3 ve sonraki sürümlerde kodlanmıştır."
+"tried to call end without corresponding start call. state={0}, start "
+"xid={1}, currentXid={2}, preparedXid={3}"
+msgstr ""
+"start çağırımı olmadan end çağırılmıştır. state={0}, start xid={1}, "
+"currentXid={2}, preparedXid={3}"
-#: org/postgresql/jdbc/AbstractBlobClob.java:94
-msgid "Cannot truncate LOB to a negative length."
+#: org/postgresql/xa/PGXAConnection.java:297
+#, fuzzy, java-format
+msgid ""
+"Preparing already prepared transaction, the prepared xid {0}, prepare xid={1}"
msgstr ""
+"Hazırlanmış transaction rollback hatası. rollback xid={0}, preparedXid={1}, "
+"currentXid={2}"
-#: org/postgresql/jdbc/AbstractBlobClob.java:101
-#: org/postgresql/jdbc/AbstractBlobClob.java:245
+#: org/postgresql/xa/PGXAConnection.java:300
#, java-format
-msgid "PostgreSQL LOBs can only index to: {0}"
-msgstr "PostgreSQL LOB göstergeleri sadece {0} referans edebilir"
+msgid "Current connection does not have an associated xid. prepare xid={0}"
+msgstr ""
-#: org/postgresql/jdbc/AbstractBlobClob.java:241
-msgid "LOB positioning offsets start at 1."
-msgstr "LOB bağlangıç adresi 1Den başlıyor"
+#: org/postgresql/xa/PGXAConnection.java:307
+#, java-format
+msgid ""
+"Not implemented: Prepare must be issued using the same connection that "
+"started the transaction. currentXid={0}, prepare xid={1}"
+msgstr ""
+"Desteklenmiyor: Prepare, transaction başlatran bağlantı tarafından "
+"çağırmalıdır. currentXid={0}, prepare xid={1}"
-#: org/postgresql/jdbc/AbstractBlobClob.java:257
-msgid "free() was called on this LOB previously"
-msgstr "Bu LOB'da free() daha önce çağırıldı"
+#: org/postgresql/xa/PGXAConnection.java:311
+#, java-format
+msgid "Prepare called before end. prepare xid={0}, state={1}"
+msgstr "Sondan önce prepare çağırılmış. prepare xid={0}, state={1}"
-#: org/postgresql/jdbc/BatchResultHandler.java:41
-#: org/postgresql/jdbc/PgConnection.java:474
-#: org/postgresql/jdbc/PgPreparedStatement.java:138
-#: org/postgresql/jdbc/PgStatement.java:299
-msgid "A result was returned when none was expected."
-msgstr "Hiçbir sonuç kebklenimezken sonuç getirildi."
+#: org/postgresql/xa/PGXAConnection.java:331
+#, java-format
+msgid "Error preparing transaction. prepare xid={0}"
+msgstr "Transaction hazırlama hatası. prepare xid={0}"
-#: org/postgresql/jdbc/BatchResultHandler.java:59
-msgid "Too many update results were returned."
-msgstr "Çok fazla güncelleme sonucu döndürüldü."
+#: org/postgresql/xa/PGXAConnection.java:382
+msgid "Error during recover"
+msgstr "Kurtarma sırasında hata"
-#: org/postgresql/jdbc/BatchResultHandler.java:88
+#: org/postgresql/xa/PGXAConnection.java:438
#, java-format
msgid ""
-"Batch entry {0} {1} was aborted. Call getNextException to see the cause."
+"Error rolling back prepared transaction. rollback xid={0}, preparedXid={1}, "
+"currentXid={2}"
msgstr ""
-"Tpilı iş girişi {0} {1} durduruldu. Nedenini görmek için getNextException "
-"fonksiyonu çağırın."
+"Hazırlanmış transaction rollback hatası. rollback xid={0}, preparedXid={1}, "
+"currentXid={2}"
-#: org/postgresql/jdbc/EscapedFunctions.java:243
+#: org/postgresql/xa/PGXAConnection.java:471
#, java-format
-msgid "{0} function takes four and only four argument."
-msgstr "{0} fonksiyonunu yalnız dört parametre alabilir."
+msgid ""
+"One-phase commit called for xid {0} but connection was prepared with xid {1}"
+msgstr ""
-#: org/postgresql/jdbc/EscapedFunctions.java:273
-#: org/postgresql/jdbc/EscapedFunctions.java:347
-#: org/postgresql/jdbc/EscapedFunctions.java:752
-#: org/postgresql/jdbc/EscapedFunctions.java:790
+#: org/postgresql/xa/PGXAConnection.java:479
+msgid ""
+"Not implemented: one-phase commit must be issued using the same connection "
+"that was used to start it"
+msgstr ""
+"Desteklenmiyor: one-phase commit, işlevinde başlatan ve bitiren bağlantı "
+"aynı olmalıdır"
+
+#: org/postgresql/xa/PGXAConnection.java:483
#, java-format
-msgid "{0} function takes two and only two arguments."
-msgstr "{0} fonksiyonunu sadece iki parametre alabilir."
+msgid "One-phase commit with unknown xid. commit xid={0}, currentXid={1}"
+msgstr ""
-#: org/postgresql/jdbc/EscapedFunctions.java:291
-#: org/postgresql/jdbc/EscapedFunctions.java:329
-#: org/postgresql/jdbc/EscapedFunctions.java:449
-#: org/postgresql/jdbc/EscapedFunctions.java:464
-#: org/postgresql/jdbc/EscapedFunctions.java:479
-#: org/postgresql/jdbc/EscapedFunctions.java:494
-#: org/postgresql/jdbc/EscapedFunctions.java:509
-#: org/postgresql/jdbc/EscapedFunctions.java:524
-#: org/postgresql/jdbc/EscapedFunctions.java:539
-#: org/postgresql/jdbc/EscapedFunctions.java:554
-#: org/postgresql/jdbc/EscapedFunctions.java:569
-#: org/postgresql/jdbc/EscapedFunctions.java:584
-#: org/postgresql/jdbc/EscapedFunctions.java:599
-#: org/postgresql/jdbc/EscapedFunctions.java:614
-#: org/postgresql/jdbc/EscapedFunctions.java:778
+#: org/postgresql/xa/PGXAConnection.java:487
#, java-format
-msgid "{0} function takes one and only one argument."
-msgstr "{0} fonksiyonunu yalnız tek bir parametre alabilir."
+msgid "commit called before end. commit xid={0}, state={1}"
+msgstr "commit, sondan önce çağırıldı. commit xid={0}, state={1}"
+
+#: org/postgresql/xa/PGXAConnection.java:498
+#, java-format
+msgid "Error during one-phase commit. commit xid={0}"
+msgstr "One-phase commit sırasında hata. commit xid={0}"
+
+#: org/postgresql/xa/PGXAConnection.java:517
+msgid ""
+"Not implemented: 2nd phase commit must be issued using an idle connection. "
+"commit xid={0}, currentXid={1}, state={2], transactionState={3}"
+msgstr ""
+"Desteklenmiyor: 2nd phase commit, atıl bir bağlantıdan başlatılmalıdır. "
+"commit xid={0}, currentXid={1}, state={2], transactionState={3}"
+
+#: org/postgresql/xa/PGXAConnection.java:550
+#, fuzzy, java-format
+msgid ""
+"Error committing prepared transaction. commit xid={0}, preparedXid={1}, "
+"currentXid={2}"
+msgstr ""
+"Hazırlanmış transaction rollback hatası. commit xid={0}, preparedXid={1}, "
+"currentXid={2}"
-#: org/postgresql/jdbc/EscapedFunctions.java:313
-#: org/postgresql/jdbc/EscapedFunctions.java:394
+#: org/postgresql/xa/PGXAConnection.java:567
#, java-format
-msgid "{0} function takes two or three arguments."
-msgstr "{0} fonksiyonu yalnız iki veya üç argüman alabilir."
+msgid "Heuristic commit/rollback not supported. forget xid={0}"
+msgstr "Heuristic commit/rollback desteklenmiyor. forget xid={0}"
-#: org/postgresql/jdbc/EscapedFunctions.java:419
-#: org/postgresql/jdbc/EscapedFunctions.java:434
-#: org/postgresql/jdbc/EscapedFunctions.java:737
-#: org/postgresql/jdbc/EscapedFunctions.java:767
-#, java-format
-msgid "{0} function doesn''t take any argument."
-msgstr "{0} fonksiyonu parametre almaz."
+#: org/postgresql/jdbc/PgSQLXML.java:147
+msgid "Unable to decode xml data."
+msgstr "XML verisinin kodu çözülemedi."
-#: org/postgresql/jdbc/EscapedFunctions.java:630
-#: org/postgresql/jdbc/EscapedFunctions.java:683
+#: org/postgresql/jdbc/PgSQLXML.java:150
#, java-format
-msgid "{0} function takes three and only three arguments."
-msgstr "{0} fonksiyonunu sadece üç parametre alabilir."
+msgid "Unknown XML Source class: {0}"
+msgstr "Bilinmeyen XML Kaynak Sınıfı: {0}"
-#: org/postgresql/jdbc/EscapedFunctions.java:643
-#: org/postgresql/jdbc/EscapedFunctions.java:664
-#: org/postgresql/jdbc/EscapedFunctions.java:667
-#: org/postgresql/jdbc/EscapedFunctions.java:700
-#: org/postgresql/jdbc/EscapedFunctions.java:713
-#: org/postgresql/jdbc/EscapedFunctions.java:716
-#, java-format
-msgid "Interval {0} not yet implemented"
-msgstr "{0} aralığı henüz kodlanmadı."
+#: org/postgresql/jdbc/PgSQLXML.java:193
+msgid "Unable to create SAXResult for SQLXML."
+msgstr "SQLXML için SAXResult yaratılamadı."
-#: org/postgresql/jdbc/PgArray.java:166 org/postgresql/jdbc/PgArray.java:822
-#, java-format
-msgid "The array index is out of range: {0}"
-msgstr "Dizi göstergesi kapsam dışıdır: {0}"
+#: org/postgresql/jdbc/PgSQLXML.java:208
+msgid "Unable to create StAXResult for SQLXML"
+msgstr "SQLXML için StAXResult yaratılamadı"
-#: org/postgresql/jdbc/PgArray.java:183 org/postgresql/jdbc/PgArray.java:839
+#: org/postgresql/jdbc/PgSQLXML.java:213
#, java-format
-msgid "The array index is out of range: {0}, number of elements: {1}."
-msgstr "Dizin göstergisi kapsam dışıdır: {0}, öğe sayısı: {1}."
+msgid "Unknown XML Result class: {0}"
+msgstr "Bilinmeyen XML Sonuç sınıfı: {0}."
-#: org/postgresql/jdbc/PgArray.java:215
-#: org/postgresql/jdbc/PgResultSet.java:1885
-#: org/postgresql/util/HStoreConverter.java:38
-#: org/postgresql/util/HStoreConverter.java:69
+#: org/postgresql/jdbc/PgSQLXML.java:225
+msgid "This SQLXML object has already been freed."
+msgstr "Bu SQLXML nesnesi zaten boşaltılmış."
+
+#: org/postgresql/jdbc/PgSQLXML.java:234
msgid ""
-"Invalid character data was found. This is most likely caused by stored data "
-"containing characters that are invalid for the character set the database "
-"was created in. The most common example of this is storing 8bit data in a "
-"SQL_ASCII database."
-msgstr ""
-"Geçersiz karakterler bulunmuştur. Bunun sebebi, verilerde veritabanın "
-"desteklediği dil kodlamadaki karakterlerin dışında bir karaktere "
-"rastlamasıdır. Bunun en yaygın örneği 8 bitlik veriyi SQL_ASCII "
-"veritabanında saklamasıdır."
+"This SQLXML object has not been initialized, so you cannot retrieve data "
+"from it."
+msgstr "Bu SQLXML nesnesi ilklendirilmemiş; o yüzden ondan veri alamazsınız."
-#: org/postgresql/jdbc/PgCallableStatement.java:90
-#: org/postgresql/jdbc/PgCallableStatement.java:96
-msgid "A CallableStatement was executed with nothing returned."
-msgstr "CallableStatement çalıştırma sonucunda veri getirilmedi."
+#: org/postgresql/jdbc/PgSQLXML.java:247
+#, java-format
+msgid "Failed to convert binary xml data to encoding: {0}."
+msgstr "xml verisinin şu dil kodlamasına çevirilmesi başarısız oldu: {0}"
-#: org/postgresql/jdbc/PgCallableStatement.java:107
-msgid "A CallableStatement was executed with an invalid number of parameters"
-msgstr "CallableStatement geçersiz sayıda parametre ile çalıştırıldı."
+#: org/postgresql/jdbc/PgSQLXML.java:273
+msgid "Unable to convert DOMResult SQLXML data to a string."
+msgstr "DOMResult SQLXML verisini diziye dönüştürülemedi."
-#: org/postgresql/jdbc/PgCallableStatement.java:139
-#, java-format
+#: org/postgresql/jdbc/PgSQLXML.java:287
msgid ""
-"A CallableStatement function was executed and the out parameter {0} was of "
-"type {1} however type {2} was registered."
+"This SQLXML object has already been initialized, so you cannot manipulate it "
+"further."
msgstr ""
-"CallableStatement çalıştırıldı, ancak {2} tipi kaydedilmesine rağmen "
-"döndürme parametresi {0} ve tipi {1} idi."
+"Bu SQLXML nesnesi daha önceden ilklendirilmiştir; o yüzden daha fazla "
+"müdahale edilemez."
-#: org/postgresql/jdbc/PgCallableStatement.java:195
-msgid ""
-"This statement does not declare an OUT parameter. Use '{' ?= call ... '}' "
-"to declare one."
-msgstr ""
-"Bu komut OUT parametresi bildirmemektedir. Bildirmek için '{' ?= call ... "
-"'}' kullanın."
+#: org/postgresql/jdbc/PSQLSavepoint.java:37
+#: org/postgresql/jdbc/PSQLSavepoint.java:51
+#: org/postgresql/jdbc/PSQLSavepoint.java:69
+msgid "Cannot reference a savepoint after it has been released."
+msgstr "Bırakıldıktan sonra savepoint referans edilemez."
-#: org/postgresql/jdbc/PgCallableStatement.java:239
-msgid "wasNull cannot be call before fetching a result."
-msgstr "wasNull sonuç çekmeden önce çağırılamaz."
+#: org/postgresql/jdbc/PSQLSavepoint.java:42
+msgid "Cannot retrieve the id of a named savepoint."
+msgstr "Adlandırılmış savepointin id değerine erişilemiyor."
+
+#: org/postgresql/jdbc/PSQLSavepoint.java:56
+msgid "Cannot retrieve the name of an unnamed savepoint."
+msgstr "Adı verilmemiş savepointin id değerine erişilemiyor."
-#: org/postgresql/jdbc/PgCallableStatement.java:377
-#: org/postgresql/jdbc/PgCallableStatement.java:396
+#: org/postgresql/jdbc/PgArray.java:157 org/postgresql/jdbc/PgArray.java:844
#, java-format
-msgid ""
-"Parameter of type {0} was registered, but call to get{1} (sqltype={2}) was "
-"made."
-msgstr ""
-"{0} tipinde parametre tanıtıldı, ancak {1} (sqltype={2}) tipinde geri "
-"getirmek için çağrı yapıldı."
+msgid "The array index is out of range: {0}"
+msgstr "Dizi göstergesi kapsam dışıdır: {0}"
-#: org/postgresql/jdbc/PgCallableStatement.java:417
-msgid ""
-"A CallableStatement was declared, but no call to registerOutParameter(1, "
-"<some type>) was made."
-msgstr ""
-"CallableStatement bildirildi ancak registerOutParameter(1, < bir tip>) "
-"tanıtımı yapılmadı."
+#: org/postgresql/jdbc/PgArray.java:178 org/postgresql/jdbc/PgArray.java:861
+#, java-format
+msgid "The array index is out of range: {0}, number of elements: {1}."
+msgstr "Dizin göstergisi kapsam dışıdır: {0}, öğe sayısı: {1}."
-#: org/postgresql/jdbc/PgCallableStatement.java:423
-msgid "No function outputs were registered."
-msgstr "Hiçbir fonksiyon çıktısı kaydedilmedi."
+#: org/postgresql/jdbc/PgParameterMetaData.java:83
+#, java-format
+msgid "The parameter index is out of range: {0}, number of parameters: {1}."
+msgstr "Dizin göstergisi kapsam dışıdır: {0}, öğe sayısı: {1}."
-#: org/postgresql/jdbc/PgCallableStatement.java:429
+#: org/postgresql/jdbc/BatchResultHandler.java:92
+msgid "Too many update results were returned."
+msgstr "Çok fazla güncelleme sonucu döndürüldü."
+
+#: org/postgresql/jdbc/BatchResultHandler.java:146
+#, fuzzy, java-format
msgid ""
-"Results cannot be retrieved from a CallableStatement before it is executed."
-msgstr "CallableStatement çalıştırılmadan sonuçlar ondan alınamaz."
+"Batch entry {0} {1} was aborted: {2} Call getNextException to see other "
+"errors in the batch."
+msgstr ""
+"Tpilı iş girişi {0} {1} durduruldu. Nedenini görmek için getNextException "
+"fonksiyonu çağırın."
-#: org/postgresql/jdbc/PgConnection.java:312
+#: org/postgresql/jdbc/PgConnection.java:272
#, java-format
msgid "Unsupported value for stringtype parameter: {0}"
msgstr "strinftype parametresi için destekleneyen değer: {0}"
-#: org/postgresql/jdbc/PgConnection.java:457
-#: org/postgresql/jdbc/PgPreparedStatement.java:115
-#: org/postgresql/jdbc/PgStatement.java:282
-#: org/postgresql/jdbc/TypeInfoCache.java:230
-#: org/postgresql/jdbc/TypeInfoCache.java:370
-#: org/postgresql/jdbc/TypeInfoCache.java:412
+#: org/postgresql/jdbc/PgConnection.java:424
+#: org/postgresql/jdbc/PgStatement.java:225
+#: org/postgresql/jdbc/TypeInfoCache.java:226
+#: org/postgresql/jdbc/TypeInfoCache.java:371
+#: org/postgresql/jdbc/TypeInfoCache.java:411
+#: org/postgresql/jdbc/TypeInfoCache.java:484
#: org/postgresql/jdbc/TypeInfoCache.java:489
-#: org/postgresql/jdbc/TypeInfoCache.java:494
-#: org/postgresql/jdbc/TypeInfoCache.java:535
-#: org/postgresql/jdbc/TypeInfoCache.java:540
+#: org/postgresql/jdbc/TypeInfoCache.java:526
+#: org/postgresql/jdbc/TypeInfoCache.java:531
+#: org/postgresql/jdbc/PgPreparedStatement.java:119
msgid "No results were returned by the query."
msgstr "Sorgudan hiç bir sonuç dönmedi."
-#: org/postgresql/jdbc/PgConnection.java:578
+#: org/postgresql/jdbc/PgConnection.java:441
+#: org/postgresql/jdbc/PgStatement.java:254
+msgid "A result was returned when none was expected."
+msgstr "Hiçbir sonuç kebklenimezken sonuç getirildi."
+
+#: org/postgresql/jdbc/PgConnection.java:545
msgid "Custom type maps are not supported."
msgstr "Özel tip eşleştirmeleri desteklenmiyor."
-#: org/postgresql/jdbc/PgConnection.java:620
+#: org/postgresql/jdbc/PgConnection.java:587
#, java-format
msgid "Failed to create object for: {0}."
msgstr "{0} için nesne oluşturma hatası."
-#: org/postgresql/jdbc/PgConnection.java:672
+#: org/postgresql/jdbc/PgConnection.java:641
#, java-format
msgid "Unable to load the class {0} responsible for the datatype {1}"
msgstr "{1} veri tipinden sorumlu {0} sınıfı yüklenemedi"
-#: org/postgresql/jdbc/PgConnection.java:724
+#: org/postgresql/jdbc/PgConnection.java:693
msgid ""
"Cannot change transaction read-only property in the middle of a transaction."
msgstr ""
"Transaction ortasında geçerli transactionun read-only özellği değiştirilemez."
-#: org/postgresql/jdbc/PgConnection.java:775
+#: org/postgresql/jdbc/PgConnection.java:756
msgid "Cannot commit when autoCommit is enabled."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:786
-#: org/postgresql/jdbc/PgConnection.java:1358
-#: org/postgresql/jdbc/PgConnection.java:1395
+#: org/postgresql/jdbc/PgConnection.java:767
+#: org/postgresql/jdbc/PgConnection.java:1384
+#: org/postgresql/jdbc/PgConnection.java:1428
#, fuzzy
msgid "This connection has been closed."
msgstr "Bağlantı kapatıldı."
-#: org/postgresql/jdbc/PgConnection.java:796
+#: org/postgresql/jdbc/PgConnection.java:777
msgid "Cannot rollback when autoCommit is enabled."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:870
+#: org/postgresql/jdbc/PgConnection.java:827
msgid ""
"Cannot change transaction isolation level in the middle of a transaction."
msgstr ""
"Transaction ortasında geçerli transactionun transaction isolation level "
"özellği değiştirilemez."
-#: org/postgresql/jdbc/PgConnection.java:876
+#: org/postgresql/jdbc/PgConnection.java:833
#, java-format
msgid "Transaction isolation level {0} not supported."
msgstr "Transaction isolation level {0} desteklenmiyor."
-#: org/postgresql/jdbc/PgConnection.java:921
+#: org/postgresql/jdbc/PgConnection.java:878
msgid "Finalizing a Connection that was never closed:"
msgstr "Kapatılmamış bağlantı sonlandırılıyor."
-#: org/postgresql/jdbc/PgConnection.java:1009
+#: org/postgresql/jdbc/PgConnection.java:945
msgid "Unable to translate data into the desired encoding."
msgstr "Veri, istenilen dil kodlamasına çevrilemiyor."
-#: org/postgresql/jdbc/PgConnection.java:1081
-#: org/postgresql/jdbc/PgResultSet.java:1782
-#: org/postgresql/jdbc/PgStatement.java:1053
+#: org/postgresql/jdbc/PgConnection.java:1008
+#: org/postgresql/jdbc/PgStatement.java:903
+#: org/postgresql/jdbc/PgResultSet.java:1817
msgid "Fetch size must be a value greater to or equal to 0."
msgstr "Fetch boyutu sıfır veya daha büyük bir değer olmalıdır."
-#: org/postgresql/jdbc/PgConnection.java:1311
+#: org/postgresql/jdbc/PgConnection.java:1289
+#: org/postgresql/jdbc/PgConnection.java:1330
#, java-format
msgid "Unable to find server array type for provided name {0}."
msgstr "Belirtilen {0} adı için sunucu array tipi bulunamadı."
-#: org/postgresql/jdbc/PgConnection.java:1327
+#: org/postgresql/jdbc/PgConnection.java:1312
+#, fuzzy, java-format
+msgid "Invalid elements {0}"
+msgstr "Geçersiz seçenekler {0}"
+
+#: org/postgresql/jdbc/PgConnection.java:1348
#, fuzzy, java-format
msgid "Invalid timeout ({0}<0)."
msgstr "Geçersiz akım uzunluğu {0}."
-#: org/postgresql/jdbc/PgConnection.java:1340
+#: org/postgresql/jdbc/PgConnection.java:1372
msgid "Validating connection."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:1375
+#: org/postgresql/jdbc/PgConnection.java:1405
#, fuzzy, java-format
msgid "Failed to set ClientInfo property: {0}"
msgstr "{0} için nesne oluşturma hatası."
-#: org/postgresql/jdbc/PgConnection.java:1383
+#: org/postgresql/jdbc/PgConnection.java:1415
msgid "ClientInfo property not supported."
msgstr "Clientinfo property'si desteklenememktedir."
-#: org/postgresql/jdbc/PgConnection.java:1408
+#: org/postgresql/jdbc/PgConnection.java:1441
msgid "One ore more ClientInfo failed."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:1517
+#: org/postgresql/jdbc/PgConnection.java:1540
+#, fuzzy
+msgid "Network timeout must be a value greater than or equal to 0."
+msgstr "Sorgu zaman aşımı değer sıfır veya sıfırdan büyük bir sayı olmalıdır."
+
+#: org/postgresql/jdbc/PgConnection.java:1552
+msgid "Unable to set network timeout."
+msgstr ""
+
+#: org/postgresql/jdbc/PgConnection.java:1563
+msgid "Unable to get network timeout."
+msgstr ""
+
+#: org/postgresql/jdbc/PgConnection.java:1580
#, java-format
msgid "Unknown ResultSet holdability setting: {0}."
msgstr "ResultSet tutabilme ayarı geçersiz: {0}."
-#: org/postgresql/jdbc/PgConnection.java:1531
-#: org/postgresql/jdbc/PgConnection.java:1554
-#: org/postgresql/jdbc/PgConnection.java:1576
-#: org/postgresql/jdbc/PgConnection.java:1587
-msgid "Server versions prior to 8.0 do not support savepoints."
-msgstr "Sunucunun 8.0''dan önceki sürümler savepoint desteklememektedir."
-
-#: org/postgresql/jdbc/PgConnection.java:1535
-#: org/postgresql/jdbc/PgConnection.java:1558
+#: org/postgresql/jdbc/PgConnection.java:1598
+#: org/postgresql/jdbc/PgConnection.java:1619
msgid "Cannot establish a savepoint in auto-commit mode."
msgstr "Auto-commit biçimde savepoint oluşturulamıyor."
-#: org/postgresql/jdbc/PgConnection.java:1635
+#: org/postgresql/jdbc/PgConnection.java:1685
msgid "Returning autogenerated keys is not supported."
msgstr "Otomatik üretilen değerlerin getirilmesi desteklenememktedir."
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:78
+#: org/postgresql/jdbc/PgStatement.java:235
+msgid "Multiple ResultSets were returned by the query."
+msgstr "Sorgu tarafından birden fazla ResultSet getirildi."
+
+#: org/postgresql/jdbc/PgStatement.java:316
+msgid "Can''t use executeWithFlags(int) on a Statement."
+msgstr ""
+
+#: org/postgresql/jdbc/PgStatement.java:509
+msgid "Maximum number of rows must be a value grater than or equal to 0."
+msgstr "En büyük getirilecek satır sayısı sıfırdan büyük olmalıdır."
+
+#: org/postgresql/jdbc/PgStatement.java:550
+msgid "Query timeout must be a value greater than or equals to 0."
+msgstr "Sorgu zaman aşımı değer sıfır veya sıfırdan büyük bir sayı olmalıdır."
+
+#: org/postgresql/jdbc/PgStatement.java:590
+msgid "The maximum field size must be a value greater than or equal to 0."
+msgstr "En büyük alan boyutu sıfır ya da sıfırdan büyük bir değer olmalı."
+
+#: org/postgresql/jdbc/PgStatement.java:689
+msgid "This statement has been closed."
+msgstr "Bu komut kapatıldı."
+
+#: org/postgresql/jdbc/PgStatement.java:895
+#: org/postgresql/jdbc/PgResultSet.java:878
+#, java-format
+msgid "Invalid fetch direction constant: {0}."
+msgstr "Getirme yönü değişmezi geçersiz: {0}."
+
+#: org/postgresql/jdbc/PgStatement.java:1145
+#: org/postgresql/jdbc/PgStatement.java:1173
+msgid "Returning autogenerated keys by column index is not supported."
+msgstr ""
+"Kolonların indexlenmesi ile otomatik olarak oluşturulan anahtarların "
+"döndürülmesi desteklenmiyor."
+
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:66
msgid ""
"Unable to determine a value for MaxIndexKeys due to missing system catalog "
"data."
msgstr ""
"Sistem kataloğu olmadığından MaxIndexKeys değerini tespit edilememektedir."
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:100
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:89
msgid "Unable to find name datatype in the system catalogs."
msgstr "Sistem kataloglarında name veri tipi bulunamıyor."
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1117
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1028
msgid "proname"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1117
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1028
msgid "oid"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1119
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1714
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1030
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1481
msgid "typtype"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1122
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1033
msgid "proargtypes"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1732
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1499
msgid "adsrc"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1872
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1963
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1512
+msgid "attidentity"
+msgstr ""
+
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1608
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1684
msgid "rolname"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1873
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1964
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1609
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1685
msgid "relacl"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1878
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1615
msgid "attacl"
msgstr ""
-#: org/postgresql/jdbc/PgParameterMetaData.java:86
+#: org/postgresql/jdbc/AbstractBlobClob.java:78
+msgid ""
+"Truncation of large objects is only implemented in 8.3 and later servers."
+msgstr "Large objectlerin temizlenmesi 8.3 ve sonraki sürümlerde kodlanmıştır."
+
+#: org/postgresql/jdbc/AbstractBlobClob.java:83
+msgid "Cannot truncate LOB to a negative length."
+msgstr ""
+
+#: org/postgresql/jdbc/AbstractBlobClob.java:90
+#: org/postgresql/jdbc/AbstractBlobClob.java:234
#, java-format
-msgid "The parameter index is out of range: {0}, number of parameters: {1}."
-msgstr "Dizin göstergisi kapsam dışıdır: {0}, öğe sayısı: {1}."
+msgid "PostgreSQL LOBs can only index to: {0}"
+msgstr "PostgreSQL LOB göstergeleri sadece {0} referans edebilir"
+
+#: org/postgresql/jdbc/AbstractBlobClob.java:230
+msgid "LOB positioning offsets start at 1."
+msgstr "LOB bağlangıç adresi 1Den başlıyor"
+
+#: org/postgresql/jdbc/AbstractBlobClob.java:246
+msgid "free() was called on this LOB previously"
+msgstr "Bu LOB'da free() daha önce çağırıldı"
-#: org/postgresql/jdbc/PgPreparedStatement.java:102
-#: org/postgresql/jdbc/PgPreparedStatement.java:128
-#: org/postgresql/jdbc/PgPreparedStatement.java:150
-#: org/postgresql/jdbc/PgPreparedStatement.java:1108
+#: org/postgresql/jdbc/PgPreparedStatement.java:106
+#: org/postgresql/jdbc/PgPreparedStatement.java:127
+#: org/postgresql/jdbc/PgPreparedStatement.java:139
+#: org/postgresql/jdbc/PgPreparedStatement.java:1035
msgid ""
"Can''t use query methods that take a query string on a PreparedStatement."
msgstr "PreparedStatement ile sorgu satırı alan sorgu yöntemleri kullanılamaz."
-#: org/postgresql/jdbc/PgPreparedStatement.java:119
-#: org/postgresql/jdbc/PgStatement.java:286
-msgid "Multiple ResultSets were returned by the query."
-msgstr "Sorgu tarafından birden fazla ResultSet getirildi."
-
-#: org/postgresql/jdbc/PgPreparedStatement.java:270
+#: org/postgresql/jdbc/PgPreparedStatement.java:249
msgid "Unknown Types value."
msgstr "Geçersiz Types değeri."
-#: org/postgresql/jdbc/PgPreparedStatement.java:417
-#: org/postgresql/jdbc/PgPreparedStatement.java:486
-#: org/postgresql/jdbc/PgPreparedStatement.java:1251
-#: org/postgresql/jdbc/PgPreparedStatement.java:1583
+#: org/postgresql/jdbc/PgPreparedStatement.java:382
+#: org/postgresql/jdbc/PgPreparedStatement.java:439
+#: org/postgresql/jdbc/PgPreparedStatement.java:1191
+#: org/postgresql/jdbc/PgPreparedStatement.java:1490
#, java-format
msgid "Invalid stream length {0}."
msgstr "Geçersiz akım uzunluğu {0}."
-#: org/postgresql/jdbc/PgPreparedStatement.java:447
+#: org/postgresql/jdbc/PgPreparedStatement.java:411
#, java-format
msgid "The JVM claims not to support the {0} encoding."
msgstr "JVM, {0} dil kodlamasını desteklememektedir."
-#: org/postgresql/jdbc/PgPreparedStatement.java:450
-#: org/postgresql/jdbc/PgPreparedStatement.java:519
-#: org/postgresql/jdbc/PgResultSet.java:1075
-#: org/postgresql/jdbc/PgResultSet.java:1109
+#: org/postgresql/jdbc/PgPreparedStatement.java:414
+#: org/postgresql/jdbc/PgResultSet.java:1122
+#: org/postgresql/jdbc/PgResultSet.java:1156
msgid "Provided InputStream failed."
msgstr "Sağlanmış InputStream başarısız."
-#: org/postgresql/jdbc/PgPreparedStatement.java:536
-#: org/postgresql/jdbc/PgPreparedStatement.java:1170
+#: org/postgresql/jdbc/PgPreparedStatement.java:460
+#: org/postgresql/jdbc/PgPreparedStatement.java:1096
#, java-format
msgid "Unknown type {0}."
msgstr "Bilinmeyen tip {0}."
-#: org/postgresql/jdbc/PgPreparedStatement.java:553
+#: org/postgresql/jdbc/PgPreparedStatement.java:477
msgid "No hstore extension installed."
msgstr ""
-#: org/postgresql/jdbc/PgPreparedStatement.java:683
-#: org/postgresql/jdbc/PgPreparedStatement.java:705
-#: org/postgresql/jdbc/PgPreparedStatement.java:715
-#: org/postgresql/jdbc/PgPreparedStatement.java:725
+#: org/postgresql/jdbc/PgPreparedStatement.java:619
+#: org/postgresql/jdbc/PgPreparedStatement.java:642
+#: org/postgresql/jdbc/PgPreparedStatement.java:652
+#: org/postgresql/jdbc/PgPreparedStatement.java:664
#, java-format
msgid "Cannot cast an instance of {0} to type {1}"
msgstr "{0} tipi {1} tipine dönüştürülemiyor"
-#: org/postgresql/jdbc/PgPreparedStatement.java:741
+#: org/postgresql/jdbc/PgPreparedStatement.java:682
#, java-format
msgid "Unsupported Types value: {0}"
msgstr "Geçersiz Types değeri: {0}"
-#: org/postgresql/jdbc/PgPreparedStatement.java:970
+#: org/postgresql/jdbc/PgPreparedStatement.java:894
#, java-format
msgid "Cannot convert an instance of {0} to type {1}"
msgstr "{0} instance, {1} tipine dönüştürülemiyor"
-#: org/postgresql/jdbc/PgPreparedStatement.java:1040
+#: org/postgresql/jdbc/PgPreparedStatement.java:968
#, java-format
msgid ""
"Can''t infer the SQL type to use for an instance of {0}. Use setObject() "
@@ -1018,23 +1283,22 @@ msgstr ""
"{0}''nin örneği ile kullanılacak SQL tip bulunamadı. Kullanılacak tip "
"belirtmek için kesin Types değerleri ile setObject() kullanın."
-#: org/postgresql/jdbc/PgPreparedStatement.java:1207
-#: org/postgresql/jdbc/PgPreparedStatement.java:1303
-#: org/postgresql/jdbc/PgPreparedStatement.java:1340
+#: org/postgresql/jdbc/PgPreparedStatement.java:1133
+#: org/postgresql/jdbc/PgPreparedStatement.java:1233
msgid "Unexpected error writing large object to database."
msgstr "Large object veritabanına yazılırken beklenmeyan hata."
-#: org/postgresql/jdbc/PgPreparedStatement.java:1278
-#: org/postgresql/jdbc/PgResultSet.java:1163
+#: org/postgresql/jdbc/PgPreparedStatement.java:1178
+#: org/postgresql/jdbc/PgResultSet.java:1210
msgid "Provided Reader failed."
msgstr "Sağlanmış InputStream başarısız."
-#: org/postgresql/jdbc/PgPreparedStatement.java:1542
-#: org/postgresql/util/StreamWrapper.java:59
-msgid "Object is too large to send over the protocol."
+#: org/postgresql/jdbc/BooleanTypeUtil.java:99
+#, java-format
+msgid "Cannot cast to boolean: \"{0}\""
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:285
+#: org/postgresql/jdbc/PgResultSet.java:280
msgid ""
"Operation requires a scrollable ResultSet, but this ResultSet is "
"FORWARD_ONLY."
@@ -1042,40 +1306,32 @@ msgstr ""
"İşlem, kaydırılabilen ResultSet gerektirir, ancak bu ResultSet "
"FORWARD_ONLYdir."
-#: org/postgresql/jdbc/PgResultSet.java:456
-msgid "Unexpected error while decoding character data from a large object."
-msgstr "Large-object nesnesinden karakter veriyi çözerken beklenmeyen hata."
-
-#: org/postgresql/jdbc/PgResultSet.java:507
-#: org/postgresql/jdbc/PgResultSet.java:537
-#: org/postgresql/jdbc/PgResultSet.java:570
-#: org/postgresql/jdbc/PgResultSet.java:2964
+#: org/postgresql/jdbc/PgResultSet.java:492
+#: org/postgresql/jdbc/PgResultSet.java:532
+#: org/postgresql/jdbc/PgResultSet.java:556
+#: org/postgresql/jdbc/PgResultSet.java:594
+#: org/postgresql/jdbc/PgResultSet.java:624
#: org/postgresql/jdbc/PgResultSet.java:3008
+#: org/postgresql/jdbc/PgResultSet.java:3052
#, fuzzy, java-format
msgid "Cannot convert the column of type {0} to requested type {1}."
msgstr "{0} instance, {1} tipine dönüştürülemiyor"
-#: org/postgresql/jdbc/PgResultSet.java:789
-#: org/postgresql/jdbc/PgResultSet.java:810
-#: org/postgresql/jdbc/PgResultSet.java:1797
+#: org/postgresql/jdbc/PgResultSet.java:838
+#: org/postgresql/jdbc/PgResultSet.java:859
+#: org/postgresql/jdbc/PgResultSet.java:1832
msgid "Can''t use relative move methods while on the insert row."
msgstr "Insert kaydı üzerinde relative move method kullanılamaz."
-#: org/postgresql/jdbc/PgResultSet.java:829
-#: org/postgresql/jdbc/PgStatement.java:1045
-#, java-format
-msgid "Invalid fetch direction constant: {0}."
-msgstr "Getirme yönü değişmezi geçersiz: {0}."
-
-#: org/postgresql/jdbc/PgResultSet.java:840
+#: org/postgresql/jdbc/PgResultSet.java:889
msgid "Cannot call cancelRowUpdates() when on the insert row."
msgstr "Insert edilmiş kaydın üzerindeyken cancelRowUpdates() çağırılamaz."
-#: org/postgresql/jdbc/PgResultSet.java:856
+#: org/postgresql/jdbc/PgResultSet.java:905
msgid "Cannot call deleteRow() when on the insert row."
msgstr "Insert kaydı üzerinde deleteRow() çağırılamaz."
-#: org/postgresql/jdbc/PgResultSet.java:863
+#: org/postgresql/jdbc/PgResultSet.java:912
msgid ""
"Currently positioned before the start of the ResultSet. You cannot call "
"deleteRow() here."
@@ -1083,7 +1339,7 @@ msgstr ""
"Şu an ResultSet başlangcıından önce konumlandı. deleteRow() burada "
"çağırabilirsiniz."
-#: org/postgresql/jdbc/PgResultSet.java:869
+#: org/postgresql/jdbc/PgResultSet.java:918
msgid ""
"Currently positioned after the end of the ResultSet. You cannot call "
"deleteRow() here."
@@ -1091,36 +1347,36 @@ msgstr ""
"Şu an ResultSet sonucundan sonra konumlandı. deleteRow() burada "
"çağırabilirsiniz."
-#: org/postgresql/jdbc/PgResultSet.java:873
+#: org/postgresql/jdbc/PgResultSet.java:922
msgid "There are no rows in this ResultSet."
msgstr "Bu ResultSet içinde kayıt bulunamadı."
-#: org/postgresql/jdbc/PgResultSet.java:914
+#: org/postgresql/jdbc/PgResultSet.java:963
msgid "Not on the insert row."
msgstr "Insert kaydı değil."
-#: org/postgresql/jdbc/PgResultSet.java:916
+#: org/postgresql/jdbc/PgResultSet.java:965
msgid "You must specify at least one column value to insert a row."
msgstr "Bir satır eklemek için en az bir sütun değerini belirtmelisiniz."
-#: org/postgresql/jdbc/PgResultSet.java:1072
-#: org/postgresql/jdbc/PgResultSet.java:1706
-#: org/postgresql/jdbc/PgResultSet.java:2377
-#: org/postgresql/jdbc/PgResultSet.java:2402
+#: org/postgresql/jdbc/PgResultSet.java:1119
+#: org/postgresql/jdbc/PgResultSet.java:1754
+#: org/postgresql/jdbc/PgResultSet.java:2416
+#: org/postgresql/jdbc/PgResultSet.java:2437
#, java-format
msgid "The JVM claims not to support the encoding: {0}"
msgstr "JVM, {0} dil kodlamasını desteklememektedir."
-#: org/postgresql/jdbc/PgResultSet.java:1214
+#: org/postgresql/jdbc/PgResultSet.java:1261
msgid "Can''t refresh the insert row."
msgstr "Inser satırı yenilenemiyor."
-#: org/postgresql/jdbc/PgResultSet.java:1280
+#: org/postgresql/jdbc/PgResultSet.java:1328
msgid "Cannot call updateRow() when on the insert row."
msgstr "Insert kaydı üzerinde updateRow() çağırılamaz."
-#: org/postgresql/jdbc/PgResultSet.java:1287
-#: org/postgresql/jdbc/PgResultSet.java:3025
+#: org/postgresql/jdbc/PgResultSet.java:1335
+#: org/postgresql/jdbc/PgResultSet.java:3069
msgid ""
"Cannot update the ResultSet because it is either before the start or after "
"the end of the results."
@@ -1128,470 +1384,349 @@ msgstr ""
"ResultSet, sonuçların ilk kaydından önce veya son kaydından sonra olduğu "
"için güncelleme yapılamamaktadır."
-#: org/postgresql/jdbc/PgResultSet.java:1486
+#: org/postgresql/jdbc/PgResultSet.java:1535
msgid "ResultSets with concurrency CONCUR_READ_ONLY cannot be updated."
msgstr "Eş zamanlama CONCUR_READ_ONLY olan ResultSet''ler değiştirilemez"
-#: org/postgresql/jdbc/PgResultSet.java:1555
+#: org/postgresql/jdbc/PgResultSet.java:1603
#, java-format
msgid "No primary key found for table {0}."
msgstr "{0} tablosunda primary key yok."
-#: org/postgresql/jdbc/PgResultSet.java:1941
-#: org/postgresql/jdbc/PgResultSet.java:1946
-#: org/postgresql/jdbc/PgResultSet.java:1986
-#: org/postgresql/jdbc/PgResultSet.java:1992
-#: org/postgresql/jdbc/PgResultSet.java:2790
-#: org/postgresql/jdbc/PgResultSet.java:2796
-#: org/postgresql/jdbc/PgResultSet.java:2820
-#: org/postgresql/jdbc/PgResultSet.java:2825
-#: org/postgresql/jdbc/PgResultSet.java:2841
-#: org/postgresql/jdbc/PgResultSet.java:2862
-#: org/postgresql/jdbc/PgResultSet.java:2873
-#: org/postgresql/jdbc/PgResultSet.java:2886
-#: org/postgresql/jdbc/PgResultSet.java:3013
+#: org/postgresql/jdbc/PgResultSet.java:2011
+#: org/postgresql/jdbc/PgResultSet.java:2016
+#: org/postgresql/jdbc/PgResultSet.java:2803
+#: org/postgresql/jdbc/PgResultSet.java:2809
+#: org/postgresql/jdbc/PgResultSet.java:2834
+#: org/postgresql/jdbc/PgResultSet.java:2840
+#: org/postgresql/jdbc/PgResultSet.java:2864
+#: org/postgresql/jdbc/PgResultSet.java:2869
+#: org/postgresql/jdbc/PgResultSet.java:2885
+#: org/postgresql/jdbc/PgResultSet.java:2906
+#: org/postgresql/jdbc/PgResultSet.java:2917
+#: org/postgresql/jdbc/PgResultSet.java:2930
+#: org/postgresql/jdbc/PgResultSet.java:3057
#, java-format
msgid "Bad value for type {0} : {1}"
msgstr "{0} veri tipi için geçersiz değer : {1}"
-#: org/postgresql/jdbc/PgResultSet.java:2564
-#, java-format
-msgid "The column name {0} was not found in this ResultSet."
-msgstr "Bu ResultSet içinde {0} sütun adı bulunamadı."
-
-#: org/postgresql/jdbc/PgResultSet.java:2689
-msgid ""
-"ResultSet is not updateable. The query that generated this result set must "
-"select only one table, and must select all primary keys from that table. See "
-"the JDBC 2.1 API Specification, section 5.6 for more details."
-msgstr ""
-"ResultSet değiştirilemez. Bu sonucu üreten sorgu tek bir tablodan "
-"sorgulamalı ve tablonun tüm primary key alanları belirtmelidir. Daha fazla "
-"bilgi için bk. JDBC 2.1 API Specification, section 5.6."
-
-#: org/postgresql/jdbc/PgResultSet.java:2701
-msgid "This ResultSet is closed."
-msgstr "ResultSet kapalıdır."
-
-#: org/postgresql/jdbc/PgResultSet.java:2732
-msgid "ResultSet not positioned properly, perhaps you need to call next."
-msgstr "ResultSet doğru konumlanmamıştır, next işlemi çağırmanız gerekir."
-
-#: org/postgresql/jdbc/PgResultSet.java:3045
-msgid "Invalid UUID data."
-msgstr "Geçersiz UUID verisi."
-
-#: org/postgresql/jdbc/PgSQLXML.java:150
-msgid "Unable to decode xml data."
-msgstr "XML verisinin kodu çözülemedi."
-
-#: org/postgresql/jdbc/PgSQLXML.java:153
-#, java-format
-msgid "Unknown XML Source class: {0}"
-msgstr "Bilinmeyen XML Kaynak Sınıfı: {0}"
-
-#: org/postgresql/jdbc/PgSQLXML.java:196
-msgid "Unable to create SAXResult for SQLXML."
-msgstr "SQLXML için SAXResult yaratılamadı."
-
-#: org/postgresql/jdbc/PgSQLXML.java:211
-msgid "Unable to create StAXResult for SQLXML"
-msgstr "SQLXML için StAXResult yaratılamadı"
-
-#: org/postgresql/jdbc/PgSQLXML.java:216
-#, java-format
-msgid "Unknown XML Result class: {0}"
-msgstr "Bilinmeyen XML Sonuç sınıfı: {0}."
-
-#: org/postgresql/jdbc/PgSQLXML.java:228
-msgid "This SQLXML object has already been freed."
-msgstr "Bu SQLXML nesnesi zaten boşaltılmış."
-
-#: org/postgresql/jdbc/PgSQLXML.java:237
-msgid ""
-"This SQLXML object has not been initialized, so you cannot retrieve data "
-"from it."
-msgstr "Bu SQLXML nesnesi ilklendirilmemiş; o yüzden ondan veri alamazsınız."
-
-#: org/postgresql/jdbc/PgSQLXML.java:250
-#, java-format
-msgid "Failed to convert binary xml data to encoding: {0}."
-msgstr "xml verisinin şu dil kodlamasına çevirilmesi başarısız oldu: {0}"
-
-#: org/postgresql/jdbc/PgSQLXML.java:276
-msgid "Unable to convert DOMResult SQLXML data to a string."
-msgstr "DOMResult SQLXML verisini diziye dönüştürülemedi."
-
-#: org/postgresql/jdbc/PgSQLXML.java:290
-msgid ""
-"This SQLXML object has already been initialized, so you cannot manipulate it "
-"further."
-msgstr ""
-"Bu SQLXML nesnesi daha önceden ilklendirilmiştir; o yüzden daha fazla "
-"müdahale edilemez."
-
-#: org/postgresql/jdbc/PgStatement.java:325
-msgid "Can''t use executeWithFlags(int) on a Statement."
-msgstr ""
-
-#: org/postgresql/jdbc/PgStatement.java:484
-msgid "Maximum number of rows must be a value grater than or equal to 0."
-msgstr "En büyük getirilecek satır sayısı sıfırdan büyük olmalıdır."
-
-#: org/postgresql/jdbc/PgStatement.java:525
-msgid "Query timeout must be a value greater than or equals to 0."
-msgstr "Sorgu zaman aşımı değer sıfır veya sıfırdan büyük bir sayı olmalıdır."
-
-#: org/postgresql/jdbc/PgStatement.java:561
-msgid "The maximum field size must be a value greater than or equal to 0."
-msgstr "En büyük alan boyutu sıfır ya da sıfırdan büyük bir değer olmalı."
-
-#: org/postgresql/jdbc/PgStatement.java:871
-msgid "This statement has been closed."
-msgstr "Bu komut kapatıldı."
+#: org/postgresql/jdbc/PgResultSet.java:2589
+#, java-format
+msgid "The column name {0} was not found in this ResultSet."
+msgstr "Bu ResultSet içinde {0} sütun adı bulunamadı."
-#: org/postgresql/jdbc/PgStatement.java:1148
+#: org/postgresql/jdbc/PgResultSet.java:2725
msgid ""
-"Returning autogenerated keys is only supported for 8.2 and later servers."
+"ResultSet is not updateable. The query that generated this result set must "
+"select only one table, and must select all primary keys from that table. See "
+"the JDBC 2.1 API Specification, section 5.6 for more details."
msgstr ""
-"Otomatik üretilen anahtarların döndürülmesi sadece 8.2 ve üzerindeki "
-"sürümlerdeki sunucularda desteklenmektedir."
+"ResultSet değiştirilemez. Bu sonucu üreten sorgu tek bir tablodan "
+"sorgulamalı ve tablonun tüm primary key alanları belirtmelidir. Daha fazla "
+"bilgi için bk. JDBC 2.1 API Specification, section 5.6."
-#: org/postgresql/jdbc/PgStatement.java:1326
-#: org/postgresql/jdbc/PgStatement.java:1357
-msgid "Returning autogenerated keys by column index is not supported."
-msgstr ""
-"Kolonların indexlenmesi ile otomatik olarak oluşturulan anahtarların "
-"döndürülmesi desteklenmiyor."
+#: org/postgresql/jdbc/PgResultSet.java:2737
+msgid "This ResultSet is closed."
+msgstr "ResultSet kapalıdır."
-#: org/postgresql/jdbc/PSQLSavepoint.java:40
-#: org/postgresql/jdbc/PSQLSavepoint.java:54
-#: org/postgresql/jdbc/PSQLSavepoint.java:72
-msgid "Cannot reference a savepoint after it has been released."
-msgstr "Bırakıldıktan sonra savepoint referans edilemez."
+#: org/postgresql/jdbc/PgResultSet.java:2768
+msgid "ResultSet not positioned properly, perhaps you need to call next."
+msgstr "ResultSet doğru konumlanmamıştır, next işlemi çağırmanız gerekir."
-#: org/postgresql/jdbc/PSQLSavepoint.java:45
-msgid "Cannot retrieve the id of a named savepoint."
-msgstr "Adlandırılmış savepointin id değerine erişilemiyor."
+#: org/postgresql/jdbc/PgResultSet.java:3089
+msgid "Invalid UUID data."
+msgstr "Geçersiz UUID verisi."
-#: org/postgresql/jdbc/PSQLSavepoint.java:59
-msgid "Cannot retrieve the name of an unnamed savepoint."
-msgstr "Adı verilmemiş savepointin id değerine erişilemiyor."
+#: org/postgresql/jdbc/PgResultSet.java:3178
+#: org/postgresql/jdbc/PgResultSet.java:3185
+#: org/postgresql/jdbc/PgResultSet.java:3196
+#: org/postgresql/jdbc/PgResultSet.java:3207
+#: org/postgresql/jdbc/PgResultSet.java:3218
+#: org/postgresql/jdbc/PgResultSet.java:3229
+#: org/postgresql/jdbc/PgResultSet.java:3240
+#: org/postgresql/jdbc/PgResultSet.java:3251
+#: org/postgresql/jdbc/PgResultSet.java:3262
+#: org/postgresql/jdbc/PgResultSet.java:3269
+#: org/postgresql/jdbc/PgResultSet.java:3276
+#: org/postgresql/jdbc/PgResultSet.java:3287
+#: org/postgresql/jdbc/PgResultSet.java:3304
+#: org/postgresql/jdbc/PgResultSet.java:3311
+#: org/postgresql/jdbc/PgResultSet.java:3318
+#: org/postgresql/jdbc/PgResultSet.java:3329
+#: org/postgresql/jdbc/PgResultSet.java:3336
+#: org/postgresql/jdbc/PgResultSet.java:3343
+#: org/postgresql/jdbc/PgResultSet.java:3381
+#: org/postgresql/jdbc/PgResultSet.java:3388
+#: org/postgresql/jdbc/PgResultSet.java:3395
+#: org/postgresql/jdbc/PgResultSet.java:3415
+#: org/postgresql/jdbc/PgResultSet.java:3428
+#, fuzzy, java-format
+msgid "conversion to {0} from {1} not supported"
+msgstr "Transaction isolation level {0} desteklenmiyor."
-#: org/postgresql/jdbc/TimestampUtils.java:298
+#: org/postgresql/jdbc/TimestampUtils.java:355
+#: org/postgresql/jdbc/TimestampUtils.java:423
#, fuzzy, java-format
msgid "Bad value for type timestamp/date/time: {1}"
msgstr "{0} veri tipi için geçersiz değer : {1}"
-#: org/postgresql/jdbc/TimestampUtils.java:359
-msgid ""
-"Infinite value found for timestamp/date. This cannot be represented as time."
-msgstr ""
-"Timestamp veri tipinde sonsuz değer bulunmuştur. Buna uygun bir gösterim "
-"yoktur."
-
-#: org/postgresql/jdbc/TimestampUtils.java:674
-#: org/postgresql/jdbc/TimestampUtils.java:710
-#: org/postgresql/jdbc/TimestampUtils.java:757
+#: org/postgresql/jdbc/TimestampUtils.java:858
+#: org/postgresql/jdbc/TimestampUtils.java:915
+#: org/postgresql/jdbc/TimestampUtils.java:961
+#: org/postgresql/jdbc/TimestampUtils.java:1010
#, fuzzy, java-format
msgid "Unsupported binary encoding of {0}."
msgstr "Geçersiz Types değeri: {0}"
-#: org/postgresql/largeobject/LargeObjectManager.java:147
-msgid "Failed to initialize LargeObject API"
-msgstr "LArgeObject API ilklendirme hatası"
-
-#: org/postgresql/largeobject/LargeObjectManager.java:265
-#: org/postgresql/largeobject/LargeObjectManager.java:308
-msgid "Large Objects may not be used in auto-commit mode."
-msgstr "Auto-commit biçimde large object kullanılamaz."
+#: org/postgresql/jdbc/PgCallableStatement.java:86
+#: org/postgresql/jdbc/PgCallableStatement.java:96
+msgid "A CallableStatement was executed with nothing returned."
+msgstr "CallableStatement çalıştırma sonucunda veri getirilmedi."
-#: org/postgresql/osgi/PGDataSourceFactory.java:85
-#, fuzzy, java-format
-msgid "Unsupported properties: {0}"
-msgstr "Geçersiz Types değeri: {0}"
+#: org/postgresql/jdbc/PgCallableStatement.java:107
+msgid "A CallableStatement was executed with an invalid number of parameters"
+msgstr "CallableStatement geçersiz sayıda parametre ile çalıştırıldı."
-#: org/postgresql/PGProperty.java:450 org/postgresql/PGProperty.java:470
+#: org/postgresql/jdbc/PgCallableStatement.java:145
#, java-format
-msgid "{0} parameter value must be an integer but was: {1}"
-msgstr ""
-
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:125
msgid ""
-"Could not find a java cryptographic algorithm: X.509 CertificateFactory not "
-"available."
-msgstr ""
-
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:135
-#, java-format
-msgid "Could not open SSL certificate file {0}."
-msgstr ""
-
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:140
-#, java-format
-msgid "Loading the SSL certificate {0} into a KeyManager failed."
+"A CallableStatement function was executed and the out parameter {0} was of "
+"type {1} however type {2} was registered."
msgstr ""
+"CallableStatement çalıştırıldı, ancak {2} tipi kaydedilmesine rağmen "
+"döndürme parametresi {0} ve tipi {1} idi."
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:195
-msgid "Enter SSL password: "
+#: org/postgresql/jdbc/PgCallableStatement.java:202
+msgid ""
+"This statement does not declare an OUT parameter. Use '{' ?= call ... '}' "
+"to declare one."
msgstr ""
+"Bu komut OUT parametresi bildirmemektedir. Bildirmek için '{' ?= call ... "
+"'}' kullanın."
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:202
-msgid "Could not read password for SSL key file, console is not available."
-msgstr ""
+#: org/postgresql/jdbc/PgCallableStatement.java:246
+msgid "wasNull cannot be call before fetching a result."
+msgstr "wasNull sonuç çekmeden önce çağırılamaz."
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:207
+#: org/postgresql/jdbc/PgCallableStatement.java:384
+#: org/postgresql/jdbc/PgCallableStatement.java:403
#, java-format
-msgid "Could not read password for SSL key file by callbackhandler {0}."
+msgid ""
+"Parameter of type {0} was registered, but call to get{1} (sqltype={2}) was "
+"made."
msgstr ""
+"{0} tipinde parametre tanıtıldı, ancak {1} (sqltype={2}) tipinde geri "
+"getirmek için çağrı yapıldı."
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:226
-#, java-format
-msgid "Could not decrypt SSL key file {0}."
+#: org/postgresql/jdbc/PgCallableStatement.java:424
+msgid ""
+"A CallableStatement was declared, but no call to registerOutParameter(1, "
+"<some type>) was made."
msgstr ""
+"CallableStatement bildirildi ancak registerOutParameter(1, < bir tip>) "
+"tanıtımı yapılmadı."
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:240
-#, java-format
-msgid "Could not read SSL key file {0}."
-msgstr ""
+#: org/postgresql/jdbc/PgCallableStatement.java:430
+msgid "No function outputs were registered."
+msgstr "Hiçbir fonksiyon çıktısı kaydedilmedi."
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:243
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:162
-#, java-format
-msgid "Could not find a java cryptographic algorithm: {0}."
-msgstr ""
+#: org/postgresql/jdbc/PgCallableStatement.java:436
+msgid ""
+"Results cannot be retrieved from a CallableStatement before it is executed."
+msgstr "CallableStatement çalıştırılmadan sonuçlar ondan alınamaz."
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:90
+#: org/postgresql/jdbc/PgCallableStatement.java:703
#, fuzzy, java-format
-msgid "The password callback class provided {0} could not be instantiated."
-msgstr "SSLSocketFactory {0} ile örneklenmedi."
+msgid "Unsupported type conversion to {1}."
+msgstr "Geçersiz Types değeri: {0}"
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:123
+#: org/postgresql/jdbc/EscapedFunctions.java:240
#, java-format
-msgid "Could not open SSL root certificate file {0}."
-msgstr ""
+msgid "{0} function takes four and only four argument."
+msgstr "{0} fonksiyonunu yalnız dört parametre alabilir."
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:139
+#: org/postgresql/jdbc/EscapedFunctions.java:270
+#: org/postgresql/jdbc/EscapedFunctions.java:344
+#: org/postgresql/jdbc/EscapedFunctions.java:749
+#: org/postgresql/jdbc/EscapedFunctions.java:787
#, java-format
-msgid "Could not read SSL root certificate file {0}."
-msgstr ""
+msgid "{0} function takes two and only two arguments."
+msgstr "{0} fonksiyonunu sadece iki parametre alabilir."
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:143
+#: org/postgresql/jdbc/EscapedFunctions.java:288
+#: org/postgresql/jdbc/EscapedFunctions.java:326
+#: org/postgresql/jdbc/EscapedFunctions.java:446
+#: org/postgresql/jdbc/EscapedFunctions.java:461
+#: org/postgresql/jdbc/EscapedFunctions.java:476
+#: org/postgresql/jdbc/EscapedFunctions.java:491
+#: org/postgresql/jdbc/EscapedFunctions.java:506
+#: org/postgresql/jdbc/EscapedFunctions.java:521
+#: org/postgresql/jdbc/EscapedFunctions.java:536
+#: org/postgresql/jdbc/EscapedFunctions.java:551
+#: org/postgresql/jdbc/EscapedFunctions.java:566
+#: org/postgresql/jdbc/EscapedFunctions.java:581
+#: org/postgresql/jdbc/EscapedFunctions.java:596
+#: org/postgresql/jdbc/EscapedFunctions.java:611
+#: org/postgresql/jdbc/EscapedFunctions.java:775
#, java-format
-msgid "Loading the SSL root certificate {0} into a TrustManager failed."
-msgstr ""
-
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:156
-msgid "Could not initialize SSL context."
-msgstr ""
+msgid "{0} function takes one and only one argument."
+msgstr "{0} fonksiyonunu yalnız tek bir parametre alabilir."
-#: org/postgresql/ssl/MakeSSL.java:52
+#: org/postgresql/jdbc/EscapedFunctions.java:310
+#: org/postgresql/jdbc/EscapedFunctions.java:391
#, java-format
-msgid "The SSLSocketFactory class provided {0} could not be instantiated."
-msgstr "SSLSocketFactory {0} ile örneklenmedi."
+msgid "{0} function takes two or three arguments."
+msgstr "{0} fonksiyonu yalnız iki veya üç argüman alabilir."
-#: org/postgresql/ssl/MakeSSL.java:67
+#: org/postgresql/jdbc/EscapedFunctions.java:416
+#: org/postgresql/jdbc/EscapedFunctions.java:431
+#: org/postgresql/jdbc/EscapedFunctions.java:734
+#: org/postgresql/jdbc/EscapedFunctions.java:764
#, java-format
-msgid "SSL error: {0}"
-msgstr ""
-
-#: org/postgresql/ssl/MakeSSL.java:78
-#, fuzzy, java-format
-msgid "The HostnameVerifier class provided {0} could not be instantiated."
-msgstr "SSLSocketFactory {0} ile örneklenmedi."
+msgid "{0} function doesn''t take any argument."
+msgstr "{0} fonksiyonu parametre almaz."
-#: org/postgresql/ssl/MakeSSL.java:84
+#: org/postgresql/jdbc/EscapedFunctions.java:627
+#: org/postgresql/jdbc/EscapedFunctions.java:680
#, java-format
-msgid "The hostname {0} could not be verified by hostnameverifier {1}."
-msgstr ""
+msgid "{0} function takes three and only three arguments."
+msgstr "{0} fonksiyonunu sadece üç parametre alabilir."
-#: org/postgresql/ssl/MakeSSL.java:93
+#: org/postgresql/jdbc/EscapedFunctions.java:640
+#: org/postgresql/jdbc/EscapedFunctions.java:661
+#: org/postgresql/jdbc/EscapedFunctions.java:664
+#: org/postgresql/jdbc/EscapedFunctions.java:697
+#: org/postgresql/jdbc/EscapedFunctions.java:710
+#: org/postgresql/jdbc/EscapedFunctions.java:713
#, java-format
-msgid "The hostname {0} could not be verified."
-msgstr ""
+msgid "Interval {0} not yet implemented"
+msgstr "{0} aralığı henüz kodlanmadı."
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:167
-msgid "The sslfactoryarg property may not be empty."
+#: org/postgresql/PGProperty.java:535 org/postgresql/PGProperty.java:555
+#, java-format
+msgid "{0} parameter value must be an integer but was: {1}"
msgstr ""
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:183
-msgid ""
-"The environment variable containing the server's SSL certificate must not be "
-"empty."
-msgstr ""
+#: org/postgresql/largeobject/LargeObjectManager.java:144
+msgid "Failed to initialize LargeObject API"
+msgstr "LArgeObject API ilklendirme hatası"
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:191
-msgid ""
-"The system property containing the server's SSL certificate must not be "
-"empty."
-msgstr ""
+#: org/postgresql/largeobject/LargeObjectManager.java:262
+#: org/postgresql/largeobject/LargeObjectManager.java:305
+msgid "Large Objects may not be used in auto-commit mode."
+msgstr "Auto-commit biçimde large object kullanılamaz."
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:198
-msgid ""
-"The sslfactoryarg property must start with the prefix file:, classpath:, "
-"env:, sys:, or -----BEGIN CERTIFICATE-----."
+#: org/postgresql/copy/PGCopyInputStream.java:51
+#, java-format
+msgid "Copying from database failed: {0}"
msgstr ""
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:210
+#: org/postgresql/copy/PGCopyInputStream.java:67
+#: org/postgresql/copy/PGCopyOutputStream.java:94
#, fuzzy
-msgid "An error occurred reading the certificate"
-msgstr "SSL bağlantısı ayarlanırken bir hata oluştu."
+msgid "This copy stream is closed."
+msgstr "ResultSet kapalıdır."
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:243
-msgid "No X509TrustManager found"
+#: org/postgresql/copy/PGCopyInputStream.java:110
+msgid "Read from copy failed."
msgstr ""
-#: org/postgresql/util/PGInterval.java:155
-msgid "Conversion of interval failed"
-msgstr "Interval dönüştürmesi başarısız."
-
-#: org/postgresql/util/PGmoney.java:65
-msgid "Conversion of money failed."
-msgstr "Money dönüştürmesi başarısız."
-
-#: org/postgresql/util/ServerErrorMessage.java:165
-#, java-format
-msgid "Detail: {0}"
-msgstr "Ayrıntı: {0}"
-
-#: org/postgresql/util/ServerErrorMessage.java:170
+#: org/postgresql/copy/CopyManager.java:53
#, java-format
-msgid "Hint: {0}"
-msgstr "İpucu: {0}"
-
-#: org/postgresql/util/ServerErrorMessage.java:174
-#, java-format
-msgid "Position: {0}"
-msgstr "Position: {0}"
+msgid "Requested CopyIn but got {0}"
+msgstr ""
-#: org/postgresql/util/ServerErrorMessage.java:178
+#: org/postgresql/copy/CopyManager.java:64
#, java-format
-msgid "Where: {0}"
-msgstr "Where: {0}"
+msgid "Requested CopyOut but got {0}"
+msgstr ""
-#: org/postgresql/util/ServerErrorMessage.java:184
+#: org/postgresql/copy/CopyManager.java:75
#, java-format
-msgid "Internal Query: {0}"
-msgstr "Internal Query: {0}"
+msgid "Requested CopyDual but got {0}"
+msgstr ""
-#: org/postgresql/util/ServerErrorMessage.java:188
+#: org/postgresql/copy/PGCopyOutputStream.java:71
#, java-format
-msgid "Internal Position: {0}"
-msgstr "Internal Position: {0}"
+msgid "Cannot write to copy a byte of value {0}"
+msgstr ""
-#: org/postgresql/util/ServerErrorMessage.java:195
-#, java-format
-msgid "Location: File: {0}, Routine: {1}, Line: {2}"
-msgstr "Yer: Dosya: {0}, Yordam: {1}, Satır: {2}"
+#: org/postgresql/fastpath/Fastpath.java:80
+#, fuzzy, java-format
+msgid "Fastpath call {0} - No result was returned and we expected a numeric."
+msgstr "Fastpath call {0} - Integer beklenirken hiçbir sonuç getirilmedi."
-#: org/postgresql/util/ServerErrorMessage.java:200
+#: org/postgresql/fastpath/Fastpath.java:157
#, java-format
-msgid "Server SQLState: {0}"
-msgstr "Sunucu SQLState: {0}"
+msgid "Fastpath call {0} - No result was returned and we expected an integer."
+msgstr "Fastpath call {0} - Integer beklenirken hiçbir sonuç getirilmedi."
-#: org/postgresql/xa/PGXAConnection.java:148
+#: org/postgresql/fastpath/Fastpath.java:165
+#, fuzzy, java-format
msgid ""
-"Transaction control methods setAutoCommit(true), commit, rollback and "
-"setSavePoint not allowed while an XA transaction is active."
-msgstr ""
-
-#: org/postgresql/xa/PGXAConnection.java:196
-#: org/postgresql/xa/PGXAConnection.java:265
-msgid "Invalid flags"
-msgstr "Geçersiz seçenekler"
-
-#: org/postgresql/xa/PGXAConnection.java:200
-#: org/postgresql/xa/PGXAConnection.java:269
-#: org/postgresql/xa/PGXAConnection.java:437
-msgid "xid must not be null"
-msgstr "xid null olamaz"
-
-#: org/postgresql/xa/PGXAConnection.java:204
-msgid "Connection is busy with another transaction"
-msgstr "Bağlantı, başka bir transaction tarafından meşgul ediliyor"
-
-#: org/postgresql/xa/PGXAConnection.java:213
-#: org/postgresql/xa/PGXAConnection.java:279
-msgid "suspend/resume not implemented"
-msgstr "suspend/resume desteklenmiyor"
-
-#: org/postgresql/xa/PGXAConnection.java:219
-#: org/postgresql/xa/PGXAConnection.java:224
-#: org/postgresql/xa/PGXAConnection.java:228
-msgid "Transaction interleaving not implemented"
-msgstr "Transaction interleaving desteklenmiyor."
-
-#: org/postgresql/xa/PGXAConnection.java:239
-msgid "Error disabling autocommit"
-msgstr "autocommit'i devre dışı bırakma sırasında hata"
+"Fastpath call {0} - No result was returned or wrong size while expecting an "
+"integer."
+msgstr "Fastpath call {0} - Integer beklenirken hiçbir sonuç getirilmedi."
-#: org/postgresql/xa/PGXAConnection.java:273
-msgid "tried to call end without corresponding start call"
-msgstr "start çağırımı olmadan end çağırılmıştır"
+#: org/postgresql/fastpath/Fastpath.java:182
+#, fuzzy, java-format
+msgid "Fastpath call {0} - No result was returned and we expected a long."
+msgstr "Fastpath call {0} - Integer beklenirken hiçbir sonuç getirilmedi."
-#: org/postgresql/xa/PGXAConnection.java:305
+#: org/postgresql/fastpath/Fastpath.java:190
+#, fuzzy, java-format
msgid ""
-"Not implemented: Prepare must be issued using the same connection that "
-"started the transaction"
-msgstr ""
-"Desteklenmiyor: Prepare, transaction başlatran bağlantı tarafından "
-"çağırmalıdır"
-
-#: org/postgresql/xa/PGXAConnection.java:309
-msgid "Prepare called before end"
-msgstr "Sondan önce prepare çağırılmış"
+"Fastpath call {0} - No result was returned or wrong size while expecting a "
+"long."
+msgstr "Fastpath call {0} - Integer beklenirken hiçbir sonuç getirilmedi."
-#: org/postgresql/xa/PGXAConnection.java:317
-msgid "Server versions prior to 8.1 do not support two-phase commit."
-msgstr ""
-"Sunucunun 8.1''den önceki sürümler two-phase commit desteklememektedir."
+#: org/postgresql/fastpath/Fastpath.java:302
+#, java-format
+msgid "The fastpath function {0} is unknown."
+msgstr "{0} fastpath fonksiyonu bilinmemektedir."
-#: org/postgresql/xa/PGXAConnection.java:334
-msgid "Error preparing transaction"
-msgstr "Transaction hazırlama hatası"
+#~ msgid ""
+#~ "Connection refused. Check that the hostname and port are correct and that "
+#~ "the postmaster is accepting TCP/IP connections."
+#~ msgstr ""
+#~ "Bağlantı reddedildi. Sunucu adı ve portun doğru olup olmadığını ve "
+#~ "postmaster''in TCP/IP bağlantılarını kabul edip etmediğini kontrol ediniz."
-#: org/postgresql/xa/PGXAConnection.java:349
-msgid "Invalid flag"
-msgstr "Geçersiz seçenek"
+#, fuzzy
+#~ msgid "The connection url is invalid."
+#~ msgstr "Bağlantı denemesi başarısız oldu."
-#: org/postgresql/xa/PGXAConnection.java:384
-msgid "Error during recover"
-msgstr "Kurtarma sırasında hata"
+#~ msgid "Connection rejected: {0}."
+#~ msgstr "Bağlantı reddedildi {0}"
-#: org/postgresql/xa/PGXAConnection.java:423
-#: org/postgresql/xa/PGXAConnection.java:426
-msgid "Error rolling back prepared transaction"
-msgstr "Hazırlanmış transaction rollback hatası"
+#~ msgid "Backend start-up failed: {0}."
+#~ msgstr "Backend başlaması başarısız oldu: {0}"
-#: org/postgresql/xa/PGXAConnection.java:464
-msgid ""
-"Not implemented: one-phase commit must be issued using the same connection "
-"that was used to start it"
-msgstr ""
-"Desteklenmiyor: one-phase commit, işlevinde başlatan ve bitiren bağlantı "
-"aynı olmalıdır"
+#~ msgid "Server versions prior to 8.0 do not support savepoints."
+#~ msgstr "Sunucunun 8.0''dan önceki sürümler savepoint desteklememektedir."
-#: org/postgresql/xa/PGXAConnection.java:468
-msgid "commit called before end"
-msgstr "commit, sondan önce çağırıldı"
+#~ msgid "Unexpected error while decoding character data from a large object."
+#~ msgstr "Large-object nesnesinden karakter veriyi çözerken beklenmeyen hata."
-#: org/postgresql/xa/PGXAConnection.java:478
-msgid "Error during one-phase commit"
-msgstr "One-phase commit sırasında hata"
+#~ msgid ""
+#~ "Returning autogenerated keys is only supported for 8.2 and later servers."
+#~ msgstr ""
+#~ "Otomatik üretilen anahtarların döndürülmesi sadece 8.2 ve üzerindeki "
+#~ "sürümlerdeki sunucularda desteklenmektedir."
-#: org/postgresql/xa/PGXAConnection.java:497
-msgid ""
-"Not implemented: 2nd phase commit must be issued using an idle connection"
-msgstr "Desteklenmiyor: 2nd phase commit, atıl bir bağlantıdan başlatılmalıdır"
+#~ msgid ""
+#~ "Infinite value found for timestamp/date. This cannot be represented as "
+#~ "time."
+#~ msgstr ""
+#~ "Timestamp veri tipinde sonsuz değer bulunmuştur. Buna uygun bir gösterim "
+#~ "yoktur."
-#: org/postgresql/xa/PGXAConnection.java:513
-#, fuzzy
-msgid "Error committing prepared transaction"
-msgstr "Hazırlanmış transaction rollback hatası"
+#~ msgid "Server versions prior to 8.1 do not support two-phase commit."
+#~ msgstr ""
+#~ "Sunucunun 8.1''den önceki sürümler two-phase commit desteklememektedir."
-#: org/postgresql/xa/PGXAConnection.java:529
-msgid "Heuristic commit/rollback not supported"
-msgstr "Heuristic commit/rollback desteklenmiyor"
+#~ msgid "Invalid flag"
+#~ msgstr "Geçersiz seçenek"
#~ msgid "The class {0} does not implement org.postgresql.util.PGobject."
#~ msgstr "{0} sınıfı org.postgresql.util.PGobject implemente etmiyor."
diff --git a/pgjdbc/src/main/java/org/postgresql/translation/zh_CN.po b/pgjdbc/src/main/java/org/postgresql/translation/zh_CN.po
index 0153fff..09ecda8 100644
--- a/pgjdbc/src/main/java/org/postgresql/translation/zh_CN.po
+++ b/pgjdbc/src/main/java/org/postgresql/translation/zh_CN.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PostgreSQL JDBC Driver 8.3\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-01-07 13:37+0300\n"
+"POT-Creation-Date: 2018-03-10 23:24+0300\n"
"PO-Revision-Date: 2008-01-31 14:34+0800\n"
"Last-Translator: 郭朝益(ChaoYi, Kuo) <Kuo.ChaoYi at gmail.com>\n"
"Language-Team: The PostgreSQL Development Team <Kuo.ChaoYi at gmail.com>\n"
@@ -18,382 +18,375 @@ msgstr ""
"X-Poedit-Country: CHINA\n"
"X-Poedit-SourceCharset: utf-8\n"
-#: org/postgresql/copy/CopyManager.java:57
-#, java-format
-msgid "Requested CopyIn but got {0}"
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:164
+msgid "The sslfactoryarg property may not be empty."
msgstr ""
-#: org/postgresql/copy/CopyManager.java:69
-#, java-format
-msgid "Requested CopyOut but got {0}"
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:180
+msgid ""
+"The environment variable containing the server's SSL certificate must not be "
+"empty."
msgstr ""
-#: org/postgresql/copy/PGCopyInputStream.java:54
-#, java-format
-msgid "Copying from database failed: {0}"
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:188
+msgid ""
+"The system property containing the server's SSL certificate must not be "
+"empty."
+msgstr ""
+
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:195
+msgid ""
+"The sslfactoryarg property must start with the prefix file:, classpath:, "
+"env:, sys:, or -----BEGIN CERTIFICATE-----."
msgstr ""
-#: org/postgresql/copy/PGCopyInputStream.java:70
-#: org/postgresql/copy/PGCopyOutputStream.java:97
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:207
#, fuzzy
-msgid "This copy stream is closed."
-msgstr "这个 ResultSet 已经被关闭。"
+msgid "An error occurred reading the certificate"
+msgstr "进行 SSL 连线时发生错误。"
-#: org/postgresql/copy/PGCopyInputStream.java:113
-msgid "Read from copy failed."
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:240
+msgid "No X509TrustManager found"
msgstr ""
-#: org/postgresql/copy/PGCopyOutputStream.java:74
-#, java-format
-msgid "Cannot write to copy a byte of value {0}"
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:133
+msgid ""
+"Could not find a java cryptographic algorithm: X.509 CertificateFactory not "
+"available."
msgstr ""
-#: org/postgresql/core/ConnectionFactory.java:74
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:143
#, java-format
-msgid "A connection could not be made using the requested protocol {0}."
-msgstr "无法以要求的通讯协定 {0} 建立连线。"
+msgid "Could not open SSL certificate file {0}."
+msgstr ""
-#: org/postgresql/core/Oid.java:114
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:148
#, java-format
-msgid "oid type {0} not known and not a number"
+msgid "Loading the SSL certificate {0} into a KeyManager failed."
msgstr ""
-#: org/postgresql/core/Parser.java:616
-#, java-format
-msgid "Malformed function or procedure escape syntax at offset {0}."
-msgstr "不正确的函式或程序 escape 语法于 {0}。"
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:205
+msgid "Enter SSL password: "
+msgstr ""
-#: org/postgresql/core/PGStream.java:497
-#, java-format
-msgid "Premature end of input stream, expected {0} bytes, but only read {1}."
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:212
+msgid "Could not read password for SSL key file, console is not available."
msgstr ""
-#: org/postgresql/core/PGStream.java:538
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:217
#, java-format
-msgid "Expected an EOF from server, got: {0}"
+msgid "Could not read password for SSL key file by callbackhandler {0}."
msgstr ""
-#: org/postgresql/core/SetupQueryRunner.java:90
-msgid "An unexpected result was returned by a query."
-msgstr "传回非预期的查询结果。"
-
-#: org/postgresql/core/UTF8Encoding.java:31
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:236
#, java-format
-msgid ""
-"Illegal UTF-8 sequence: byte {0} of {1} byte sequence is not 10xxxxxx: {2}"
+msgid "Could not decrypt SSL key file {0}."
msgstr ""
-#: org/postgresql/core/UTF8Encoding.java:69
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:250
#, java-format
-msgid "Illegal UTF-8 sequence: {0} bytes used to encode a {1} byte value: {2}"
+msgid "Could not read SSL key file {0}."
msgstr ""
-#: org/postgresql/core/UTF8Encoding.java:104
-#: org/postgresql/core/UTF8Encoding.java:131
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:253
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:176
#, java-format
-msgid "Illegal UTF-8 sequence: initial byte is {0}: {1}"
+msgid "Could not find a java cryptographic algorithm: {0}."
msgstr ""
-#: org/postgresql/core/UTF8Encoding.java:137
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:99
#, java-format
-msgid "Illegal UTF-8 sequence: final value is out of range: {0}"
+msgid "The password callback class provided {0} could not be instantiated."
msgstr ""
-#: org/postgresql/core/UTF8Encoding.java:153
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:132
#, java-format
-msgid "Illegal UTF-8 sequence: final value is a surrogate value: {0}"
+msgid "Could not open SSL root certificate file {0}."
msgstr ""
-#: org/postgresql/core/Utils.java:119 org/postgresql/core/Utils.java:136
-msgid "Zero bytes may not occur in string parameters."
-msgstr "字符参数不能有 0 个位元组。"
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:147
+#, java-format
+msgid "Could not read SSL root certificate file {0}."
+msgstr ""
-#: org/postgresql/core/Utils.java:146 org/postgresql/core/Utils.java:217
-msgid "No IOException expected from StringBuffer or StringBuilder"
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:151
+#, java-format
+msgid "Loading the SSL root certificate {0} into a TrustManager failed."
msgstr ""
-#: org/postgresql/core/Utils.java:206
-msgid "Zero bytes may not occur in identifiers."
-msgstr "在标识识别符中不存在零位元组。"
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:170
+msgid "Could not initialize SSL context."
+msgstr ""
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:72
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:87
-#, fuzzy, java-format
-msgid "Invalid sslmode value: {0}"
-msgstr "无效的串流长度 {0}."
+#: org/postgresql/ssl/MakeSSL.java:52
+#, java-format
+msgid "The SSLSocketFactory class provided {0} could not be instantiated."
+msgstr ""
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:87
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:111
-#, fuzzy, java-format
-msgid "Invalid targetServerType value: {0}"
-msgstr "无效的串流长度 {0}."
+#: org/postgresql/ssl/MakeSSL.java:67
+#, java-format
+msgid "SSL error: {0}"
+msgstr ""
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:152
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:228
+#: org/postgresql/ssl/MakeSSL.java:78
#, java-format
-msgid "Could not find a server with specified targetServerType: {0}"
+msgid "The HostnameVerifier class provided {0} could not be instantiated."
msgstr ""
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:172
-msgid ""
-"Connection refused. Check that the hostname and port are correct and that "
-"the postmaster is accepting TCP/IP connections."
+#: org/postgresql/ssl/MakeSSL.java:84
+#, java-format
+msgid "The hostname {0} could not be verified by hostnameverifier {1}."
msgstr ""
-"连线被拒,请检查主机名称和埠号,并确定 postmaster 可以接受 TCP/IP 连线。"
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:181
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:262
-msgid "The connection attempt failed."
-msgstr "尝试连线已失败。"
+#: org/postgresql/ssl/MakeSSL.java:93
+#, java-format
+msgid "The hostname {0} could not be verified."
+msgstr ""
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:192
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:273
-#, fuzzy
-msgid "The connection url is invalid."
-msgstr "尝试连线已失败。"
+#: org/postgresql/gss/GssAction.java:126
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2550
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2581
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2585
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2640
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2650
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2659
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:655
+msgid "Protocol error. Session setup failed."
+msgstr "通讯协定错误,Session 初始化失败。"
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:218
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:233
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:324
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:339
-msgid "The server does not support SSL."
-msgstr "服务器不支援 SSL 连线。"
+#: org/postgresql/gss/GssAction.java:137 org/postgresql/gss/MakeGSS.java:66
+#: org/postgresql/gss/MakeGSS.java:74
+msgid "GSS Authentication failed"
+msgstr ""
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:249
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:355
-msgid "An error occurred while setting up the SSL connection."
-msgstr "进行 SSL 连线时发生错误。"
+#: org/postgresql/core/Parser.java:933
+#, java-format
+msgid "Malformed function or procedure escape syntax at offset {0}."
+msgstr "不正确的函式或程序 escape 语法于 {0}。"
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:300
+#: org/postgresql/core/SocketFactoryFactory.java:41
#, java-format
-msgid "Connection rejected: {0}."
-msgstr "连线已被拒绝:{0}。"
+msgid "The SocketFactory class provided {0} could not be instantiated."
+msgstr ""
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:321
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:349
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:375
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:456
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:486
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:515
-msgid ""
-"The server requested password-based authentication, but no password was "
-"provided."
-msgstr "服务器要求使用密码验证,但是密码并未提供。"
+#: org/postgresql/core/Utils.java:93 org/postgresql/core/Utils.java:110
+msgid "Zero bytes may not occur in string parameters."
+msgstr "字符参数不能有 0 个位元组。"
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:405
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:625
-#, java-format
-msgid ""
-"The authentication type {0} is not supported. Check that you have configured "
-"the pg_hba.conf file to include the client''s IP address or subnet, and that "
-"it is using an authentication scheme supported by the driver."
+#: org/postgresql/core/Utils.java:120 org/postgresql/core/Utils.java:170
+msgid "No IOException expected from StringBuffer or StringBuilder"
msgstr ""
-"不支援 {0} 验证类型。请核对您已经组态 pg_hba.conf 文件包含客户端的IP位址或网"
-"路区段,以及驱动程序所支援的验证架构模式已被支援。"
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:412
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:455
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:632
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:688
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:744
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:754
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:763
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:774
-#: org/postgresql/gss/GssAction.java:130
-msgid "Protocol error. Session setup failed."
-msgstr "通讯协定错误,Session 初始化失败。"
+#: org/postgresql/core/Utils.java:159
+msgid "Zero bytes may not occur in identifiers."
+msgstr "在标识识别符中不存在零位元组。"
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:443
-#, java-format
-msgid "Backend start-up failed: {0}."
-msgstr "后端启动失败:{0}。"
-
-#: org/postgresql/core/v2/FastpathParameterList.java:63
-#: org/postgresql/core/v2/FastpathParameterList.java:89
-#: org/postgresql/core/v2/FastpathParameterList.java:100
-#: org/postgresql/core/v2/FastpathParameterList.java:111
-#: org/postgresql/core/v2/SimpleParameterList.java:70
-#: org/postgresql/core/v2/SimpleParameterList.java:94
-#: org/postgresql/core/v2/SimpleParameterList.java:105
-#: org/postgresql/core/v2/SimpleParameterList.java:116
-#: org/postgresql/core/v2/SimpleParameterList.java:127
-#: org/postgresql/core/v3/CompositeParameterList.java:36
-#: org/postgresql/core/v3/SimpleParameterList.java:53
-#: org/postgresql/core/v3/SimpleParameterList.java:64
-#: org/postgresql/jdbc/PgResultSet.java:2715
-#: org/postgresql/jdbc/PgResultSetMetaData.java:472
+#: org/postgresql/core/UTF8Encoding.java:28
#, java-format
-msgid "The column index is out of range: {0}, number of columns: {1}."
-msgstr "栏位索引超过许可范围:{0},栏位数:{1}。"
+msgid ""
+"Illegal UTF-8 sequence: byte {0} of {1} byte sequence is not 10xxxxxx: {2}"
+msgstr ""
-#: org/postgresql/core/v2/FastpathParameterList.java:164
-#: org/postgresql/core/v2/SimpleParameterList.java:191
-#: org/postgresql/core/v3/SimpleParameterList.java:225
+#: org/postgresql/core/UTF8Encoding.java:66
#, java-format
-msgid "No value specified for parameter {0}."
-msgstr "未设定参数值 {0} 的内容。"
+msgid "Illegal UTF-8 sequence: {0} bytes used to encode a {1} byte value: {2}"
+msgstr ""
-#: org/postgresql/core/v2/QueryExecutorImpl.java:87
-#: org/postgresql/core/v2/QueryExecutorImpl.java:347
-#: org/postgresql/core/v3/QueryExecutorImpl.java:404
-#: org/postgresql/core/v3/QueryExecutorImpl.java:465
+#: org/postgresql/core/UTF8Encoding.java:102
+#: org/postgresql/core/UTF8Encoding.java:129
#, java-format
-msgid "Expected command status BEGIN, got {0}."
+msgid "Illegal UTF-8 sequence: initial byte is {0}: {1}"
msgstr ""
-#: org/postgresql/core/v2/QueryExecutorImpl.java:92
-#: org/postgresql/core/v3/QueryExecutorImpl.java:470
-#: org/postgresql/jdbc/PgResultSet.java:1731
+#: org/postgresql/core/UTF8Encoding.java:135
#, java-format
-msgid "Unexpected command status: {0}."
+msgid "Illegal UTF-8 sequence: final value is out of range: {0}"
msgstr ""
-#: org/postgresql/core/v2/QueryExecutorImpl.java:127
-#: org/postgresql/core/v2/QueryExecutorImpl.java:136
-#: org/postgresql/core/v2/QueryExecutorImpl.java:185
-#: org/postgresql/core/v2/QueryExecutorImpl.java:376
-#: org/postgresql/core/v3/QueryExecutorImpl.java:226
-#: org/postgresql/core/v3/QueryExecutorImpl.java:364
-#: org/postgresql/core/v3/QueryExecutorImpl.java:441
-#: org/postgresql/core/v3/QueryExecutorImpl.java:505
-#: org/postgresql/core/v3/QueryExecutorImpl.java:587
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2211
-#: org/postgresql/util/StreamWrapper.java:133
-#, fuzzy
-msgid "An I/O error occurred while sending to the backend."
-msgstr "传送数据至后端时发生 I/O 错误。"
-
-#: org/postgresql/core/v2/QueryExecutorImpl.java:180
-#: org/postgresql/core/v2/QueryExecutorImpl.java:235
-#: org/postgresql/core/v2/QueryExecutorImpl.java:249
-#: org/postgresql/core/v3/QueryExecutorImpl.java:582
-#: org/postgresql/core/v3/QueryExecutorImpl.java:642
+#: org/postgresql/core/UTF8Encoding.java:151
#, java-format
-msgid "Unknown Response Type {0}."
-msgstr "不明的回应类型 {0}。"
-
-#: org/postgresql/core/v2/QueryExecutorImpl.java:453
-#: org/postgresql/core/v2/QueryExecutorImpl.java:503
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1962
-msgid "Ran out of memory retrieving query results."
+msgid "Illegal UTF-8 sequence: final value is a surrogate value: {0}"
msgstr ""
-#: org/postgresql/core/v2/QueryExecutorImpl.java:640
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2328
-#, java-format
-msgid "Unable to interpret the update count in command completion tag: {0}."
-msgstr "无法解读命令完成标签中的更新计数:{0}。"
+#: org/postgresql/core/SetupQueryRunner.java:64
+msgid "An unexpected result was returned by a query."
+msgstr "传回非预期的查询结果。"
-#: org/postgresql/core/v2/QueryExecutorImpl.java:654
-msgid "Copy not implemented for protocol version 2"
+#: org/postgresql/core/PGStream.java:486
+#, java-format
+msgid "Premature end of input stream, expected {0} bytes, but only read {1}."
msgstr ""
-#: org/postgresql/core/v2/SocketFactoryFactory.java:36
+#: org/postgresql/core/PGStream.java:528
#, java-format
-msgid "The SocketFactory class provided {0} could not be instantiated."
+msgid "Expected an EOF from server, got: {0}"
msgstr ""
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:253
-#, fuzzy, java-format
-msgid ""
-"Connection to {0} refused. Check that the hostname and port are correct and "
-"that the postmaster is accepting TCP/IP connections."
+#: org/postgresql/core/v3/CopyOperationImpl.java:54
+msgid "CommandComplete expected COPY but got: "
msgstr ""
-"连线被拒,请检查主机名称和埠号,并确定 postmaster 可以接受 TCP/IP 连线。"
-#: org/postgresql/core/v3/CopyOperationImpl.java:57
-msgid "CommandComplete expected COPY but got: "
+#: org/postgresql/core/v3/CopyInImpl.java:47
+msgid "CopyIn copy direction can't receive data"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:83
+#: org/postgresql/core/v3/QueryExecutorImpl.java:161
msgid "Tried to obtain lock while already holding it"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:98
+#: org/postgresql/core/v3/QueryExecutorImpl.java:177
msgid "Tried to break lock on database connection"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:115
+#: org/postgresql/core/v3/QueryExecutorImpl.java:195
msgid "Interrupted while waiting to obtain lock on database connection"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:220
+#: org/postgresql/core/v3/QueryExecutorImpl.java:327
msgid "Unable to bind parameter values for statement."
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:689
+#: org/postgresql/core/v3/QueryExecutorImpl.java:333
+#: org/postgresql/core/v3/QueryExecutorImpl.java:485
+#: org/postgresql/core/v3/QueryExecutorImpl.java:559
+#: org/postgresql/core/v3/QueryExecutorImpl.java:602
+#: org/postgresql/core/v3/QueryExecutorImpl.java:729
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2372
+#: org/postgresql/util/StreamWrapper.java:130
+#, fuzzy
+msgid "An I/O error occurred while sending to the backend."
+msgstr "传送数据至后端时发生 I/O 错误。"
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:534
+#: org/postgresql/core/v3/QueryExecutorImpl.java:576
+#, java-format
+msgid "Expected command status BEGIN, got {0}."
+msgstr ""
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:581
+#: org/postgresql/jdbc/PgResultSet.java:1778
+#, java-format
+msgid "Unexpected command status: {0}."
+msgstr ""
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:687
+#, fuzzy
+msgid "An error occurred while trying to get the socket timeout."
+msgstr "传送数据至后端时发生 I/O 错误。"
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:722
+#: org/postgresql/core/v3/QueryExecutorImpl.java:798
+#, java-format
+msgid "Unknown Response Type {0}."
+msgstr "不明的回应类型 {0}。"
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:745
+#, fuzzy
+msgid "An error occurred while trying to reset the socket timeout."
+msgstr "传送数据至后端时发生 I/O 错误。"
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:843
msgid "Database connection failed when starting copy"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:724
+#: org/postgresql/core/v3/QueryExecutorImpl.java:878
msgid "Tried to cancel an inactive copy operation"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:765
+#: org/postgresql/core/v3/QueryExecutorImpl.java:917
msgid "Database connection failed when canceling copy operation"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:781
+#: org/postgresql/core/v3/QueryExecutorImpl.java:933
msgid "Missing expected error response to copy cancel request"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:785
+#: org/postgresql/core/v3/QueryExecutorImpl.java:937
#, java-format
msgid "Got {0} error responses to single copy cancel request"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:800
+#: org/postgresql/core/v3/QueryExecutorImpl.java:952
msgid "Tried to end inactive copy"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:815
+#: org/postgresql/core/v3/QueryExecutorImpl.java:967
msgid "Database connection failed when ending copy"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:833
-#: org/postgresql/core/v3/QueryExecutorImpl.java:855
+#: org/postgresql/core/v3/QueryExecutorImpl.java:985
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1005
msgid "Tried to write to an inactive copy operation"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:848
-#: org/postgresql/core/v3/QueryExecutorImpl.java:863
+#: org/postgresql/core/v3/QueryExecutorImpl.java:998
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1013
msgid "Database connection failed when writing to copy"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:877
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1028
msgid "Tried to read from inactive copy"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:884
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1035
msgid "Database connection failed when reading from copy"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:956
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1101
#, java-format
msgid "Received CommandComplete ''{0}'' without an active copy operation"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:983
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1126
#, java-format
msgid "Got CopyInResponse from server during an active {0}"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:999
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1140
#, java-format
msgid "Got CopyOutResponse from server during an active {0}"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1017
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1154
+#, java-format
+msgid "Got CopyBothResponse from server during an active {0}"
+msgstr ""
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1170
msgid "Got CopyData without an active copy operation"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1021
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1174
#, java-format
msgid "Unexpected copydata from server for {0}"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1061
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2037
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1234
+#, java-format
+msgid "Unexpected packet type during copy: {0}"
+msgstr ""
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1524
+#, java-format
+msgid ""
+"Bind message length {0} too long. This can be caused by very large or "
+"incorrect length specifications on InputStream parameters."
+msgstr ""
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2145
+msgid "Ran out of memory retrieving query results."
+msgstr ""
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2313
+msgid "The driver currently does not support COPY operations."
+msgstr "驱动程序目前不支援 COPY 操作。"
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2487
+#, fuzzy, java-format
+msgid "Unable to parse the count in command completion tag: {0}."
+msgstr "无法解读命令完成标签中的更新计数:{0}。"
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2603
#, fuzzy, java-format
msgid ""
"The server''s client_encoding parameter was changed to {0}. The JDBC driver "
@@ -402,8 +395,7 @@ msgstr ""
"这服务器的 client_encoding 参数被改成 {0},JDBC 驱动程序请求需要 "
"client_encoding 为 UNICODE 以正确工作。"
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1069
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2045
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2611
#, java-format
msgid ""
"The server''s DateStyle parameter was changed to {0}. The JDBC driver "
@@ -412,8 +404,7 @@ msgstr ""
"这服务器的 DateStyle 参数被更改成 {0},JDBC 驱动程序请求需要 DateStyle 以 "
"ISO 开头以正确工作。"
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1083
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2059
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2624
#, java-format
msgid ""
"The server''s standard_conforming_strings parameter was reported as {0}. The "
@@ -422,58 +413,189 @@ msgstr ""
"这服务器的 standard_conforming_strings 参数已回报为 {0},JDBC 驱动程序已预期"
"开启或是关闭。"
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1122
+#: org/postgresql/core/v3/SimpleParameterList.java:54
+#: org/postgresql/core/v3/SimpleParameterList.java:65
+#: org/postgresql/core/v3/CompositeParameterList.java:33
+#: org/postgresql/jdbc/PgResultSetMetaData.java:493
+#: org/postgresql/jdbc/PgResultSet.java:2751
#, java-format
-msgid "Unexpected packet type during copy: {0}"
-msgstr ""
+msgid "The column index is out of range: {0}, number of columns: {1}."
+msgstr "栏位索引超过许可范围:{0},栏位数:{1}。"
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1393
+#: org/postgresql/core/v3/SimpleParameterList.java:257
#, java-format
-msgid ""
-"Bind message length {0} too long. This can be caused by very large or "
-"incorrect length specifications on InputStream parameters."
-msgstr ""
-
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2131
-msgid "The driver currently does not support COPY operations."
-msgstr "驱动程序目前不支援 COPY 操作。"
+msgid "No value specified for parameter {0}."
+msgstr "未设定参数值 {0} 的内容。"
-#: org/postgresql/Driver.java:234
-msgid "Error loading default settings from driverconfig.properties"
-msgstr ""
+#: org/postgresql/core/v3/SimpleParameterList.java:431
+#, fuzzy, java-format
+msgid "Added parameters index out of range: {0}, number of columns: {1}."
+msgstr "参数索引超出许可范围:{0},参数总数:{1}。"
-#: org/postgresql/Driver.java:247
-msgid "Properties for the driver contains a non-string value for the key "
-msgstr ""
+#: org/postgresql/core/v3/replication/V3ReplicationProtocol.java:133
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:257
+msgid "The connection attempt failed."
+msgstr "尝试连线已失败。"
-#: org/postgresql/Driver.java:290
-msgid ""
-"Your security policy has prevented the connection from being attempted. You "
-"probably need to grant the connect java.net.SocketPermission to the database "
-"server host and port that you wish to connect to."
+#: org/postgresql/core/v3/replication/V3PGReplicationStream.java:144
+#, java-format
+msgid "Unexpected packet type during replication: {0}"
msgstr ""
-#: org/postgresql/Driver.java:296 org/postgresql/Driver.java:362
-msgid ""
-"Something unusual has occurred to cause the driver to fail. Please report "
-"this exception."
-msgstr "不明的原因导致驱动程序造成失败,请回报这个例外。"
+#: org/postgresql/core/v3/replication/V3PGReplicationStream.java:269
+#, fuzzy
+msgid "This replication stream has been closed."
+msgstr "Connection 已经被关闭。"
-#: org/postgresql/Driver.java:370
-msgid "Connection attempt timed out."
-msgstr "Connection 尝试逾时。"
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:109
+#, fuzzy, java-format
+msgid "Invalid sslmode value: {0}"
+msgstr "无效的串流长度 {0}."
-#: org/postgresql/Driver.java:383
-msgid "Interrupted while attempting to connect."
-msgstr ""
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:124
+#, fuzzy, java-format
+msgid "Invalid targetServerType value: {0}"
+msgstr "无效的串流长度 {0}."
-#: org/postgresql/Driver.java:645
-#, java-format
-msgid "Method {0} is not yet implemented."
-msgstr "这个 {0} 方法尚未被实作。"
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:246
+#, fuzzy, java-format
+msgid ""
+"Connection to {0} refused. Check that the hostname and port are correct and "
+"that the postmaster is accepting TCP/IP connections."
+msgstr ""
+"连线被拒,请检查主机名称和埠号,并确定 postmaster 可以接受 TCP/IP 连线。"
+
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:272
+#, java-format
+msgid "Could not find a server with specified targetServerType: {0}"
+msgstr ""
+
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:366
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:379
+msgid "The server does not support SSL."
+msgstr "服务器不支援 SSL 连线。"
+
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:393
+msgid "An error occurred while setting up the SSL connection."
+msgstr "进行 SSL 连线时发生错误。"
+
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:494
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:521
+msgid ""
+"The server requested password-based authentication, but no password was "
+"provided."
+msgstr "服务器要求使用密码验证,但是密码并未提供。"
+
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:624
+msgid ""
+"SCRAM authentication is not supported by this driver. You need JDK >= 8 and "
+"pgjdbc >= 42.2.0 (not \".jre\" vesions)"
+msgstr ""
+
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:648
+#, java-format
+msgid ""
+"The authentication type {0} is not supported. Check that you have configured "
+"the pg_hba.conf file to include the client''s IP address or subnet, and that "
+"it is using an authentication scheme supported by the driver."
+msgstr ""
+"不支援 {0} 验证类型。请核对您已经组态 pg_hba.conf 文件包含客户端的IP位址或网"
+"路区段,以及驱动程序所支援的验证架构模式已被支援。"
+
+#: org/postgresql/core/ConnectionFactory.java:57
+#, java-format
+msgid "A connection could not be made using the requested protocol {0}."
+msgstr "无法以要求的通讯协定 {0} 建立连线。"
+
+#: org/postgresql/core/Oid.java:116
+#, java-format
+msgid "oid type {0} not known and not a number"
+msgstr ""
+
+#: org/postgresql/util/HStoreConverter.java:43
+#: org/postgresql/util/HStoreConverter.java:74
+#: org/postgresql/jdbc/PgArray.java:210
+#: org/postgresql/jdbc/PgResultSet.java:1924
+msgid ""
+"Invalid character data was found. This is most likely caused by stored data "
+"containing characters that are invalid for the character set the database "
+"was created in. The most common example of this is storing 8bit data in a "
+"SQL_ASCII database."
+msgstr ""
+"发现不合法的字元,可能的原因是欲储存的数据中包含数据库的字元集不支援的字码,"
+"其中最常见例子的就是将 8 位元数据存入使用 SQL_ASCII 编码的数据库中。"
+
+#: org/postgresql/util/PGmoney.java:62
+msgid "Conversion of money failed."
+msgstr "money 转换失败。"
+
+#: org/postgresql/util/StreamWrapper.java:56
+#: org/postgresql/jdbc/PgPreparedStatement.java:1449
+msgid "Object is too large to send over the protocol."
+msgstr ""
+
+#: org/postgresql/util/PGInterval.java:152
+msgid "Conversion of interval failed"
+msgstr "隔绝(Interval)转换失败。"
+
+#: org/postgresql/util/ServerErrorMessage.java:45
+#, java-format
+msgid ""
+" (pgjdbc: autodetected server-encoding to be {0}, if the message is not "
+"readable, please check database logs and/or host, port, dbname, user, "
+"password, pg_hba.conf)"
+msgstr ""
+
+#: org/postgresql/util/ServerErrorMessage.java:176
+#, java-format
+msgid "Detail: {0}"
+msgstr "详细:{0}"
+
+#: org/postgresql/util/ServerErrorMessage.java:181
+#, java-format
+msgid "Hint: {0}"
+msgstr "建议:{0}"
+
+#: org/postgresql/util/ServerErrorMessage.java:185
+#, java-format
+msgid "Position: {0}"
+msgstr "位置:{0}"
+
+#: org/postgresql/util/ServerErrorMessage.java:189
+#, java-format
+msgid "Where: {0}"
+msgstr "在位置:{0}"
-#: org/postgresql/ds/common/BaseDataSource.java:1037
-#: org/postgresql/ds/common/BaseDataSource.java:1047
+#: org/postgresql/util/ServerErrorMessage.java:195
+#, java-format
+msgid "Internal Query: {0}"
+msgstr "内部查询:{0}"
+
+#: org/postgresql/util/ServerErrorMessage.java:199
+#, java-format
+msgid "Internal Position: {0}"
+msgstr "内部位置:{0}"
+
+#: org/postgresql/util/ServerErrorMessage.java:206
+#, java-format
+msgid "Location: File: {0}, Routine: {1}, Line: {2}"
+msgstr "位置:文件:{0},常式:{1},行:{2}"
+
+#: org/postgresql/util/ServerErrorMessage.java:211
+#, java-format
+msgid "Server SQLState: {0}"
+msgstr "服务器 SQLState:{0}"
+
+#: org/postgresql/ds/PGPoolingDataSource.java:269
+msgid "Failed to setup DataSource."
+msgstr ""
+
+#: org/postgresql/ds/PGPoolingDataSource.java:371
+msgid "DataSource has been closed."
+msgstr "DataSource 已经被关闭。"
+
+#: org/postgresql/ds/common/BaseDataSource.java:1132
+#: org/postgresql/ds/common/BaseDataSource.java:1142
#, fuzzy, java-format
msgid "Unsupported property name: {0}"
msgstr "未被支持的类型值:{0}"
@@ -482,7 +604,7 @@ msgstr "未被支持的类型值:{0}"
msgid "This PooledConnection has already been closed."
msgstr "这个 PooledConnection 已经被关闭。"
-#: org/postgresql/ds/PGPooledConnection.java:313
+#: org/postgresql/ds/PGPooledConnection.java:314
msgid ""
"Connection has been closed automatically because a new connection was opened "
"for the same PooledConnection or the PooledConnection has been closed."
@@ -490,1057 +612,1056 @@ msgstr ""
"Connection 已自动结束,因为一个新的 PooledConnection 连线被开启或者或 "
"PooledConnection 已被关闭。"
-#: org/postgresql/ds/PGPooledConnection.java:314
+#: org/postgresql/ds/PGPooledConnection.java:315
msgid "Connection has been closed."
msgstr "Connection 已经被关闭。"
-#: org/postgresql/ds/PGPooledConnection.java:418
+#: org/postgresql/ds/PGPooledConnection.java:420
msgid "Statement has been closed."
msgstr "Sstatement 已经被关闭。"
-#: org/postgresql/ds/PGPoolingDataSource.java:269
-msgid "Failed to setup DataSource."
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:68
+msgid "No SCRAM mechanism(s) advertised by the server"
msgstr ""
-#: org/postgresql/ds/PGPoolingDataSource.java:371
-msgid "DataSource has been closed."
-msgstr "DataSource 已经被关闭。"
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:81
+msgid "Invalid or unsupported by client SCRAM mechanisms"
+msgstr ""
-#: org/postgresql/fastpath/Fastpath.java:82
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:117
#, fuzzy, java-format
-msgid "Fastpath call {0} - No result was returned and we expected a numeric."
-msgstr "Fastpath 呼叫 {0} - 没有传回值,且应该传回一个整数。"
+msgid "Invalid server-first-message: {0}"
+msgstr "无效的串流长度 {0}."
-#: org/postgresql/fastpath/Fastpath.java:165
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:147
+#, fuzzy, java-format
+msgid "Invalid server-final-message: {0}"
+msgstr "无效的串流长度 {0}."
+
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:153
#, java-format
-msgid "Fastpath call {0} - No result was returned and we expected an integer."
-msgstr "Fastpath 呼叫 {0} - 没有传回值,且应该传回一个整数。"
+msgid "SCRAM authentication failed, server returned error: {0}"
+msgstr ""
-#: org/postgresql/fastpath/Fastpath.java:174
-#, fuzzy, java-format
-msgid ""
-"Fastpath call {0} - No result was returned or wrong size while expecting an "
-"integer."
-msgstr "Fastpath 呼叫 {0} - 没有传回值,且应该传回一个整数。"
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:160
+msgid "Invalid server SCRAM signature"
+msgstr ""
-#: org/postgresql/fastpath/Fastpath.java:191
+#: org/postgresql/osgi/PGDataSourceFactory.java:82
#, fuzzy, java-format
-msgid "Fastpath call {0} - No result was returned and we expected a long."
-msgstr "Fastpath 呼叫 {0} - 没有传回值,且应该传回一个整数。"
+msgid "Unsupported properties: {0}"
+msgstr "未被支持的类型值:{0}"
-#: org/postgresql/fastpath/Fastpath.java:200
-#, fuzzy, java-format
+#: org/postgresql/Driver.java:214
+msgid "Error loading default settings from driverconfig.properties"
+msgstr ""
+
+#: org/postgresql/Driver.java:226
+msgid "Properties for the driver contains a non-string value for the key "
+msgstr ""
+
+#: org/postgresql/Driver.java:270
msgid ""
-"Fastpath call {0} - No result was returned or wrong size while expecting a "
-"long."
-msgstr "Fastpath 呼叫 {0} - 没有传回值,且应该传回一个整数。"
+"Your security policy has prevented the connection from being attempted. You "
+"probably need to grant the connect java.net.SocketPermission to the database "
+"server host and port that you wish to connect to."
+msgstr ""
-#: org/postgresql/fastpath/Fastpath.java:312
+#: org/postgresql/Driver.java:276 org/postgresql/Driver.java:408
+msgid ""
+"Something unusual has occurred to cause the driver to fail. Please report "
+"this exception."
+msgstr "不明的原因导致驱动程序造成失败,请回报这个例外。"
+
+#: org/postgresql/Driver.java:416
+msgid "Connection attempt timed out."
+msgstr "Connection 尝试逾时。"
+
+#: org/postgresql/Driver.java:429
+msgid "Interrupted while attempting to connect."
+msgstr ""
+
+#: org/postgresql/Driver.java:682
#, java-format
-msgid "The fastpath function {0} is unknown."
-msgstr "不明的 fastpath 函式 {0}。"
+msgid "Method {0} is not yet implemented."
+msgstr "这个 {0} 方法尚未被实作。"
-#: org/postgresql/geometric/PGbox.java:79
-#: org/postgresql/geometric/PGcircle.java:76
-#: org/postgresql/geometric/PGcircle.java:84
-#: org/postgresql/geometric/PGline.java:109
-#: org/postgresql/geometric/PGline.java:118
-#: org/postgresql/geometric/PGlseg.java:72
-#: org/postgresql/geometric/PGpoint.java:78
+#: org/postgresql/geometric/PGlseg.java:70
+#: org/postgresql/geometric/PGline.java:107
+#: org/postgresql/geometric/PGline.java:116
+#: org/postgresql/geometric/PGcircle.java:74
+#: org/postgresql/geometric/PGcircle.java:82
+#: org/postgresql/geometric/PGpoint.java:76
+#: org/postgresql/geometric/PGbox.java:77
#, java-format
msgid "Conversion to type {0} failed: {1}."
msgstr "转换类型 {0} 失败:{1}。"
-#: org/postgresql/geometric/PGpath.java:73
+#: org/postgresql/geometric/PGpath.java:70
#, java-format
msgid "Cannot tell if path is open or closed: {0}."
msgstr "无法得知 path 是开启或关闭:{0}。"
-#: org/postgresql/gss/GssAction.java:141 org/postgresql/gss/MakeGSS.java:69
-#: org/postgresql/gss/MakeGSS.java:77
-msgid "GSS Authentication failed"
+#: org/postgresql/xa/PGXAConnection.java:128
+msgid ""
+"Transaction control methods setAutoCommit(true), commit, rollback and "
+"setSavePoint not allowed while an XA transaction is active."
msgstr ""
-#: org/postgresql/jdbc/AbstractBlobClob.java:89
-msgid ""
-"Truncation of large objects is only implemented in 8.3 and later servers."
-msgstr "大型对象的截断(Truncation)仅被实作执行在 8.3 和后来的服务器。"
+#: org/postgresql/xa/PGXAConnection.java:177
+#: org/postgresql/xa/PGXAConnection.java:253
+#: org/postgresql/xa/PGXAConnection.java:347
+#, java-format
+msgid "Invalid flags {0}"
+msgstr "无效的旗标 flags {0}"
-#: org/postgresql/jdbc/AbstractBlobClob.java:94
-msgid "Cannot truncate LOB to a negative length."
+#: org/postgresql/xa/PGXAConnection.java:181
+#: org/postgresql/xa/PGXAConnection.java:257
+#: org/postgresql/xa/PGXAConnection.java:449
+msgid "xid must not be null"
msgstr ""
-#: org/postgresql/jdbc/AbstractBlobClob.java:101
-#: org/postgresql/jdbc/AbstractBlobClob.java:245
+#: org/postgresql/xa/PGXAConnection.java:185
+msgid "Connection is busy with another transaction"
+msgstr ""
+
+#: org/postgresql/xa/PGXAConnection.java:194
+#: org/postgresql/xa/PGXAConnection.java:267
+msgid "suspend/resume not implemented"
+msgstr "暂停(suspend)/再继续(resume)尚未被实作。"
+
+#: org/postgresql/xa/PGXAConnection.java:202
+#: org/postgresql/xa/PGXAConnection.java:209
+#: org/postgresql/xa/PGXAConnection.java:213
#, java-format
-msgid "PostgreSQL LOBs can only index to: {0}"
-msgstr "PostgreSQL LOBs 仅能索引到:{0}"
+msgid ""
+"Invalid protocol state requested. Attempted transaction interleaving is not "
+"supported. xid={0}, currentXid={1}, state={2}, flags={3}"
+msgstr ""
+"事物交易隔绝(Transaction interleaving)未被实作。xid={0}, currentXid={1}, "
+"state={2}, flags={3}"
-#: org/postgresql/jdbc/AbstractBlobClob.java:241
-msgid "LOB positioning offsets start at 1."
+#: org/postgresql/xa/PGXAConnection.java:224
+msgid "Error disabling autocommit"
msgstr ""
-#: org/postgresql/jdbc/AbstractBlobClob.java:257
-msgid "free() was called on this LOB previously"
+#: org/postgresql/xa/PGXAConnection.java:261
+#, java-format
+msgid ""
+"tried to call end without corresponding start call. state={0}, start "
+"xid={1}, currentXid={2}, preparedXid={3}"
msgstr ""
-#: org/postgresql/jdbc/BatchResultHandler.java:41
-#: org/postgresql/jdbc/PgConnection.java:474
-#: org/postgresql/jdbc/PgPreparedStatement.java:138
-#: org/postgresql/jdbc/PgStatement.java:299
-msgid "A result was returned when none was expected."
-msgstr "传回预期之外的结果。"
+#: org/postgresql/xa/PGXAConnection.java:297
+#, java-format
+msgid ""
+"Preparing already prepared transaction, the prepared xid {0}, prepare xid={1}"
+msgstr ""
-#: org/postgresql/jdbc/BatchResultHandler.java:59
-msgid "Too many update results were returned."
+#: org/postgresql/xa/PGXAConnection.java:300
+#, java-format
+msgid "Current connection does not have an associated xid. prepare xid={0}"
msgstr ""
-#: org/postgresql/jdbc/BatchResultHandler.java:88
+#: org/postgresql/xa/PGXAConnection.java:307
#, java-format
msgid ""
-"Batch entry {0} {1} was aborted. Call getNextException to see the cause."
-msgstr "批次处理 {0} {1} 被中止,呼叫 getNextException 以取得原因。"
+"Not implemented: Prepare must be issued using the same connection that "
+"started the transaction. currentXid={0}, prepare xid={1}"
+msgstr ""
-#: org/postgresql/jdbc/EscapedFunctions.java:243
+#: org/postgresql/xa/PGXAConnection.java:311
#, java-format
-msgid "{0} function takes four and only four argument."
-msgstr "{0} 函式取得四个且仅有四个引数。"
+msgid "Prepare called before end. prepare xid={0}, state={1}"
+msgstr ""
-#: org/postgresql/jdbc/EscapedFunctions.java:273
-#: org/postgresql/jdbc/EscapedFunctions.java:347
-#: org/postgresql/jdbc/EscapedFunctions.java:752
-#: org/postgresql/jdbc/EscapedFunctions.java:790
+#: org/postgresql/xa/PGXAConnection.java:331
#, java-format
-msgid "{0} function takes two and only two arguments."
-msgstr "{0} 函式取得二个且仅有二个引数。"
+msgid "Error preparing transaction. prepare xid={0}"
+msgstr ""
-#: org/postgresql/jdbc/EscapedFunctions.java:291
-#: org/postgresql/jdbc/EscapedFunctions.java:329
-#: org/postgresql/jdbc/EscapedFunctions.java:449
-#: org/postgresql/jdbc/EscapedFunctions.java:464
-#: org/postgresql/jdbc/EscapedFunctions.java:479
-#: org/postgresql/jdbc/EscapedFunctions.java:494
-#: org/postgresql/jdbc/EscapedFunctions.java:509
-#: org/postgresql/jdbc/EscapedFunctions.java:524
-#: org/postgresql/jdbc/EscapedFunctions.java:539
-#: org/postgresql/jdbc/EscapedFunctions.java:554
-#: org/postgresql/jdbc/EscapedFunctions.java:569
-#: org/postgresql/jdbc/EscapedFunctions.java:584
-#: org/postgresql/jdbc/EscapedFunctions.java:599
-#: org/postgresql/jdbc/EscapedFunctions.java:614
-#: org/postgresql/jdbc/EscapedFunctions.java:778
+#: org/postgresql/xa/PGXAConnection.java:382
+msgid "Error during recover"
+msgstr ""
+
+#: org/postgresql/xa/PGXAConnection.java:438
#, java-format
-msgid "{0} function takes one and only one argument."
-msgstr "{0} 函式取得一个且仅有一个引数。"
+msgid ""
+"Error rolling back prepared transaction. rollback xid={0}, preparedXid={1}, "
+"currentXid={2}"
+msgstr ""
-#: org/postgresql/jdbc/EscapedFunctions.java:313
-#: org/postgresql/jdbc/EscapedFunctions.java:394
+#: org/postgresql/xa/PGXAConnection.java:471
#, java-format
-msgid "{0} function takes two or three arguments."
-msgstr "{0} 函式取得二个或三个引数。"
+msgid ""
+"One-phase commit called for xid {0} but connection was prepared with xid {1}"
+msgstr ""
-#: org/postgresql/jdbc/EscapedFunctions.java:419
-#: org/postgresql/jdbc/EscapedFunctions.java:434
-#: org/postgresql/jdbc/EscapedFunctions.java:737
-#: org/postgresql/jdbc/EscapedFunctions.java:767
+#: org/postgresql/xa/PGXAConnection.java:479
+msgid ""
+"Not implemented: one-phase commit must be issued using the same connection "
+"that was used to start it"
+msgstr ""
+
+#: org/postgresql/xa/PGXAConnection.java:483
#, java-format
-msgid "{0} function doesn''t take any argument."
-msgstr "{0} 函式无法取得任何的引数。"
+msgid "One-phase commit with unknown xid. commit xid={0}, currentXid={1}"
+msgstr ""
-#: org/postgresql/jdbc/EscapedFunctions.java:630
-#: org/postgresql/jdbc/EscapedFunctions.java:683
+#: org/postgresql/xa/PGXAConnection.java:487
#, java-format
-msgid "{0} function takes three and only three arguments."
-msgstr "{0} 函式取得三个且仅有三个引数。"
+msgid "commit called before end. commit xid={0}, state={1}"
+msgstr ""
-#: org/postgresql/jdbc/EscapedFunctions.java:643
-#: org/postgresql/jdbc/EscapedFunctions.java:664
-#: org/postgresql/jdbc/EscapedFunctions.java:667
-#: org/postgresql/jdbc/EscapedFunctions.java:700
-#: org/postgresql/jdbc/EscapedFunctions.java:713
-#: org/postgresql/jdbc/EscapedFunctions.java:716
+#: org/postgresql/xa/PGXAConnection.java:498
#, java-format
-msgid "Interval {0} not yet implemented"
-msgstr "隔绝 {0} 尚未被实作。"
+msgid "Error during one-phase commit. commit xid={0}"
+msgstr ""
+
+#: org/postgresql/xa/PGXAConnection.java:517
+msgid ""
+"Not implemented: 2nd phase commit must be issued using an idle connection. "
+"commit xid={0}, currentXid={1}, state={2], transactionState={3}"
+msgstr ""
-#: org/postgresql/jdbc/PgArray.java:166 org/postgresql/jdbc/PgArray.java:822
+#: org/postgresql/xa/PGXAConnection.java:550
#, java-format
-msgid "The array index is out of range: {0}"
-msgstr "阵列索引超过许可范围:{0}"
+msgid ""
+"Error committing prepared transaction. commit xid={0}, preparedXid={1}, "
+"currentXid={2}"
+msgstr ""
-#: org/postgresql/jdbc/PgArray.java:183 org/postgresql/jdbc/PgArray.java:839
+#: org/postgresql/xa/PGXAConnection.java:567
#, java-format
-msgid "The array index is out of range: {0}, number of elements: {1}."
-msgstr "阵列索引超过许可范围:{0},元素数量:{1}。"
+msgid "Heuristic commit/rollback not supported. forget xid={0}"
+msgstr ""
-#: org/postgresql/jdbc/PgArray.java:215
-#: org/postgresql/jdbc/PgResultSet.java:1885
-#: org/postgresql/util/HStoreConverter.java:38
-#: org/postgresql/util/HStoreConverter.java:69
-msgid ""
-"Invalid character data was found. This is most likely caused by stored data "
-"containing characters that are invalid for the character set the database "
-"was created in. The most common example of this is storing 8bit data in a "
-"SQL_ASCII database."
+#: org/postgresql/jdbc/PgSQLXML.java:147
+msgid "Unable to decode xml data."
msgstr ""
-"发现不合法的字元,可能的原因是欲储存的数据中包含数据库的字元集不支援的字码,"
-"其中最常见例子的就是将 8 位元数据存入使用 SQL_ASCII 编码的数据库中。"
-#: org/postgresql/jdbc/PgCallableStatement.java:90
-#: org/postgresql/jdbc/PgCallableStatement.java:96
-msgid "A CallableStatement was executed with nothing returned."
-msgstr "一个 CallableStatement 执行函式后没有传回值。"
+#: org/postgresql/jdbc/PgSQLXML.java:150
+#, java-format
+msgid "Unknown XML Source class: {0}"
+msgstr ""
-#: org/postgresql/jdbc/PgCallableStatement.java:107
+#: org/postgresql/jdbc/PgSQLXML.java:193
#, fuzzy
-msgid "A CallableStatement was executed with an invalid number of parameters"
-msgstr "一个 CallableStatement 已执行包括一个无效的参数数值"
+msgid "Unable to create SAXResult for SQLXML."
+msgstr "为 {0} 建立对象失败。"
-#: org/postgresql/jdbc/PgCallableStatement.java:139
-#, java-format
-msgid ""
-"A CallableStatement function was executed and the out parameter {0} was of "
-"type {1} however type {2} was registered."
+#: org/postgresql/jdbc/PgSQLXML.java:208
+msgid "Unable to create StAXResult for SQLXML"
msgstr ""
-"一个 CallableStatement 执行函式后输出的参数类型为 {1} 值为 {0},但是已注册的"
-"类型是 {2}。"
-#: org/postgresql/jdbc/PgCallableStatement.java:195
-msgid ""
-"This statement does not declare an OUT parameter. Use '{' ?= call ... '}' "
-"to declare one."
-msgstr "这个 statement 未宣告 OUT 参数,使用 '{' ?= call ... '}' 宣告一个。"
+#: org/postgresql/jdbc/PgSQLXML.java:213
+#, fuzzy, java-format
+msgid "Unknown XML Result class: {0}"
+msgstr "未知的 ResultSet 可适用的设置:{0}。"
-#: org/postgresql/jdbc/PgCallableStatement.java:239
-msgid "wasNull cannot be call before fetching a result."
+#: org/postgresql/jdbc/PgSQLXML.java:225
+#, fuzzy
+msgid "This SQLXML object has already been freed."
+msgstr "这个 PooledConnection 已经被关闭。"
+
+#: org/postgresql/jdbc/PgSQLXML.java:234
+msgid ""
+"This SQLXML object has not been initialized, so you cannot retrieve data "
+"from it."
msgstr ""
-#: org/postgresql/jdbc/PgCallableStatement.java:377
-#: org/postgresql/jdbc/PgCallableStatement.java:396
+#: org/postgresql/jdbc/PgSQLXML.java:247
#, java-format
-msgid ""
-"Parameter of type {0} was registered, but call to get{1} (sqltype={2}) was "
-"made."
-msgstr "已注册参数类型 {0},但是又呼叫了get{1}(sqltype={2})。"
+msgid "Failed to convert binary xml data to encoding: {0}."
+msgstr ""
+
+#: org/postgresql/jdbc/PgSQLXML.java:273
+msgid "Unable to convert DOMResult SQLXML data to a string."
+msgstr ""
-#: org/postgresql/jdbc/PgCallableStatement.java:417
+#: org/postgresql/jdbc/PgSQLXML.java:287
msgid ""
-"A CallableStatement was declared, but no call to registerOutParameter(1, "
-"<some type>) was made."
+"This SQLXML object has already been initialized, so you cannot manipulate it "
+"further."
msgstr ""
-"已经宣告 CallableStatement 函式,但是尚未呼叫 registerOutParameter (1, "
-"<some_type>) 。"
-#: org/postgresql/jdbc/PgCallableStatement.java:423
-msgid "No function outputs were registered."
+#: org/postgresql/jdbc/PSQLSavepoint.java:37
+#: org/postgresql/jdbc/PSQLSavepoint.java:51
+#: org/postgresql/jdbc/PSQLSavepoint.java:69
+msgid "Cannot reference a savepoint after it has been released."
+msgstr "无法参照已经被释放的储存点。"
+
+#: org/postgresql/jdbc/PSQLSavepoint.java:42
+msgid "Cannot retrieve the id of a named savepoint."
+msgstr "无法取得已命名储存点的 id。"
+
+#: org/postgresql/jdbc/PSQLSavepoint.java:56
+msgid "Cannot retrieve the name of an unnamed savepoint."
+msgstr "无法取得未命名储存点(Savepoint)的名称。"
+
+#: org/postgresql/jdbc/PgArray.java:157 org/postgresql/jdbc/PgArray.java:844
+#, java-format
+msgid "The array index is out of range: {0}"
+msgstr "阵列索引超过许可范围:{0}"
+
+#: org/postgresql/jdbc/PgArray.java:178 org/postgresql/jdbc/PgArray.java:861
+#, java-format
+msgid "The array index is out of range: {0}, number of elements: {1}."
+msgstr "阵列索引超过许可范围:{0},元素数量:{1}。"
+
+#: org/postgresql/jdbc/PgParameterMetaData.java:83
+#, java-format
+msgid "The parameter index is out of range: {0}, number of parameters: {1}."
+msgstr "参数索引超出许可范围:{0},参数总数:{1}。"
+
+#: org/postgresql/jdbc/BatchResultHandler.java:92
+msgid "Too many update results were returned."
msgstr ""
-#: org/postgresql/jdbc/PgCallableStatement.java:429
+#: org/postgresql/jdbc/BatchResultHandler.java:146
+#, fuzzy, java-format
msgid ""
-"Results cannot be retrieved from a CallableStatement before it is executed."
-msgstr ""
+"Batch entry {0} {1} was aborted: {2} Call getNextException to see other "
+"errors in the batch."
+msgstr "批次处理 {0} {1} 被中止,呼叫 getNextException 以取得原因。"
-#: org/postgresql/jdbc/PgConnection.java:312
+#: org/postgresql/jdbc/PgConnection.java:272
#, java-format
msgid "Unsupported value for stringtype parameter: {0}"
msgstr "字符类型参数值未被支持:{0}"
-#: org/postgresql/jdbc/PgConnection.java:457
-#: org/postgresql/jdbc/PgPreparedStatement.java:115
-#: org/postgresql/jdbc/PgStatement.java:282
-#: org/postgresql/jdbc/TypeInfoCache.java:230
-#: org/postgresql/jdbc/TypeInfoCache.java:370
-#: org/postgresql/jdbc/TypeInfoCache.java:412
+#: org/postgresql/jdbc/PgConnection.java:424
+#: org/postgresql/jdbc/PgStatement.java:225
+#: org/postgresql/jdbc/TypeInfoCache.java:226
+#: org/postgresql/jdbc/TypeInfoCache.java:371
+#: org/postgresql/jdbc/TypeInfoCache.java:411
+#: org/postgresql/jdbc/TypeInfoCache.java:484
#: org/postgresql/jdbc/TypeInfoCache.java:489
-#: org/postgresql/jdbc/TypeInfoCache.java:494
-#: org/postgresql/jdbc/TypeInfoCache.java:535
-#: org/postgresql/jdbc/TypeInfoCache.java:540
+#: org/postgresql/jdbc/TypeInfoCache.java:526
+#: org/postgresql/jdbc/TypeInfoCache.java:531
+#: org/postgresql/jdbc/PgPreparedStatement.java:119
msgid "No results were returned by the query."
msgstr "查询没有传回任何结果。"
-#: org/postgresql/jdbc/PgConnection.java:578
+#: org/postgresql/jdbc/PgConnection.java:441
+#: org/postgresql/jdbc/PgStatement.java:254
+msgid "A result was returned when none was expected."
+msgstr "传回预期之外的结果。"
+
+#: org/postgresql/jdbc/PgConnection.java:545
msgid "Custom type maps are not supported."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:620
+#: org/postgresql/jdbc/PgConnection.java:587
#, java-format
msgid "Failed to create object for: {0}."
msgstr "为 {0} 建立对象失败。"
-#: org/postgresql/jdbc/PgConnection.java:672
+#: org/postgresql/jdbc/PgConnection.java:641
#, java-format
msgid "Unable to load the class {0} responsible for the datatype {1}"
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:724
+#: org/postgresql/jdbc/PgConnection.java:693
msgid ""
"Cannot change transaction read-only property in the middle of a transaction."
msgstr "不能在事物交易过程中改变事物交易唯读属性。"
-#: org/postgresql/jdbc/PgConnection.java:775
+#: org/postgresql/jdbc/PgConnection.java:756
msgid "Cannot commit when autoCommit is enabled."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:786
-#: org/postgresql/jdbc/PgConnection.java:1358
-#: org/postgresql/jdbc/PgConnection.java:1395
+#: org/postgresql/jdbc/PgConnection.java:767
+#: org/postgresql/jdbc/PgConnection.java:1384
+#: org/postgresql/jdbc/PgConnection.java:1428
#, fuzzy
msgid "This connection has been closed."
msgstr "Connection 已经被关闭。"
-#: org/postgresql/jdbc/PgConnection.java:796
+#: org/postgresql/jdbc/PgConnection.java:777
msgid "Cannot rollback when autoCommit is enabled."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:870
+#: org/postgresql/jdbc/PgConnection.java:827
msgid ""
"Cannot change transaction isolation level in the middle of a transaction."
msgstr "不能在事务交易过程中改变事物交易隔绝等级。"
-#: org/postgresql/jdbc/PgConnection.java:876
+#: org/postgresql/jdbc/PgConnection.java:833
#, java-format
msgid "Transaction isolation level {0} not supported."
msgstr "不支援交易隔绝等级 {0} 。"
-#: org/postgresql/jdbc/PgConnection.java:921
+#: org/postgresql/jdbc/PgConnection.java:878
msgid "Finalizing a Connection that was never closed:"
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:1009
+#: org/postgresql/jdbc/PgConnection.java:945
msgid "Unable to translate data into the desired encoding."
msgstr "无法将数据转成目标编码。"
-#: org/postgresql/jdbc/PgConnection.java:1081
-#: org/postgresql/jdbc/PgResultSet.java:1782
-#: org/postgresql/jdbc/PgStatement.java:1053
+#: org/postgresql/jdbc/PgConnection.java:1008
+#: org/postgresql/jdbc/PgStatement.java:903
+#: org/postgresql/jdbc/PgResultSet.java:1817
msgid "Fetch size must be a value greater to or equal to 0."
msgstr "数据读取笔数(fetch size)必须大于或等于 0。"
-#: org/postgresql/jdbc/PgConnection.java:1311
+#: org/postgresql/jdbc/PgConnection.java:1289
+#: org/postgresql/jdbc/PgConnection.java:1330
#, java-format
msgid "Unable to find server array type for provided name {0}."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:1327
+#: org/postgresql/jdbc/PgConnection.java:1312
+#, fuzzy, java-format
+msgid "Invalid elements {0}"
+msgstr "无效的旗标 flags {0}"
+
+#: org/postgresql/jdbc/PgConnection.java:1348
#, fuzzy, java-format
msgid "Invalid timeout ({0}<0)."
msgstr "无效的串流长度 {0}."
-#: org/postgresql/jdbc/PgConnection.java:1340
+#: org/postgresql/jdbc/PgConnection.java:1372
msgid "Validating connection."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:1375
+#: org/postgresql/jdbc/PgConnection.java:1405
#, fuzzy, java-format
msgid "Failed to set ClientInfo property: {0}"
msgstr "为 {0} 建立对象失败。"
-#: org/postgresql/jdbc/PgConnection.java:1383
+#: org/postgresql/jdbc/PgConnection.java:1415
msgid "ClientInfo property not supported."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:1408
+#: org/postgresql/jdbc/PgConnection.java:1441
msgid "One ore more ClientInfo failed."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:1517
+#: org/postgresql/jdbc/PgConnection.java:1540
+#, fuzzy
+msgid "Network timeout must be a value greater than or equal to 0."
+msgstr "查询逾时等候时间必须大于或等于 0。"
+
+#: org/postgresql/jdbc/PgConnection.java:1552
+msgid "Unable to set network timeout."
+msgstr ""
+
+#: org/postgresql/jdbc/PgConnection.java:1563
+msgid "Unable to get network timeout."
+msgstr ""
+
+#: org/postgresql/jdbc/PgConnection.java:1580
#, java-format
msgid "Unknown ResultSet holdability setting: {0}."
msgstr "未知的 ResultSet 可适用的设置:{0}。"
-#: org/postgresql/jdbc/PgConnection.java:1531
-#: org/postgresql/jdbc/PgConnection.java:1554
-#: org/postgresql/jdbc/PgConnection.java:1576
-#: org/postgresql/jdbc/PgConnection.java:1587
-msgid "Server versions prior to 8.0 do not support savepoints."
-msgstr "8.0 版之前的服务器不支援储存点(SavePints)。"
-
-#: org/postgresql/jdbc/PgConnection.java:1535
-#: org/postgresql/jdbc/PgConnection.java:1558
+#: org/postgresql/jdbc/PgConnection.java:1598
+#: org/postgresql/jdbc/PgConnection.java:1619
msgid "Cannot establish a savepoint in auto-commit mode."
msgstr "在自动确认事物交易模式无法建立储存点(Savepoint)。"
-#: org/postgresql/jdbc/PgConnection.java:1635
+#: org/postgresql/jdbc/PgConnection.java:1685
msgid "Returning autogenerated keys is not supported."
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:78
+#: org/postgresql/jdbc/PgStatement.java:235
+msgid "Multiple ResultSets were returned by the query."
+msgstr "查询传回多个 ResultSet。"
+
+#: org/postgresql/jdbc/PgStatement.java:316
+msgid "Can''t use executeWithFlags(int) on a Statement."
+msgstr ""
+
+#: org/postgresql/jdbc/PgStatement.java:509
+msgid "Maximum number of rows must be a value grater than or equal to 0."
+msgstr "最大数据读取笔数必须大于或等于 0。"
+
+#: org/postgresql/jdbc/PgStatement.java:550
+msgid "Query timeout must be a value greater than or equals to 0."
+msgstr "查询逾时等候时间必须大于或等于 0。"
+
+#: org/postgresql/jdbc/PgStatement.java:590
+msgid "The maximum field size must be a value greater than or equal to 0."
+msgstr "最大栏位容量必须大于或等于 0。"
+
+#: org/postgresql/jdbc/PgStatement.java:689
+msgid "This statement has been closed."
+msgstr "这个 statement 已经被关闭。"
+
+#: org/postgresql/jdbc/PgStatement.java:895
+#: org/postgresql/jdbc/PgResultSet.java:878
+#, java-format
+msgid "Invalid fetch direction constant: {0}."
+msgstr "无效的 fetch 方向常数:{0}。"
+
+#: org/postgresql/jdbc/PgStatement.java:1145
+#: org/postgresql/jdbc/PgStatement.java:1173
+msgid "Returning autogenerated keys by column index is not supported."
+msgstr ""
+
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:66
msgid ""
"Unable to determine a value for MaxIndexKeys due to missing system catalog "
"data."
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:100
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:89
msgid "Unable to find name datatype in the system catalogs."
msgstr "在系统 catalog 中找不到名称数据类型(datatype)。"
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1117
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1028
msgid "proname"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1117
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1028
msgid "oid"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1119
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1714
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1030
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1481
msgid "typtype"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1122
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1033
msgid "proargtypes"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1732
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1499
msgid "adsrc"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1872
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1963
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1512
+msgid "attidentity"
+msgstr ""
+
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1608
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1684
msgid "rolname"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1873
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1964
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1609
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1685
msgid "relacl"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1878
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1615
msgid "attacl"
msgstr ""
-#: org/postgresql/jdbc/PgParameterMetaData.java:86
+#: org/postgresql/jdbc/AbstractBlobClob.java:78
+msgid ""
+"Truncation of large objects is only implemented in 8.3 and later servers."
+msgstr "大型对象的截断(Truncation)仅被实作执行在 8.3 和后来的服务器。"
+
+#: org/postgresql/jdbc/AbstractBlobClob.java:83
+msgid "Cannot truncate LOB to a negative length."
+msgstr ""
+
+#: org/postgresql/jdbc/AbstractBlobClob.java:90
+#: org/postgresql/jdbc/AbstractBlobClob.java:234
#, java-format
-msgid "The parameter index is out of range: {0}, number of parameters: {1}."
-msgstr "参数索引超出许可范围:{0},参数总数:{1}。"
+msgid "PostgreSQL LOBs can only index to: {0}"
+msgstr "PostgreSQL LOBs 仅能索引到:{0}"
-#: org/postgresql/jdbc/PgPreparedStatement.java:102
-#: org/postgresql/jdbc/PgPreparedStatement.java:128
-#: org/postgresql/jdbc/PgPreparedStatement.java:150
-#: org/postgresql/jdbc/PgPreparedStatement.java:1108
+#: org/postgresql/jdbc/AbstractBlobClob.java:230
+msgid "LOB positioning offsets start at 1."
+msgstr ""
+
+#: org/postgresql/jdbc/AbstractBlobClob.java:246
+msgid "free() was called on this LOB previously"
+msgstr ""
+
+#: org/postgresql/jdbc/PgPreparedStatement.java:106
+#: org/postgresql/jdbc/PgPreparedStatement.java:127
+#: org/postgresql/jdbc/PgPreparedStatement.java:139
+#: org/postgresql/jdbc/PgPreparedStatement.java:1035
msgid ""
"Can''t use query methods that take a query string on a PreparedStatement."
msgstr "在 PreparedStatement 上不能使用获取查询字符的查询方法。"
-#: org/postgresql/jdbc/PgPreparedStatement.java:119
-#: org/postgresql/jdbc/PgStatement.java:286
-msgid "Multiple ResultSets were returned by the query."
-msgstr "查询传回多个 ResultSet。"
-
-#: org/postgresql/jdbc/PgPreparedStatement.java:270
+#: org/postgresql/jdbc/PgPreparedStatement.java:249
msgid "Unknown Types value."
msgstr "不明的类型值。"
-#: org/postgresql/jdbc/PgPreparedStatement.java:417
-#: org/postgresql/jdbc/PgPreparedStatement.java:486
-#: org/postgresql/jdbc/PgPreparedStatement.java:1251
-#: org/postgresql/jdbc/PgPreparedStatement.java:1583
+#: org/postgresql/jdbc/PgPreparedStatement.java:382
+#: org/postgresql/jdbc/PgPreparedStatement.java:439
+#: org/postgresql/jdbc/PgPreparedStatement.java:1191
+#: org/postgresql/jdbc/PgPreparedStatement.java:1490
#, java-format
msgid "Invalid stream length {0}."
msgstr "无效的串流长度 {0}."
-#: org/postgresql/jdbc/PgPreparedStatement.java:447
+#: org/postgresql/jdbc/PgPreparedStatement.java:411
#, java-format
msgid "The JVM claims not to support the {0} encoding."
msgstr "JVM 声明并不支援 {0} 编码。"
-#: org/postgresql/jdbc/PgPreparedStatement.java:450
-#: org/postgresql/jdbc/PgPreparedStatement.java:519
-#: org/postgresql/jdbc/PgResultSet.java:1075
-#: org/postgresql/jdbc/PgResultSet.java:1109
+#: org/postgresql/jdbc/PgPreparedStatement.java:414
+#: org/postgresql/jdbc/PgResultSet.java:1122
+#: org/postgresql/jdbc/PgResultSet.java:1156
msgid "Provided InputStream failed."
msgstr "提供的 InputStream 已失败。"
-#: org/postgresql/jdbc/PgPreparedStatement.java:536
-#: org/postgresql/jdbc/PgPreparedStatement.java:1170
+#: org/postgresql/jdbc/PgPreparedStatement.java:460
+#: org/postgresql/jdbc/PgPreparedStatement.java:1096
#, java-format
msgid "Unknown type {0}."
msgstr "不明的类型 {0}"
-#: org/postgresql/jdbc/PgPreparedStatement.java:553
+#: org/postgresql/jdbc/PgPreparedStatement.java:477
msgid "No hstore extension installed."
msgstr ""
-#: org/postgresql/jdbc/PgPreparedStatement.java:683
-#: org/postgresql/jdbc/PgPreparedStatement.java:705
-#: org/postgresql/jdbc/PgPreparedStatement.java:715
-#: org/postgresql/jdbc/PgPreparedStatement.java:725
+#: org/postgresql/jdbc/PgPreparedStatement.java:619
+#: org/postgresql/jdbc/PgPreparedStatement.java:642
+#: org/postgresql/jdbc/PgPreparedStatement.java:652
+#: org/postgresql/jdbc/PgPreparedStatement.java:664
#, java-format
msgid "Cannot cast an instance of {0} to type {1}"
msgstr "不能转换一个 {0} 实例到类型 {1}"
-#: org/postgresql/jdbc/PgPreparedStatement.java:741
+#: org/postgresql/jdbc/PgPreparedStatement.java:682
#, java-format
msgid "Unsupported Types value: {0}"
msgstr "未被支持的类型值:{0}"
-#: org/postgresql/jdbc/PgPreparedStatement.java:970
+#: org/postgresql/jdbc/PgPreparedStatement.java:894
#, java-format
msgid "Cannot convert an instance of {0} to type {1}"
msgstr "无法转换 {0} 到类型 {1} 的实例"
-#: org/postgresql/jdbc/PgPreparedStatement.java:1040
+#: org/postgresql/jdbc/PgPreparedStatement.java:968
#, java-format
msgid ""
"Can''t infer the SQL type to use for an instance of {0}. Use setObject() "
"with an explicit Types value to specify the type to use."
msgstr ""
-#: org/postgresql/jdbc/PgPreparedStatement.java:1207
-#: org/postgresql/jdbc/PgPreparedStatement.java:1303
-#: org/postgresql/jdbc/PgPreparedStatement.java:1340
+#: org/postgresql/jdbc/PgPreparedStatement.java:1133
+#: org/postgresql/jdbc/PgPreparedStatement.java:1233
msgid "Unexpected error writing large object to database."
msgstr "将大型对象(large object)写入数据库时发生不明错误。"
-#: org/postgresql/jdbc/PgPreparedStatement.java:1278
-#: org/postgresql/jdbc/PgResultSet.java:1163
+#: org/postgresql/jdbc/PgPreparedStatement.java:1178
+#: org/postgresql/jdbc/PgResultSet.java:1210
msgid "Provided Reader failed."
msgstr "提供的 Reader 已失败。"
-#: org/postgresql/jdbc/PgPreparedStatement.java:1542
-#: org/postgresql/util/StreamWrapper.java:59
-msgid "Object is too large to send over the protocol."
+#: org/postgresql/jdbc/BooleanTypeUtil.java:99
+#, java-format
+msgid "Cannot cast to boolean: \"{0}\""
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:285
+#: org/postgresql/jdbc/PgResultSet.java:280
msgid ""
"Operation requires a scrollable ResultSet, but this ResultSet is "
"FORWARD_ONLY."
msgstr "操作要求可卷动的 ResultSet,但此 ResultSet 是 FORWARD_ONLY。"
-#: org/postgresql/jdbc/PgResultSet.java:456
-msgid "Unexpected error while decoding character data from a large object."
-msgstr "从大型对象(large object)解码字元数据时发生错误。"
-
-#: org/postgresql/jdbc/PgResultSet.java:507
-#: org/postgresql/jdbc/PgResultSet.java:537
-#: org/postgresql/jdbc/PgResultSet.java:570
-#: org/postgresql/jdbc/PgResultSet.java:2964
+#: org/postgresql/jdbc/PgResultSet.java:492
+#: org/postgresql/jdbc/PgResultSet.java:532
+#: org/postgresql/jdbc/PgResultSet.java:556
+#: org/postgresql/jdbc/PgResultSet.java:594
+#: org/postgresql/jdbc/PgResultSet.java:624
#: org/postgresql/jdbc/PgResultSet.java:3008
+#: org/postgresql/jdbc/PgResultSet.java:3052
#, fuzzy, java-format
msgid "Cannot convert the column of type {0} to requested type {1}."
msgstr "无法转换 {0} 到类型 {1} 的实例"
-#: org/postgresql/jdbc/PgResultSet.java:789
-#: org/postgresql/jdbc/PgResultSet.java:810
-#: org/postgresql/jdbc/PgResultSet.java:1797
+#: org/postgresql/jdbc/PgResultSet.java:838
+#: org/postgresql/jdbc/PgResultSet.java:859
+#: org/postgresql/jdbc/PgResultSet.java:1832
msgid "Can''t use relative move methods while on the insert row."
msgstr "不能在新增的数据列上使用相对位置 move 方法。"
-#: org/postgresql/jdbc/PgResultSet.java:829
-#: org/postgresql/jdbc/PgStatement.java:1045
-#, java-format
-msgid "Invalid fetch direction constant: {0}."
-msgstr "无效的 fetch 方向常数:{0}。"
-
-#: org/postgresql/jdbc/PgResultSet.java:840
+#: org/postgresql/jdbc/PgResultSet.java:889
msgid "Cannot call cancelRowUpdates() when on the insert row."
msgstr "不能在新增的数据列上呼叫 cancelRowUpdates()。"
-#: org/postgresql/jdbc/PgResultSet.java:856
+#: org/postgresql/jdbc/PgResultSet.java:905
msgid "Cannot call deleteRow() when on the insert row."
msgstr "不能在新增的数据上呼叫 deleteRow()。"
-#: org/postgresql/jdbc/PgResultSet.java:863
+#: org/postgresql/jdbc/PgResultSet.java:912
msgid ""
"Currently positioned before the start of the ResultSet. You cannot call "
"deleteRow() here."
msgstr "不能在 ResultSet 的第一笔数据之前呼叫 deleteRow()。"
-#: org/postgresql/jdbc/PgResultSet.java:869
+#: org/postgresql/jdbc/PgResultSet.java:918
msgid ""
"Currently positioned after the end of the ResultSet. You cannot call "
"deleteRow() here."
msgstr "不能在 ResultSet 的最后一笔数据之后呼叫 deleteRow()。"
-#: org/postgresql/jdbc/PgResultSet.java:873
+#: org/postgresql/jdbc/PgResultSet.java:922
msgid "There are no rows in this ResultSet."
msgstr "ResultSet 中找不到数据列。"
-#: org/postgresql/jdbc/PgResultSet.java:914
+#: org/postgresql/jdbc/PgResultSet.java:963
msgid "Not on the insert row."
msgstr "不在新增的数据列上。"
-#: org/postgresql/jdbc/PgResultSet.java:916
+#: org/postgresql/jdbc/PgResultSet.java:965
msgid "You must specify at least one column value to insert a row."
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:1072
-#: org/postgresql/jdbc/PgResultSet.java:1706
-#: org/postgresql/jdbc/PgResultSet.java:2377
-#: org/postgresql/jdbc/PgResultSet.java:2402
+#: org/postgresql/jdbc/PgResultSet.java:1119
+#: org/postgresql/jdbc/PgResultSet.java:1754
+#: org/postgresql/jdbc/PgResultSet.java:2416
+#: org/postgresql/jdbc/PgResultSet.java:2437
#, java-format
msgid "The JVM claims not to support the encoding: {0}"
msgstr "JVM 声明并不支援编码:{0} 。"
-#: org/postgresql/jdbc/PgResultSet.java:1214
+#: org/postgresql/jdbc/PgResultSet.java:1261
msgid "Can''t refresh the insert row."
msgstr "无法重读新增的数据列。"
-#: org/postgresql/jdbc/PgResultSet.java:1280
+#: org/postgresql/jdbc/PgResultSet.java:1328
msgid "Cannot call updateRow() when on the insert row."
msgstr "不能在新增的数据列上呼叫 deleteRow()。"
-#: org/postgresql/jdbc/PgResultSet.java:1287
-#: org/postgresql/jdbc/PgResultSet.java:3025
+#: org/postgresql/jdbc/PgResultSet.java:1335
+#: org/postgresql/jdbc/PgResultSet.java:3069
msgid ""
"Cannot update the ResultSet because it is either before the start or after "
"the end of the results."
msgstr "无法更新 ResultSet,可能在第一笔数据之前或最未笔数据之后。"
-#: org/postgresql/jdbc/PgResultSet.java:1486
+#: org/postgresql/jdbc/PgResultSet.java:1535
msgid "ResultSets with concurrency CONCUR_READ_ONLY cannot be updated."
msgstr "ResultSets 与并发同作(Concurrency) CONCUR_READ_ONLY 不能被更新。"
-#: org/postgresql/jdbc/PgResultSet.java:1555
+#: org/postgresql/jdbc/PgResultSet.java:1603
#, java-format
msgid "No primary key found for table {0}."
msgstr "{0} 数据表中未找到主键(Primary key)。"
-#: org/postgresql/jdbc/PgResultSet.java:1941
-#: org/postgresql/jdbc/PgResultSet.java:1946
-#: org/postgresql/jdbc/PgResultSet.java:1986
-#: org/postgresql/jdbc/PgResultSet.java:1992
-#: org/postgresql/jdbc/PgResultSet.java:2790
-#: org/postgresql/jdbc/PgResultSet.java:2796
-#: org/postgresql/jdbc/PgResultSet.java:2820
-#: org/postgresql/jdbc/PgResultSet.java:2825
-#: org/postgresql/jdbc/PgResultSet.java:2841
-#: org/postgresql/jdbc/PgResultSet.java:2862
-#: org/postgresql/jdbc/PgResultSet.java:2873
-#: org/postgresql/jdbc/PgResultSet.java:2886
-#: org/postgresql/jdbc/PgResultSet.java:3013
+#: org/postgresql/jdbc/PgResultSet.java:2011
+#: org/postgresql/jdbc/PgResultSet.java:2016
+#: org/postgresql/jdbc/PgResultSet.java:2803
+#: org/postgresql/jdbc/PgResultSet.java:2809
+#: org/postgresql/jdbc/PgResultSet.java:2834
+#: org/postgresql/jdbc/PgResultSet.java:2840
+#: org/postgresql/jdbc/PgResultSet.java:2864
+#: org/postgresql/jdbc/PgResultSet.java:2869
+#: org/postgresql/jdbc/PgResultSet.java:2885
+#: org/postgresql/jdbc/PgResultSet.java:2906
+#: org/postgresql/jdbc/PgResultSet.java:2917
+#: org/postgresql/jdbc/PgResultSet.java:2930
+#: org/postgresql/jdbc/PgResultSet.java:3057
#, java-format
msgid "Bad value for type {0} : {1}"
msgstr "不良的类型值 {0} : {1}"
-#: org/postgresql/jdbc/PgResultSet.java:2564
+#: org/postgresql/jdbc/PgResultSet.java:2589
#, java-format
msgid "The column name {0} was not found in this ResultSet."
-msgstr "ResultSet 中找不到栏位名称 {0}。"
-
-#: org/postgresql/jdbc/PgResultSet.java:2689
-msgid ""
-"ResultSet is not updateable. The query that generated this result set must "
-"select only one table, and must select all primary keys from that table. See "
-"the JDBC 2.1 API Specification, section 5.6 for more details."
-msgstr ""
-"不可更新的 ResultSet。用来产生这个 ResultSet 的 SQL 命令只能操作一个数据表,"
-"并且必需选择所有主键栏位,详细请参阅 JDBC 2.1 API 规格书 5.6 节。"
-
-#: org/postgresql/jdbc/PgResultSet.java:2701
-msgid "This ResultSet is closed."
-msgstr "这个 ResultSet 已经被关闭。"
-
-#: org/postgresql/jdbc/PgResultSet.java:2732
-msgid "ResultSet not positioned properly, perhaps you need to call next."
-msgstr "查询结果指标位置不正确,您也许需要呼叫 ResultSet 的 next() 方法。"
-
-#: org/postgresql/jdbc/PgResultSet.java:3045
-#, fuzzy
-msgid "Invalid UUID data."
-msgstr "无效的旗标"
-
-#: org/postgresql/jdbc/PgSQLXML.java:150
-msgid "Unable to decode xml data."
-msgstr ""
-
-#: org/postgresql/jdbc/PgSQLXML.java:153
-#, java-format
-msgid "Unknown XML Source class: {0}"
-msgstr ""
-
-#: org/postgresql/jdbc/PgSQLXML.java:196
-#, fuzzy
-msgid "Unable to create SAXResult for SQLXML."
-msgstr "为 {0} 建立对象失败。"
-
-#: org/postgresql/jdbc/PgSQLXML.java:211
-msgid "Unable to create StAXResult for SQLXML"
-msgstr ""
-
-#: org/postgresql/jdbc/PgSQLXML.java:216
-#, fuzzy, java-format
-msgid "Unknown XML Result class: {0}"
-msgstr "未知的 ResultSet 可适用的设置:{0}。"
-
-#: org/postgresql/jdbc/PgSQLXML.java:228
-#, fuzzy
-msgid "This SQLXML object has already been freed."
-msgstr "这个 PooledConnection 已经被关闭。"
-
-#: org/postgresql/jdbc/PgSQLXML.java:237
-msgid ""
-"This SQLXML object has not been initialized, so you cannot retrieve data "
-"from it."
-msgstr ""
-
-#: org/postgresql/jdbc/PgSQLXML.java:250
-#, java-format
-msgid "Failed to convert binary xml data to encoding: {0}."
-msgstr ""
-
-#: org/postgresql/jdbc/PgSQLXML.java:276
-msgid "Unable to convert DOMResult SQLXML data to a string."
-msgstr ""
-
-#: org/postgresql/jdbc/PgSQLXML.java:290
-msgid ""
-"This SQLXML object has already been initialized, so you cannot manipulate it "
-"further."
-msgstr ""
-
-#: org/postgresql/jdbc/PgStatement.java:325
-msgid "Can''t use executeWithFlags(int) on a Statement."
-msgstr ""
-
-#: org/postgresql/jdbc/PgStatement.java:484
-msgid "Maximum number of rows must be a value grater than or equal to 0."
-msgstr "最大数据读取笔数必须大于或等于 0。"
-
-#: org/postgresql/jdbc/PgStatement.java:525
-msgid "Query timeout must be a value greater than or equals to 0."
-msgstr "查询逾时等候时间必须大于或等于 0。"
-
-#: org/postgresql/jdbc/PgStatement.java:561
-msgid "The maximum field size must be a value greater than or equal to 0."
-msgstr "最大栏位容量必须大于或等于 0。"
-
-#: org/postgresql/jdbc/PgStatement.java:871
-msgid "This statement has been closed."
-msgstr "这个 statement 已经被关闭。"
+msgstr "ResultSet 中找不到栏位名称 {0}。"
-#: org/postgresql/jdbc/PgStatement.java:1148
-#, fuzzy
+#: org/postgresql/jdbc/PgResultSet.java:2725
msgid ""
-"Returning autogenerated keys is only supported for 8.2 and later servers."
-msgstr "大型对象的截断(Truncation)仅被实作执行在 8.3 和后来的服务器。"
-
-#: org/postgresql/jdbc/PgStatement.java:1326
-#: org/postgresql/jdbc/PgStatement.java:1357
-msgid "Returning autogenerated keys by column index is not supported."
+"ResultSet is not updateable. The query that generated this result set must "
+"select only one table, and must select all primary keys from that table. See "
+"the JDBC 2.1 API Specification, section 5.6 for more details."
msgstr ""
+"不可更新的 ResultSet。用来产生这个 ResultSet 的 SQL 命令只能操作一个数据表,"
+"并且必需选择所有主键栏位,详细请参阅 JDBC 2.1 API 规格书 5.6 节。"
-#: org/postgresql/jdbc/PSQLSavepoint.java:40
-#: org/postgresql/jdbc/PSQLSavepoint.java:54
-#: org/postgresql/jdbc/PSQLSavepoint.java:72
-msgid "Cannot reference a savepoint after it has been released."
-msgstr "无法参照已经被释放的储存点。"
+#: org/postgresql/jdbc/PgResultSet.java:2737
+msgid "This ResultSet is closed."
+msgstr "这个 ResultSet 已经被关闭。"
-#: org/postgresql/jdbc/PSQLSavepoint.java:45
-msgid "Cannot retrieve the id of a named savepoint."
-msgstr "无法取得已命名储存点的 id。"
+#: org/postgresql/jdbc/PgResultSet.java:2768
+msgid "ResultSet not positioned properly, perhaps you need to call next."
+msgstr "查询结果指标位置不正确,您也许需要呼叫 ResultSet 的 next() 方法。"
-#: org/postgresql/jdbc/PSQLSavepoint.java:59
-msgid "Cannot retrieve the name of an unnamed savepoint."
-msgstr "无法取得未命名储存点(Savepoint)的名称。"
+#: org/postgresql/jdbc/PgResultSet.java:3089
+#, fuzzy
+msgid "Invalid UUID data."
+msgstr "无效的旗标"
+
+#: org/postgresql/jdbc/PgResultSet.java:3178
+#: org/postgresql/jdbc/PgResultSet.java:3185
+#: org/postgresql/jdbc/PgResultSet.java:3196
+#: org/postgresql/jdbc/PgResultSet.java:3207
+#: org/postgresql/jdbc/PgResultSet.java:3218
+#: org/postgresql/jdbc/PgResultSet.java:3229
+#: org/postgresql/jdbc/PgResultSet.java:3240
+#: org/postgresql/jdbc/PgResultSet.java:3251
+#: org/postgresql/jdbc/PgResultSet.java:3262
+#: org/postgresql/jdbc/PgResultSet.java:3269
+#: org/postgresql/jdbc/PgResultSet.java:3276
+#: org/postgresql/jdbc/PgResultSet.java:3287
+#: org/postgresql/jdbc/PgResultSet.java:3304
+#: org/postgresql/jdbc/PgResultSet.java:3311
+#: org/postgresql/jdbc/PgResultSet.java:3318
+#: org/postgresql/jdbc/PgResultSet.java:3329
+#: org/postgresql/jdbc/PgResultSet.java:3336
+#: org/postgresql/jdbc/PgResultSet.java:3343
+#: org/postgresql/jdbc/PgResultSet.java:3381
+#: org/postgresql/jdbc/PgResultSet.java:3388
+#: org/postgresql/jdbc/PgResultSet.java:3395
+#: org/postgresql/jdbc/PgResultSet.java:3415
+#: org/postgresql/jdbc/PgResultSet.java:3428
+#, fuzzy, java-format
+msgid "conversion to {0} from {1} not supported"
+msgstr "不支援交易隔绝等级 {0} 。"
-#: org/postgresql/jdbc/TimestampUtils.java:298
+#: org/postgresql/jdbc/TimestampUtils.java:355
+#: org/postgresql/jdbc/TimestampUtils.java:423
#, fuzzy, java-format
msgid "Bad value for type timestamp/date/time: {1}"
msgstr "不良的类型值 {0} : {1}"
-#: org/postgresql/jdbc/TimestampUtils.java:359
-msgid ""
-"Infinite value found for timestamp/date. This cannot be represented as time."
-msgstr ""
-
-#: org/postgresql/jdbc/TimestampUtils.java:674
-#: org/postgresql/jdbc/TimestampUtils.java:710
-#: org/postgresql/jdbc/TimestampUtils.java:757
+#: org/postgresql/jdbc/TimestampUtils.java:858
+#: org/postgresql/jdbc/TimestampUtils.java:915
+#: org/postgresql/jdbc/TimestampUtils.java:961
+#: org/postgresql/jdbc/TimestampUtils.java:1010
#, fuzzy, java-format
msgid "Unsupported binary encoding of {0}."
msgstr "未被支持的类型值:{0}"
-#: org/postgresql/largeobject/LargeObjectManager.java:147
-msgid "Failed to initialize LargeObject API"
-msgstr "初始化 LargeObject API 失败"
-
-#: org/postgresql/largeobject/LargeObjectManager.java:265
-#: org/postgresql/largeobject/LargeObjectManager.java:308
-msgid "Large Objects may not be used in auto-commit mode."
-msgstr "大型对象无法被使用在自动确认事物交易模式。"
+#: org/postgresql/jdbc/PgCallableStatement.java:86
+#: org/postgresql/jdbc/PgCallableStatement.java:96
+msgid "A CallableStatement was executed with nothing returned."
+msgstr "一个 CallableStatement 执行函式后没有传回值。"
-#: org/postgresql/osgi/PGDataSourceFactory.java:85
-#, fuzzy, java-format
-msgid "Unsupported properties: {0}"
-msgstr "未被支持的类型值:{0}"
+#: org/postgresql/jdbc/PgCallableStatement.java:107
+#, fuzzy
+msgid "A CallableStatement was executed with an invalid number of parameters"
+msgstr "一个 CallableStatement 已执行包括一个无效的参数数值"
-#: org/postgresql/PGProperty.java:450 org/postgresql/PGProperty.java:470
+#: org/postgresql/jdbc/PgCallableStatement.java:145
#, java-format
-msgid "{0} parameter value must be an integer but was: {1}"
+msgid ""
+"A CallableStatement function was executed and the out parameter {0} was of "
+"type {1} however type {2} was registered."
msgstr ""
+"一个 CallableStatement 执行函式后输出的参数类型为 {1} 值为 {0},但是已注册的"
+"类型是 {2}。"
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:125
+#: org/postgresql/jdbc/PgCallableStatement.java:202
msgid ""
-"Could not find a java cryptographic algorithm: X.509 CertificateFactory not "
-"available."
-msgstr ""
+"This statement does not declare an OUT parameter. Use '{' ?= call ... '}' "
+"to declare one."
+msgstr "这个 statement 未宣告 OUT 参数,使用 '{' ?= call ... '}' 宣告一个。"
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:135
-#, java-format
-msgid "Could not open SSL certificate file {0}."
+#: org/postgresql/jdbc/PgCallableStatement.java:246
+msgid "wasNull cannot be call before fetching a result."
msgstr ""
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:140
+#: org/postgresql/jdbc/PgCallableStatement.java:384
+#: org/postgresql/jdbc/PgCallableStatement.java:403
#, java-format
-msgid "Loading the SSL certificate {0} into a KeyManager failed."
-msgstr ""
+msgid ""
+"Parameter of type {0} was registered, but call to get{1} (sqltype={2}) was "
+"made."
+msgstr "已注册参数类型 {0},但是又呼叫了get{1}(sqltype={2})。"
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:195
-msgid "Enter SSL password: "
+#: org/postgresql/jdbc/PgCallableStatement.java:424
+msgid ""
+"A CallableStatement was declared, but no call to registerOutParameter(1, "
+"<some type>) was made."
msgstr ""
+"已经宣告 CallableStatement 函式,但是尚未呼叫 registerOutParameter (1, "
+"<some_type>) 。"
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:202
-msgid "Could not read password for SSL key file, console is not available."
+#: org/postgresql/jdbc/PgCallableStatement.java:430
+msgid "No function outputs were registered."
msgstr ""
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:207
-#, java-format
-msgid "Could not read password for SSL key file by callbackhandler {0}."
+#: org/postgresql/jdbc/PgCallableStatement.java:436
+msgid ""
+"Results cannot be retrieved from a CallableStatement before it is executed."
msgstr ""
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:226
-#, java-format
-msgid "Could not decrypt SSL key file {0}."
-msgstr ""
+#: org/postgresql/jdbc/PgCallableStatement.java:703
+#, fuzzy, java-format
+msgid "Unsupported type conversion to {1}."
+msgstr "未被支持的类型值:{0}"
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:240
+#: org/postgresql/jdbc/EscapedFunctions.java:240
#, java-format
-msgid "Could not read SSL key file {0}."
-msgstr ""
+msgid "{0} function takes four and only four argument."
+msgstr "{0} 函式取得四个且仅有四个引数。"
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:243
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:162
+#: org/postgresql/jdbc/EscapedFunctions.java:270
+#: org/postgresql/jdbc/EscapedFunctions.java:344
+#: org/postgresql/jdbc/EscapedFunctions.java:749
+#: org/postgresql/jdbc/EscapedFunctions.java:787
#, java-format
-msgid "Could not find a java cryptographic algorithm: {0}."
-msgstr ""
+msgid "{0} function takes two and only two arguments."
+msgstr "{0} 函式取得二个且仅有二个引数。"
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:90
+#: org/postgresql/jdbc/EscapedFunctions.java:288
+#: org/postgresql/jdbc/EscapedFunctions.java:326
+#: org/postgresql/jdbc/EscapedFunctions.java:446
+#: org/postgresql/jdbc/EscapedFunctions.java:461
+#: org/postgresql/jdbc/EscapedFunctions.java:476
+#: org/postgresql/jdbc/EscapedFunctions.java:491
+#: org/postgresql/jdbc/EscapedFunctions.java:506
+#: org/postgresql/jdbc/EscapedFunctions.java:521
+#: org/postgresql/jdbc/EscapedFunctions.java:536
+#: org/postgresql/jdbc/EscapedFunctions.java:551
+#: org/postgresql/jdbc/EscapedFunctions.java:566
+#: org/postgresql/jdbc/EscapedFunctions.java:581
+#: org/postgresql/jdbc/EscapedFunctions.java:596
+#: org/postgresql/jdbc/EscapedFunctions.java:611
+#: org/postgresql/jdbc/EscapedFunctions.java:775
#, java-format
-msgid "The password callback class provided {0} could not be instantiated."
-msgstr ""
+msgid "{0} function takes one and only one argument."
+msgstr "{0} 函式取得一个且仅有一个引数。"
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:123
+#: org/postgresql/jdbc/EscapedFunctions.java:310
+#: org/postgresql/jdbc/EscapedFunctions.java:391
#, java-format
-msgid "Could not open SSL root certificate file {0}."
-msgstr ""
+msgid "{0} function takes two or three arguments."
+msgstr "{0} 函式取得二个或三个引数。"
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:139
+#: org/postgresql/jdbc/EscapedFunctions.java:416
+#: org/postgresql/jdbc/EscapedFunctions.java:431
+#: org/postgresql/jdbc/EscapedFunctions.java:734
+#: org/postgresql/jdbc/EscapedFunctions.java:764
#, java-format
-msgid "Could not read SSL root certificate file {0}."
-msgstr ""
+msgid "{0} function doesn''t take any argument."
+msgstr "{0} 函式无法取得任何的引数。"
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:143
+#: org/postgresql/jdbc/EscapedFunctions.java:627
+#: org/postgresql/jdbc/EscapedFunctions.java:680
#, java-format
-msgid "Loading the SSL root certificate {0} into a TrustManager failed."
-msgstr ""
-
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:156
-msgid "Could not initialize SSL context."
-msgstr ""
+msgid "{0} function takes three and only three arguments."
+msgstr "{0} 函式取得三个且仅有三个引数。"
-#: org/postgresql/ssl/MakeSSL.java:52
+#: org/postgresql/jdbc/EscapedFunctions.java:640
+#: org/postgresql/jdbc/EscapedFunctions.java:661
+#: org/postgresql/jdbc/EscapedFunctions.java:664
+#: org/postgresql/jdbc/EscapedFunctions.java:697
+#: org/postgresql/jdbc/EscapedFunctions.java:710
+#: org/postgresql/jdbc/EscapedFunctions.java:713
#, java-format
-msgid "The SSLSocketFactory class provided {0} could not be instantiated."
-msgstr ""
+msgid "Interval {0} not yet implemented"
+msgstr "隔绝 {0} 尚未被实作。"
-#: org/postgresql/ssl/MakeSSL.java:67
+#: org/postgresql/PGProperty.java:535 org/postgresql/PGProperty.java:555
#, java-format
-msgid "SSL error: {0}"
+msgid "{0} parameter value must be an integer but was: {1}"
msgstr ""
-#: org/postgresql/ssl/MakeSSL.java:78
-#, java-format
-msgid "The HostnameVerifier class provided {0} could not be instantiated."
-msgstr ""
+#: org/postgresql/largeobject/LargeObjectManager.java:144
+msgid "Failed to initialize LargeObject API"
+msgstr "初始化 LargeObject API 失败"
-#: org/postgresql/ssl/MakeSSL.java:84
-#, java-format
-msgid "The hostname {0} could not be verified by hostnameverifier {1}."
-msgstr ""
+#: org/postgresql/largeobject/LargeObjectManager.java:262
+#: org/postgresql/largeobject/LargeObjectManager.java:305
+msgid "Large Objects may not be used in auto-commit mode."
+msgstr "大型对象无法被使用在自动确认事物交易模式。"
-#: org/postgresql/ssl/MakeSSL.java:93
+#: org/postgresql/copy/PGCopyInputStream.java:51
#, java-format
-msgid "The hostname {0} could not be verified."
-msgstr ""
-
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:167
-msgid "The sslfactoryarg property may not be empty."
-msgstr ""
-
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:183
-msgid ""
-"The environment variable containing the server's SSL certificate must not be "
-"empty."
-msgstr ""
-
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:191
-msgid ""
-"The system property containing the server's SSL certificate must not be "
-"empty."
-msgstr ""
-
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:198
-msgid ""
-"The sslfactoryarg property must start with the prefix file:, classpath:, "
-"env:, sys:, or -----BEGIN CERTIFICATE-----."
+msgid "Copying from database failed: {0}"
msgstr ""
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:210
+#: org/postgresql/copy/PGCopyInputStream.java:67
+#: org/postgresql/copy/PGCopyOutputStream.java:94
#, fuzzy
-msgid "An error occurred reading the certificate"
-msgstr "进行 SSL 连线时发生错误。"
+msgid "This copy stream is closed."
+msgstr "这个 ResultSet 已经被关闭。"
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:243
-msgid "No X509TrustManager found"
+#: org/postgresql/copy/PGCopyInputStream.java:110
+msgid "Read from copy failed."
msgstr ""
-#: org/postgresql/util/PGInterval.java:155
-msgid "Conversion of interval failed"
-msgstr "隔绝(Interval)转换失败。"
-
-#: org/postgresql/util/PGmoney.java:65
-msgid "Conversion of money failed."
-msgstr "money 转换失败。"
-
-#: org/postgresql/util/ServerErrorMessage.java:165
-#, java-format
-msgid "Detail: {0}"
-msgstr "详细:{0}"
-
-#: org/postgresql/util/ServerErrorMessage.java:170
+#: org/postgresql/copy/CopyManager.java:53
#, java-format
-msgid "Hint: {0}"
-msgstr "建议:{0}"
-
-#: org/postgresql/util/ServerErrorMessage.java:174
-#, java-format
-msgid "Position: {0}"
-msgstr "位置:{0}"
+msgid "Requested CopyIn but got {0}"
+msgstr ""
-#: org/postgresql/util/ServerErrorMessage.java:178
+#: org/postgresql/copy/CopyManager.java:64
#, java-format
-msgid "Where: {0}"
-msgstr "在位置:{0}"
+msgid "Requested CopyOut but got {0}"
+msgstr ""
-#: org/postgresql/util/ServerErrorMessage.java:184
+#: org/postgresql/copy/CopyManager.java:75
#, java-format
-msgid "Internal Query: {0}"
-msgstr "内部查询:{0}"
+msgid "Requested CopyDual but got {0}"
+msgstr ""
-#: org/postgresql/util/ServerErrorMessage.java:188
+#: org/postgresql/copy/PGCopyOutputStream.java:71
#, java-format
-msgid "Internal Position: {0}"
-msgstr "内部位置:{0}"
+msgid "Cannot write to copy a byte of value {0}"
+msgstr ""
-#: org/postgresql/util/ServerErrorMessage.java:195
-#, java-format
-msgid "Location: File: {0}, Routine: {1}, Line: {2}"
-msgstr "位置:文件:{0},常式:{1},行:{2}"
+#: org/postgresql/fastpath/Fastpath.java:80
+#, fuzzy, java-format
+msgid "Fastpath call {0} - No result was returned and we expected a numeric."
+msgstr "Fastpath 呼叫 {0} - 没有传回值,且应该传回一个整数。"
-#: org/postgresql/util/ServerErrorMessage.java:200
+#: org/postgresql/fastpath/Fastpath.java:157
#, java-format
-msgid "Server SQLState: {0}"
-msgstr "服务器 SQLState:{0}"
+msgid "Fastpath call {0} - No result was returned and we expected an integer."
+msgstr "Fastpath 呼叫 {0} - 没有传回值,且应该传回一个整数。"
-#: org/postgresql/xa/PGXAConnection.java:148
+#: org/postgresql/fastpath/Fastpath.java:165
+#, fuzzy, java-format
msgid ""
-"Transaction control methods setAutoCommit(true), commit, rollback and "
-"setSavePoint not allowed while an XA transaction is active."
-msgstr ""
-
-#: org/postgresql/xa/PGXAConnection.java:196
-#: org/postgresql/xa/PGXAConnection.java:265
-msgid "Invalid flags"
-msgstr "无效的旗标"
-
-#: org/postgresql/xa/PGXAConnection.java:200
-#: org/postgresql/xa/PGXAConnection.java:269
-#: org/postgresql/xa/PGXAConnection.java:437
-msgid "xid must not be null"
-msgstr ""
-
-#: org/postgresql/xa/PGXAConnection.java:204
-msgid "Connection is busy with another transaction"
-msgstr ""
-
-#: org/postgresql/xa/PGXAConnection.java:213
-#: org/postgresql/xa/PGXAConnection.java:279
-msgid "suspend/resume not implemented"
-msgstr "暂停(suspend)/再继续(resume)尚未被实作。"
-
-#: org/postgresql/xa/PGXAConnection.java:219
-#: org/postgresql/xa/PGXAConnection.java:224
-#: org/postgresql/xa/PGXAConnection.java:228
-msgid "Transaction interleaving not implemented"
-msgstr "事物交易隔绝(Transaction interleaving)未被实作。"
-
-#: org/postgresql/xa/PGXAConnection.java:239
-msgid "Error disabling autocommit"
-msgstr ""
+"Fastpath call {0} - No result was returned or wrong size while expecting an "
+"integer."
+msgstr "Fastpath 呼叫 {0} - 没有传回值,且应该传回一个整数。"
-#: org/postgresql/xa/PGXAConnection.java:273
-msgid "tried to call end without corresponding start call"
-msgstr ""
+#: org/postgresql/fastpath/Fastpath.java:182
+#, fuzzy, java-format
+msgid "Fastpath call {0} - No result was returned and we expected a long."
+msgstr "Fastpath 呼叫 {0} - 没有传回值,且应该传回一个整数。"
-#: org/postgresql/xa/PGXAConnection.java:305
+#: org/postgresql/fastpath/Fastpath.java:190
+#, fuzzy, java-format
msgid ""
-"Not implemented: Prepare must be issued using the same connection that "
-"started the transaction"
-msgstr ""
-
-#: org/postgresql/xa/PGXAConnection.java:309
-msgid "Prepare called before end"
-msgstr ""
-
-#: org/postgresql/xa/PGXAConnection.java:317
-msgid "Server versions prior to 8.1 do not support two-phase commit."
-msgstr "8.1 版之前的服务器不支援二段式提交(Two-Phase Commit)。"
+"Fastpath call {0} - No result was returned or wrong size while expecting a "
+"long."
+msgstr "Fastpath 呼叫 {0} - 没有传回值,且应该传回一个整数。"
-#: org/postgresql/xa/PGXAConnection.java:334
-msgid "Error preparing transaction"
-msgstr ""
+#: org/postgresql/fastpath/Fastpath.java:302
+#, java-format
+msgid "The fastpath function {0} is unknown."
+msgstr "不明的 fastpath 函式 {0}。"
-#: org/postgresql/xa/PGXAConnection.java:349
-msgid "Invalid flag"
-msgstr "无效的旗标"
+#~ msgid ""
+#~ "Connection refused. Check that the hostname and port are correct and that "
+#~ "the postmaster is accepting TCP/IP connections."
+#~ msgstr ""
+#~ "连线被拒,请检查主机名称和埠号,并确定 postmaster 可以接受 TCP/IP 连线。"
-#: org/postgresql/xa/PGXAConnection.java:384
-msgid "Error during recover"
-msgstr ""
+#, fuzzy
+#~ msgid "The connection url is invalid."
+#~ msgstr "尝试连线已失败。"
-#: org/postgresql/xa/PGXAConnection.java:423
-#: org/postgresql/xa/PGXAConnection.java:426
-msgid "Error rolling back prepared transaction"
-msgstr ""
+#~ msgid "Connection rejected: {0}."
+#~ msgstr "连线已被拒绝:{0}。"
-#: org/postgresql/xa/PGXAConnection.java:464
-msgid ""
-"Not implemented: one-phase commit must be issued using the same connection "
-"that was used to start it"
-msgstr ""
+#~ msgid "Backend start-up failed: {0}."
+#~ msgstr "后端启动失败:{0}。"
-#: org/postgresql/xa/PGXAConnection.java:468
-msgid "commit called before end"
-msgstr ""
+#~ msgid "Server versions prior to 8.0 do not support savepoints."
+#~ msgstr "8.0 版之前的服务器不支援储存点(SavePints)。"
-#: org/postgresql/xa/PGXAConnection.java:478
-msgid "Error during one-phase commit"
-msgstr ""
+#~ msgid "Unexpected error while decoding character data from a large object."
+#~ msgstr "从大型对象(large object)解码字元数据时发生错误。"
-#: org/postgresql/xa/PGXAConnection.java:497
-msgid ""
-"Not implemented: 2nd phase commit must be issued using an idle connection"
-msgstr ""
+#, fuzzy
+#~ msgid ""
+#~ "Returning autogenerated keys is only supported for 8.2 and later servers."
+#~ msgstr "大型对象的截断(Truncation)仅被实作执行在 8.3 和后来的服务器。"
-#: org/postgresql/xa/PGXAConnection.java:513
-msgid "Error committing prepared transaction"
-msgstr ""
+#~ msgid "Server versions prior to 8.1 do not support two-phase commit."
+#~ msgstr "8.1 版之前的服务器不支援二段式提交(Two-Phase Commit)。"
-#: org/postgresql/xa/PGXAConnection.java:529
-msgid "Heuristic commit/rollback not supported"
-msgstr ""
+#~ msgid "Invalid flag"
+#~ msgstr "无效的旗标"
#~ msgid "The class {0} does not implement org.postgresql.util.PGobject."
#~ msgstr "类别 {0} 未实做 org.postgresql.util.PGobject。"
diff --git a/pgjdbc/src/main/java/org/postgresql/translation/zh_TW.po b/pgjdbc/src/main/java/org/postgresql/translation/zh_TW.po
index 2091ac9..764d3cd 100644
--- a/pgjdbc/src/main/java/org/postgresql/translation/zh_TW.po
+++ b/pgjdbc/src/main/java/org/postgresql/translation/zh_TW.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PostgreSQL JDBC Driver 8.3\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-01-07 13:37+0300\n"
+"POT-Creation-Date: 2018-03-10 23:24+0300\n"
"PO-Revision-Date: 2008-01-21 16:50+0800\n"
"Last-Translator: 郭朝益(ChaoYi, Kuo) <Kuo.ChaoYi at gmail.com>\n"
"Language-Team: The PostgreSQL Development Team <Kuo.ChaoYi at gmail.com>\n"
@@ -18,382 +18,375 @@ msgstr ""
"X-Poedit-Country: TAIWAN\n"
"X-Poedit-SourceCharset: utf-8\n"
-#: org/postgresql/copy/CopyManager.java:57
-#, java-format
-msgid "Requested CopyIn but got {0}"
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:164
+msgid "The sslfactoryarg property may not be empty."
msgstr ""
-#: org/postgresql/copy/CopyManager.java:69
-#, java-format
-msgid "Requested CopyOut but got {0}"
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:180
+msgid ""
+"The environment variable containing the server's SSL certificate must not be "
+"empty."
msgstr ""
-#: org/postgresql/copy/PGCopyInputStream.java:54
-#, java-format
-msgid "Copying from database failed: {0}"
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:188
+msgid ""
+"The system property containing the server's SSL certificate must not be "
+"empty."
+msgstr ""
+
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:195
+msgid ""
+"The sslfactoryarg property must start with the prefix file:, classpath:, "
+"env:, sys:, or -----BEGIN CERTIFICATE-----."
msgstr ""
-#: org/postgresql/copy/PGCopyInputStream.java:70
-#: org/postgresql/copy/PGCopyOutputStream.java:97
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:207
#, fuzzy
-msgid "This copy stream is closed."
-msgstr "這個 ResultSet 已經被關閉。"
+msgid "An error occurred reading the certificate"
+msgstr "進行 SSL 連線時發生錯誤。"
-#: org/postgresql/copy/PGCopyInputStream.java:113
-msgid "Read from copy failed."
+#: org/postgresql/ssl/SingleCertValidatingFactory.java:240
+msgid "No X509TrustManager found"
msgstr ""
-#: org/postgresql/copy/PGCopyOutputStream.java:74
-#, java-format
-msgid "Cannot write to copy a byte of value {0}"
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:133
+msgid ""
+"Could not find a java cryptographic algorithm: X.509 CertificateFactory not "
+"available."
msgstr ""
-#: org/postgresql/core/ConnectionFactory.java:74
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:143
#, java-format
-msgid "A connection could not be made using the requested protocol {0}."
-msgstr "無法以要求的通訊協定 {0} 建立連線。"
+msgid "Could not open SSL certificate file {0}."
+msgstr ""
-#: org/postgresql/core/Oid.java:114
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:148
#, java-format
-msgid "oid type {0} not known and not a number"
+msgid "Loading the SSL certificate {0} into a KeyManager failed."
msgstr ""
-#: org/postgresql/core/Parser.java:616
-#, java-format
-msgid "Malformed function or procedure escape syntax at offset {0}."
-msgstr "不正確的函式或程序 escape 語法於 {0}。"
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:205
+msgid "Enter SSL password: "
+msgstr ""
-#: org/postgresql/core/PGStream.java:497
-#, java-format
-msgid "Premature end of input stream, expected {0} bytes, but only read {1}."
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:212
+msgid "Could not read password for SSL key file, console is not available."
msgstr ""
-#: org/postgresql/core/PGStream.java:538
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:217
#, java-format
-msgid "Expected an EOF from server, got: {0}"
+msgid "Could not read password for SSL key file by callbackhandler {0}."
msgstr ""
-#: org/postgresql/core/SetupQueryRunner.java:90
-msgid "An unexpected result was returned by a query."
-msgstr "傳回非預期的查詢結果。"
-
-#: org/postgresql/core/UTF8Encoding.java:31
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:236
#, java-format
-msgid ""
-"Illegal UTF-8 sequence: byte {0} of {1} byte sequence is not 10xxxxxx: {2}"
+msgid "Could not decrypt SSL key file {0}."
msgstr ""
-#: org/postgresql/core/UTF8Encoding.java:69
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:250
#, java-format
-msgid "Illegal UTF-8 sequence: {0} bytes used to encode a {1} byte value: {2}"
+msgid "Could not read SSL key file {0}."
msgstr ""
-#: org/postgresql/core/UTF8Encoding.java:104
-#: org/postgresql/core/UTF8Encoding.java:131
+#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:253
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:176
#, java-format
-msgid "Illegal UTF-8 sequence: initial byte is {0}: {1}"
+msgid "Could not find a java cryptographic algorithm: {0}."
msgstr ""
-#: org/postgresql/core/UTF8Encoding.java:137
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:99
#, java-format
-msgid "Illegal UTF-8 sequence: final value is out of range: {0}"
+msgid "The password callback class provided {0} could not be instantiated."
msgstr ""
-#: org/postgresql/core/UTF8Encoding.java:153
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:132
#, java-format
-msgid "Illegal UTF-8 sequence: final value is a surrogate value: {0}"
+msgid "Could not open SSL root certificate file {0}."
msgstr ""
-#: org/postgresql/core/Utils.java:119 org/postgresql/core/Utils.java:136
-msgid "Zero bytes may not occur in string parameters."
-msgstr "字串參數不能有 0 個位元組。"
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:147
+#, java-format
+msgid "Could not read SSL root certificate file {0}."
+msgstr ""
-#: org/postgresql/core/Utils.java:146 org/postgresql/core/Utils.java:217
-msgid "No IOException expected from StringBuffer or StringBuilder"
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:151
+#, java-format
+msgid "Loading the SSL root certificate {0} into a TrustManager failed."
msgstr ""
-#: org/postgresql/core/Utils.java:206
-msgid "Zero bytes may not occur in identifiers."
-msgstr "在標識識別符中不存在零位元組。"
+#: org/postgresql/ssl/jdbc4/LibPQFactory.java:170
+msgid "Could not initialize SSL context."
+msgstr ""
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:72
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:87
-#, fuzzy, java-format
-msgid "Invalid sslmode value: {0}"
-msgstr "無效的串流長度 {0}."
+#: org/postgresql/ssl/MakeSSL.java:52
+#, java-format
+msgid "The SSLSocketFactory class provided {0} could not be instantiated."
+msgstr ""
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:87
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:111
-#, fuzzy, java-format
-msgid "Invalid targetServerType value: {0}"
-msgstr "無效的串流長度 {0}."
+#: org/postgresql/ssl/MakeSSL.java:67
+#, java-format
+msgid "SSL error: {0}"
+msgstr ""
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:152
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:228
+#: org/postgresql/ssl/MakeSSL.java:78
#, java-format
-msgid "Could not find a server with specified targetServerType: {0}"
+msgid "The HostnameVerifier class provided {0} could not be instantiated."
msgstr ""
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:172
-msgid ""
-"Connection refused. Check that the hostname and port are correct and that "
-"the postmaster is accepting TCP/IP connections."
+#: org/postgresql/ssl/MakeSSL.java:84
+#, java-format
+msgid "The hostname {0} could not be verified by hostnameverifier {1}."
msgstr ""
-"連線被拒,請檢查主機名稱和埠號,並確定 postmaster 可以接受 TCP/IP 連線。"
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:181
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:262
-msgid "The connection attempt failed."
-msgstr "嘗試連線已失敗。"
+#: org/postgresql/ssl/MakeSSL.java:93
+#, java-format
+msgid "The hostname {0} could not be verified."
+msgstr ""
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:192
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:273
-#, fuzzy
-msgid "The connection url is invalid."
-msgstr "嘗試連線已失敗。"
+#: org/postgresql/gss/GssAction.java:126
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2550
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2581
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2585
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2640
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2650
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2659
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:655
+msgid "Protocol error. Session setup failed."
+msgstr "通訊協定錯誤,Session 初始化失敗。"
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:218
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:233
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:324
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:339
-msgid "The server does not support SSL."
-msgstr "伺服器不支援 SSL 連線。"
+#: org/postgresql/gss/GssAction.java:137 org/postgresql/gss/MakeGSS.java:66
+#: org/postgresql/gss/MakeGSS.java:74
+msgid "GSS Authentication failed"
+msgstr ""
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:249
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:355
-msgid "An error occurred while setting up the SSL connection."
-msgstr "進行 SSL 連線時發生錯誤。"
+#: org/postgresql/core/Parser.java:933
+#, java-format
+msgid "Malformed function or procedure escape syntax at offset {0}."
+msgstr "不正確的函式或程序 escape 語法於 {0}。"
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:300
+#: org/postgresql/core/SocketFactoryFactory.java:41
#, java-format
-msgid "Connection rejected: {0}."
-msgstr "連線已被拒絕:{0}。"
+msgid "The SocketFactory class provided {0} could not be instantiated."
+msgstr ""
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:321
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:349
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:375
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:456
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:486
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:515
-msgid ""
-"The server requested password-based authentication, but no password was "
-"provided."
-msgstr "伺服器要求使用密碼驗證,但是密碼並未提供。"
+#: org/postgresql/core/Utils.java:93 org/postgresql/core/Utils.java:110
+msgid "Zero bytes may not occur in string parameters."
+msgstr "字串參數不能有 0 個位元組。"
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:405
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:625
-#, java-format
-msgid ""
-"The authentication type {0} is not supported. Check that you have configured "
-"the pg_hba.conf file to include the client''s IP address or subnet, and that "
-"it is using an authentication scheme supported by the driver."
+#: org/postgresql/core/Utils.java:120 org/postgresql/core/Utils.java:170
+msgid "No IOException expected from StringBuffer or StringBuilder"
msgstr ""
-"不支援 {0} 驗證型別。請核對您已經組態 pg_hba.conf 檔案包含客戶端的IP位址或網"
-"路區段,以及驅動程式所支援的驗證架構模式已被支援。"
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:412
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:455
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:632
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:688
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:744
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:754
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:763
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:774
-#: org/postgresql/gss/GssAction.java:130
-msgid "Protocol error. Session setup failed."
-msgstr "通訊協定錯誤,Session 初始化失敗。"
+#: org/postgresql/core/Utils.java:159
+msgid "Zero bytes may not occur in identifiers."
+msgstr "在標識識別符中不存在零位元組。"
-#: org/postgresql/core/v2/ConnectionFactoryImpl.java:443
-#, java-format
-msgid "Backend start-up failed: {0}."
-msgstr "後端啟動失敗:{0}。"
-
-#: org/postgresql/core/v2/FastpathParameterList.java:63
-#: org/postgresql/core/v2/FastpathParameterList.java:89
-#: org/postgresql/core/v2/FastpathParameterList.java:100
-#: org/postgresql/core/v2/FastpathParameterList.java:111
-#: org/postgresql/core/v2/SimpleParameterList.java:70
-#: org/postgresql/core/v2/SimpleParameterList.java:94
-#: org/postgresql/core/v2/SimpleParameterList.java:105
-#: org/postgresql/core/v2/SimpleParameterList.java:116
-#: org/postgresql/core/v2/SimpleParameterList.java:127
-#: org/postgresql/core/v3/CompositeParameterList.java:36
-#: org/postgresql/core/v3/SimpleParameterList.java:53
-#: org/postgresql/core/v3/SimpleParameterList.java:64
-#: org/postgresql/jdbc/PgResultSet.java:2715
-#: org/postgresql/jdbc/PgResultSetMetaData.java:472
+#: org/postgresql/core/UTF8Encoding.java:28
#, java-format
-msgid "The column index is out of range: {0}, number of columns: {1}."
-msgstr "欄位索引超過許可範圍:{0},欄位數:{1}。"
+msgid ""
+"Illegal UTF-8 sequence: byte {0} of {1} byte sequence is not 10xxxxxx: {2}"
+msgstr ""
-#: org/postgresql/core/v2/FastpathParameterList.java:164
-#: org/postgresql/core/v2/SimpleParameterList.java:191
-#: org/postgresql/core/v3/SimpleParameterList.java:225
+#: org/postgresql/core/UTF8Encoding.java:66
#, java-format
-msgid "No value specified for parameter {0}."
-msgstr "未設定參數值 {0} 的內容。"
+msgid "Illegal UTF-8 sequence: {0} bytes used to encode a {1} byte value: {2}"
+msgstr ""
-#: org/postgresql/core/v2/QueryExecutorImpl.java:87
-#: org/postgresql/core/v2/QueryExecutorImpl.java:347
-#: org/postgresql/core/v3/QueryExecutorImpl.java:404
-#: org/postgresql/core/v3/QueryExecutorImpl.java:465
+#: org/postgresql/core/UTF8Encoding.java:102
+#: org/postgresql/core/UTF8Encoding.java:129
#, java-format
-msgid "Expected command status BEGIN, got {0}."
+msgid "Illegal UTF-8 sequence: initial byte is {0}: {1}"
msgstr ""
-#: org/postgresql/core/v2/QueryExecutorImpl.java:92
-#: org/postgresql/core/v3/QueryExecutorImpl.java:470
-#: org/postgresql/jdbc/PgResultSet.java:1731
+#: org/postgresql/core/UTF8Encoding.java:135
#, java-format
-msgid "Unexpected command status: {0}."
+msgid "Illegal UTF-8 sequence: final value is out of range: {0}"
msgstr ""
-#: org/postgresql/core/v2/QueryExecutorImpl.java:127
-#: org/postgresql/core/v2/QueryExecutorImpl.java:136
-#: org/postgresql/core/v2/QueryExecutorImpl.java:185
-#: org/postgresql/core/v2/QueryExecutorImpl.java:376
-#: org/postgresql/core/v3/QueryExecutorImpl.java:226
-#: org/postgresql/core/v3/QueryExecutorImpl.java:364
-#: org/postgresql/core/v3/QueryExecutorImpl.java:441
-#: org/postgresql/core/v3/QueryExecutorImpl.java:505
-#: org/postgresql/core/v3/QueryExecutorImpl.java:587
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2211
-#: org/postgresql/util/StreamWrapper.java:133
-#, fuzzy
-msgid "An I/O error occurred while sending to the backend."
-msgstr "傳送資料至後端時發生 I/O 錯誤。"
-
-#: org/postgresql/core/v2/QueryExecutorImpl.java:180
-#: org/postgresql/core/v2/QueryExecutorImpl.java:235
-#: org/postgresql/core/v2/QueryExecutorImpl.java:249
-#: org/postgresql/core/v3/QueryExecutorImpl.java:582
-#: org/postgresql/core/v3/QueryExecutorImpl.java:642
+#: org/postgresql/core/UTF8Encoding.java:151
#, java-format
-msgid "Unknown Response Type {0}."
-msgstr "不明的回應類型 {0}。"
-
-#: org/postgresql/core/v2/QueryExecutorImpl.java:453
-#: org/postgresql/core/v2/QueryExecutorImpl.java:503
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1962
-msgid "Ran out of memory retrieving query results."
+msgid "Illegal UTF-8 sequence: final value is a surrogate value: {0}"
msgstr ""
-#: org/postgresql/core/v2/QueryExecutorImpl.java:640
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2328
-#, java-format
-msgid "Unable to interpret the update count in command completion tag: {0}."
-msgstr "無法解讀命令完成標籤中的更新計數:{0}。"
+#: org/postgresql/core/SetupQueryRunner.java:64
+msgid "An unexpected result was returned by a query."
+msgstr "傳回非預期的查詢結果。"
-#: org/postgresql/core/v2/QueryExecutorImpl.java:654
-msgid "Copy not implemented for protocol version 2"
+#: org/postgresql/core/PGStream.java:486
+#, java-format
+msgid "Premature end of input stream, expected {0} bytes, but only read {1}."
msgstr ""
-#: org/postgresql/core/v2/SocketFactoryFactory.java:36
+#: org/postgresql/core/PGStream.java:528
#, java-format
-msgid "The SocketFactory class provided {0} could not be instantiated."
+msgid "Expected an EOF from server, got: {0}"
msgstr ""
-#: org/postgresql/core/v3/ConnectionFactoryImpl.java:253
-#, fuzzy, java-format
-msgid ""
-"Connection to {0} refused. Check that the hostname and port are correct and "
-"that the postmaster is accepting TCP/IP connections."
+#: org/postgresql/core/v3/CopyOperationImpl.java:54
+msgid "CommandComplete expected COPY but got: "
msgstr ""
-"連線被拒,請檢查主機名稱和埠號,並確定 postmaster 可以接受 TCP/IP 連線。"
-#: org/postgresql/core/v3/CopyOperationImpl.java:57
-msgid "CommandComplete expected COPY but got: "
+#: org/postgresql/core/v3/CopyInImpl.java:47
+msgid "CopyIn copy direction can't receive data"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:83
+#: org/postgresql/core/v3/QueryExecutorImpl.java:161
msgid "Tried to obtain lock while already holding it"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:98
+#: org/postgresql/core/v3/QueryExecutorImpl.java:177
msgid "Tried to break lock on database connection"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:115
+#: org/postgresql/core/v3/QueryExecutorImpl.java:195
msgid "Interrupted while waiting to obtain lock on database connection"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:220
+#: org/postgresql/core/v3/QueryExecutorImpl.java:327
msgid "Unable to bind parameter values for statement."
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:689
+#: org/postgresql/core/v3/QueryExecutorImpl.java:333
+#: org/postgresql/core/v3/QueryExecutorImpl.java:485
+#: org/postgresql/core/v3/QueryExecutorImpl.java:559
+#: org/postgresql/core/v3/QueryExecutorImpl.java:602
+#: org/postgresql/core/v3/QueryExecutorImpl.java:729
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2372
+#: org/postgresql/util/StreamWrapper.java:130
+#, fuzzy
+msgid "An I/O error occurred while sending to the backend."
+msgstr "傳送資料至後端時發生 I/O 錯誤。"
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:534
+#: org/postgresql/core/v3/QueryExecutorImpl.java:576
+#, java-format
+msgid "Expected command status BEGIN, got {0}."
+msgstr ""
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:581
+#: org/postgresql/jdbc/PgResultSet.java:1778
+#, java-format
+msgid "Unexpected command status: {0}."
+msgstr ""
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:687
+#, fuzzy
+msgid "An error occurred while trying to get the socket timeout."
+msgstr "傳送資料至後端時發生 I/O 錯誤。"
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:722
+#: org/postgresql/core/v3/QueryExecutorImpl.java:798
+#, java-format
+msgid "Unknown Response Type {0}."
+msgstr "不明的回應類型 {0}。"
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:745
+#, fuzzy
+msgid "An error occurred while trying to reset the socket timeout."
+msgstr "傳送資料至後端時發生 I/O 錯誤。"
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:843
msgid "Database connection failed when starting copy"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:724
+#: org/postgresql/core/v3/QueryExecutorImpl.java:878
msgid "Tried to cancel an inactive copy operation"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:765
+#: org/postgresql/core/v3/QueryExecutorImpl.java:917
msgid "Database connection failed when canceling copy operation"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:781
+#: org/postgresql/core/v3/QueryExecutorImpl.java:933
msgid "Missing expected error response to copy cancel request"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:785
+#: org/postgresql/core/v3/QueryExecutorImpl.java:937
#, java-format
msgid "Got {0} error responses to single copy cancel request"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:800
+#: org/postgresql/core/v3/QueryExecutorImpl.java:952
msgid "Tried to end inactive copy"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:815
+#: org/postgresql/core/v3/QueryExecutorImpl.java:967
msgid "Database connection failed when ending copy"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:833
-#: org/postgresql/core/v3/QueryExecutorImpl.java:855
+#: org/postgresql/core/v3/QueryExecutorImpl.java:985
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1005
msgid "Tried to write to an inactive copy operation"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:848
-#: org/postgresql/core/v3/QueryExecutorImpl.java:863
+#: org/postgresql/core/v3/QueryExecutorImpl.java:998
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1013
msgid "Database connection failed when writing to copy"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:877
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1028
msgid "Tried to read from inactive copy"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:884
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1035
msgid "Database connection failed when reading from copy"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:956
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1101
#, java-format
msgid "Received CommandComplete ''{0}'' without an active copy operation"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:983
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1126
#, java-format
msgid "Got CopyInResponse from server during an active {0}"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:999
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1140
#, java-format
msgid "Got CopyOutResponse from server during an active {0}"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1017
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1154
+#, java-format
+msgid "Got CopyBothResponse from server during an active {0}"
+msgstr ""
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1170
msgid "Got CopyData without an active copy operation"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1021
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1174
#, java-format
msgid "Unexpected copydata from server for {0}"
msgstr ""
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1061
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2037
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1234
+#, java-format
+msgid "Unexpected packet type during copy: {0}"
+msgstr ""
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:1524
+#, java-format
+msgid ""
+"Bind message length {0} too long. This can be caused by very large or "
+"incorrect length specifications on InputStream parameters."
+msgstr ""
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2145
+msgid "Ran out of memory retrieving query results."
+msgstr ""
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2313
+msgid "The driver currently does not support COPY operations."
+msgstr "驅動程式目前不支援 COPY 操作。"
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2487
+#, fuzzy, java-format
+msgid "Unable to parse the count in command completion tag: {0}."
+msgstr "無法解讀命令完成標籤中的更新計數:{0}。"
+
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2603
#, fuzzy, java-format
msgid ""
"The server''s client_encoding parameter was changed to {0}. The JDBC driver "
@@ -402,8 +395,7 @@ msgstr ""
"這伺服器的 client_encoding 參數被改成 {0},JDBC 驅動程式請求需要 "
"client_encoding 為 UNICODE 以正確工作。"
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1069
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2045
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2611
#, java-format
msgid ""
"The server''s DateStyle parameter was changed to {0}. The JDBC driver "
@@ -412,8 +404,7 @@ msgstr ""
"這伺服器的 DateStyle 參數被更改成 {0},JDBC 驅動程式請求需要 DateStyle 以 "
"ISO 開頭以正確工作。"
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1083
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2059
+#: org/postgresql/core/v3/QueryExecutorImpl.java:2624
#, java-format
msgid ""
"The server''s standard_conforming_strings parameter was reported as {0}. The "
@@ -422,58 +413,189 @@ msgstr ""
"這伺服器的 standard_conforming_strings 參數已回報為 {0},JDBC 驅動程式已預期"
"開啟或是關閉。"
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1122
+#: org/postgresql/core/v3/SimpleParameterList.java:54
+#: org/postgresql/core/v3/SimpleParameterList.java:65
+#: org/postgresql/core/v3/CompositeParameterList.java:33
+#: org/postgresql/jdbc/PgResultSetMetaData.java:493
+#: org/postgresql/jdbc/PgResultSet.java:2751
#, java-format
-msgid "Unexpected packet type during copy: {0}"
-msgstr ""
+msgid "The column index is out of range: {0}, number of columns: {1}."
+msgstr "欄位索引超過許可範圍:{0},欄位數:{1}。"
-#: org/postgresql/core/v3/QueryExecutorImpl.java:1393
+#: org/postgresql/core/v3/SimpleParameterList.java:257
#, java-format
-msgid ""
-"Bind message length {0} too long. This can be caused by very large or "
-"incorrect length specifications on InputStream parameters."
-msgstr ""
-
-#: org/postgresql/core/v3/QueryExecutorImpl.java:2131
-msgid "The driver currently does not support COPY operations."
-msgstr "驅動程式目前不支援 COPY 操作。"
+msgid "No value specified for parameter {0}."
+msgstr "未設定參數值 {0} 的內容。"
-#: org/postgresql/Driver.java:234
-msgid "Error loading default settings from driverconfig.properties"
-msgstr ""
+#: org/postgresql/core/v3/SimpleParameterList.java:431
+#, fuzzy, java-format
+msgid "Added parameters index out of range: {0}, number of columns: {1}."
+msgstr "參數索引超出許可範圍:{0},參數總數:{1}。"
-#: org/postgresql/Driver.java:247
-msgid "Properties for the driver contains a non-string value for the key "
-msgstr ""
+#: org/postgresql/core/v3/replication/V3ReplicationProtocol.java:133
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:257
+msgid "The connection attempt failed."
+msgstr "嘗試連線已失敗。"
-#: org/postgresql/Driver.java:290
-msgid ""
-"Your security policy has prevented the connection from being attempted. You "
-"probably need to grant the connect java.net.SocketPermission to the database "
-"server host and port that you wish to connect to."
+#: org/postgresql/core/v3/replication/V3PGReplicationStream.java:144
+#, java-format
+msgid "Unexpected packet type during replication: {0}"
msgstr ""
-#: org/postgresql/Driver.java:296 org/postgresql/Driver.java:362
-msgid ""
-"Something unusual has occurred to cause the driver to fail. Please report "
-"this exception."
-msgstr "不明的原因導致驅動程式造成失敗,請回報這個例外。"
+#: org/postgresql/core/v3/replication/V3PGReplicationStream.java:269
+#, fuzzy
+msgid "This replication stream has been closed."
+msgstr "Connection 已經被關閉。"
-#: org/postgresql/Driver.java:370
-msgid "Connection attempt timed out."
-msgstr "Connection 嘗試逾時。"
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:109
+#, fuzzy, java-format
+msgid "Invalid sslmode value: {0}"
+msgstr "無效的串流長度 {0}."
-#: org/postgresql/Driver.java:383
-msgid "Interrupted while attempting to connect."
-msgstr ""
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:124
+#, fuzzy, java-format
+msgid "Invalid targetServerType value: {0}"
+msgstr "無效的串流長度 {0}."
-#: org/postgresql/Driver.java:645
-#, java-format
-msgid "Method {0} is not yet implemented."
-msgstr "這個 {0} 方法尚未被實作。"
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:246
+#, fuzzy, java-format
+msgid ""
+"Connection to {0} refused. Check that the hostname and port are correct and "
+"that the postmaster is accepting TCP/IP connections."
+msgstr ""
+"連線被拒,請檢查主機名稱和埠號,並確定 postmaster 可以接受 TCP/IP 連線。"
+
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:272
+#, java-format
+msgid "Could not find a server with specified targetServerType: {0}"
+msgstr ""
+
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:366
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:379
+msgid "The server does not support SSL."
+msgstr "伺服器不支援 SSL 連線。"
+
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:393
+msgid "An error occurred while setting up the SSL connection."
+msgstr "進行 SSL 連線時發生錯誤。"
+
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:494
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:521
+msgid ""
+"The server requested password-based authentication, but no password was "
+"provided."
+msgstr "伺服器要求使用密碼驗證,但是密碼並未提供。"
+
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:624
+msgid ""
+"SCRAM authentication is not supported by this driver. You need JDK >= 8 and "
+"pgjdbc >= 42.2.0 (not \".jre\" vesions)"
+msgstr ""
+
+#: org/postgresql/core/v3/ConnectionFactoryImpl.java:648
+#, java-format
+msgid ""
+"The authentication type {0} is not supported. Check that you have configured "
+"the pg_hba.conf file to include the client''s IP address or subnet, and that "
+"it is using an authentication scheme supported by the driver."
+msgstr ""
+"不支援 {0} 驗證型別。請核對您已經組態 pg_hba.conf 檔案包含客戶端的IP位址或網"
+"路區段,以及驅動程式所支援的驗證架構模式已被支援。"
+
+#: org/postgresql/core/ConnectionFactory.java:57
+#, java-format
+msgid "A connection could not be made using the requested protocol {0}."
+msgstr "無法以要求的通訊協定 {0} 建立連線。"
+
+#: org/postgresql/core/Oid.java:116
+#, java-format
+msgid "oid type {0} not known and not a number"
+msgstr ""
+
+#: org/postgresql/util/HStoreConverter.java:43
+#: org/postgresql/util/HStoreConverter.java:74
+#: org/postgresql/jdbc/PgArray.java:210
+#: org/postgresql/jdbc/PgResultSet.java:1924
+msgid ""
+"Invalid character data was found. This is most likely caused by stored data "
+"containing characters that are invalid for the character set the database "
+"was created in. The most common example of this is storing 8bit data in a "
+"SQL_ASCII database."
+msgstr ""
+"發現不合法的字元,可能的原因是欲儲存的資料中包含資料庫的字元集不支援的字碼,"
+"其中最常見例子的就是將 8 位元資料存入使用 SQL_ASCII 編碼的資料庫中。"
+
+#: org/postgresql/util/PGmoney.java:62
+msgid "Conversion of money failed."
+msgstr "money 轉換失敗。"
+
+#: org/postgresql/util/StreamWrapper.java:56
+#: org/postgresql/jdbc/PgPreparedStatement.java:1449
+msgid "Object is too large to send over the protocol."
+msgstr ""
+
+#: org/postgresql/util/PGInterval.java:152
+msgid "Conversion of interval failed"
+msgstr "隔絕(Interval)轉換失敗。"
+
+#: org/postgresql/util/ServerErrorMessage.java:45
+#, java-format
+msgid ""
+" (pgjdbc: autodetected server-encoding to be {0}, if the message is not "
+"readable, please check database logs and/or host, port, dbname, user, "
+"password, pg_hba.conf)"
+msgstr ""
+
+#: org/postgresql/util/ServerErrorMessage.java:176
+#, java-format
+msgid "Detail: {0}"
+msgstr "詳細:{0}"
+
+#: org/postgresql/util/ServerErrorMessage.java:181
+#, java-format
+msgid "Hint: {0}"
+msgstr "建議:{0}"
+
+#: org/postgresql/util/ServerErrorMessage.java:185
+#, java-format
+msgid "Position: {0}"
+msgstr "位置:{0}"
+
+#: org/postgresql/util/ServerErrorMessage.java:189
+#, java-format
+msgid "Where: {0}"
+msgstr "在位置:{0}"
-#: org/postgresql/ds/common/BaseDataSource.java:1037
-#: org/postgresql/ds/common/BaseDataSource.java:1047
+#: org/postgresql/util/ServerErrorMessage.java:195
+#, java-format
+msgid "Internal Query: {0}"
+msgstr "內部查詢:{0}"
+
+#: org/postgresql/util/ServerErrorMessage.java:199
+#, java-format
+msgid "Internal Position: {0}"
+msgstr "內部位置:{0}"
+
+#: org/postgresql/util/ServerErrorMessage.java:206
+#, java-format
+msgid "Location: File: {0}, Routine: {1}, Line: {2}"
+msgstr "位置:檔案:{0},常式:{1},行:{2}"
+
+#: org/postgresql/util/ServerErrorMessage.java:211
+#, java-format
+msgid "Server SQLState: {0}"
+msgstr "伺服器 SQLState:{0}"
+
+#: org/postgresql/ds/PGPoolingDataSource.java:269
+msgid "Failed to setup DataSource."
+msgstr ""
+
+#: org/postgresql/ds/PGPoolingDataSource.java:371
+msgid "DataSource has been closed."
+msgstr "DataSource 已經被關閉。"
+
+#: org/postgresql/ds/common/BaseDataSource.java:1132
+#: org/postgresql/ds/common/BaseDataSource.java:1142
#, fuzzy, java-format
msgid "Unsupported property name: {0}"
msgstr "未被支持的型別值:{0}"
@@ -482,7 +604,7 @@ msgstr "未被支持的型別值:{0}"
msgid "This PooledConnection has already been closed."
msgstr "這個 PooledConnection 已經被關閉。"
-#: org/postgresql/ds/PGPooledConnection.java:313
+#: org/postgresql/ds/PGPooledConnection.java:314
msgid ""
"Connection has been closed automatically because a new connection was opened "
"for the same PooledConnection or the PooledConnection has been closed."
@@ -490,1057 +612,1056 @@ msgstr ""
"Connection 已自動結束,因為一個新的 PooledConnection 連線被開啟或者或 "
"PooledConnection 已被關閉。"
-#: org/postgresql/ds/PGPooledConnection.java:314
+#: org/postgresql/ds/PGPooledConnection.java:315
msgid "Connection has been closed."
msgstr "Connection 已經被關閉。"
-#: org/postgresql/ds/PGPooledConnection.java:418
+#: org/postgresql/ds/PGPooledConnection.java:420
msgid "Statement has been closed."
msgstr "Sstatement 已經被關閉。"
-#: org/postgresql/ds/PGPoolingDataSource.java:269
-msgid "Failed to setup DataSource."
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:68
+msgid "No SCRAM mechanism(s) advertised by the server"
msgstr ""
-#: org/postgresql/ds/PGPoolingDataSource.java:371
-msgid "DataSource has been closed."
-msgstr "DataSource 已經被關閉。"
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:81
+msgid "Invalid or unsupported by client SCRAM mechanisms"
+msgstr ""
-#: org/postgresql/fastpath/Fastpath.java:82
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:117
#, fuzzy, java-format
-msgid "Fastpath call {0} - No result was returned and we expected a numeric."
-msgstr "Fastpath 呼叫 {0} - 沒有傳回值,且應該傳回一個整數。"
+msgid "Invalid server-first-message: {0}"
+msgstr "無效的串流長度 {0}."
-#: org/postgresql/fastpath/Fastpath.java:165
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:147
+#, fuzzy, java-format
+msgid "Invalid server-final-message: {0}"
+msgstr "無效的串流長度 {0}."
+
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:153
#, java-format
-msgid "Fastpath call {0} - No result was returned and we expected an integer."
-msgstr "Fastpath 呼叫 {0} - 沒有傳回值,且應該傳回一個整數。"
+msgid "SCRAM authentication failed, server returned error: {0}"
+msgstr ""
-#: org/postgresql/fastpath/Fastpath.java:174
-#, fuzzy, java-format
-msgid ""
-"Fastpath call {0} - No result was returned or wrong size while expecting an "
-"integer."
-msgstr "Fastpath 呼叫 {0} - 沒有傳回值,且應該傳回一個整數。"
+#: org/postgresql/jre8/sasl/ScramAuthenticator.java:160
+msgid "Invalid server SCRAM signature"
+msgstr ""
-#: org/postgresql/fastpath/Fastpath.java:191
+#: org/postgresql/osgi/PGDataSourceFactory.java:82
#, fuzzy, java-format
-msgid "Fastpath call {0} - No result was returned and we expected a long."
-msgstr "Fastpath 呼叫 {0} - 沒有傳回值,且應該傳回一個整數。"
+msgid "Unsupported properties: {0}"
+msgstr "未被支持的型別值:{0}"
-#: org/postgresql/fastpath/Fastpath.java:200
-#, fuzzy, java-format
+#: org/postgresql/Driver.java:214
+msgid "Error loading default settings from driverconfig.properties"
+msgstr ""
+
+#: org/postgresql/Driver.java:226
+msgid "Properties for the driver contains a non-string value for the key "
+msgstr ""
+
+#: org/postgresql/Driver.java:270
msgid ""
-"Fastpath call {0} - No result was returned or wrong size while expecting a "
-"long."
-msgstr "Fastpath 呼叫 {0} - 沒有傳回值,且應該傳回一個整數。"
+"Your security policy has prevented the connection from being attempted. You "
+"probably need to grant the connect java.net.SocketPermission to the database "
+"server host and port that you wish to connect to."
+msgstr ""
-#: org/postgresql/fastpath/Fastpath.java:312
+#: org/postgresql/Driver.java:276 org/postgresql/Driver.java:408
+msgid ""
+"Something unusual has occurred to cause the driver to fail. Please report "
+"this exception."
+msgstr "不明的原因導致驅動程式造成失敗,請回報這個例外。"
+
+#: org/postgresql/Driver.java:416
+msgid "Connection attempt timed out."
+msgstr "Connection 嘗試逾時。"
+
+#: org/postgresql/Driver.java:429
+msgid "Interrupted while attempting to connect."
+msgstr ""
+
+#: org/postgresql/Driver.java:682
#, java-format
-msgid "The fastpath function {0} is unknown."
-msgstr "不明的 fastpath 函式 {0}。"
+msgid "Method {0} is not yet implemented."
+msgstr "這個 {0} 方法尚未被實作。"
-#: org/postgresql/geometric/PGbox.java:79
-#: org/postgresql/geometric/PGcircle.java:76
-#: org/postgresql/geometric/PGcircle.java:84
-#: org/postgresql/geometric/PGline.java:109
-#: org/postgresql/geometric/PGline.java:118
-#: org/postgresql/geometric/PGlseg.java:72
-#: org/postgresql/geometric/PGpoint.java:78
+#: org/postgresql/geometric/PGlseg.java:70
+#: org/postgresql/geometric/PGline.java:107
+#: org/postgresql/geometric/PGline.java:116
+#: org/postgresql/geometric/PGcircle.java:74
+#: org/postgresql/geometric/PGcircle.java:82
+#: org/postgresql/geometric/PGpoint.java:76
+#: org/postgresql/geometric/PGbox.java:77
#, java-format
msgid "Conversion to type {0} failed: {1}."
msgstr "轉換型別 {0} 失敗:{1}。"
-#: org/postgresql/geometric/PGpath.java:73
+#: org/postgresql/geometric/PGpath.java:70
#, java-format
msgid "Cannot tell if path is open or closed: {0}."
msgstr "無法得知 path 是開啟或關閉:{0}。"
-#: org/postgresql/gss/GssAction.java:141 org/postgresql/gss/MakeGSS.java:69
-#: org/postgresql/gss/MakeGSS.java:77
-msgid "GSS Authentication failed"
+#: org/postgresql/xa/PGXAConnection.java:128
+msgid ""
+"Transaction control methods setAutoCommit(true), commit, rollback and "
+"setSavePoint not allowed while an XA transaction is active."
msgstr ""
-#: org/postgresql/jdbc/AbstractBlobClob.java:89
-msgid ""
-"Truncation of large objects is only implemented in 8.3 and later servers."
-msgstr "大型物件的截斷(Truncation)僅被實作執行在 8.3 和後來的伺服器。"
+#: org/postgresql/xa/PGXAConnection.java:177
+#: org/postgresql/xa/PGXAConnection.java:253
+#: org/postgresql/xa/PGXAConnection.java:347
+#, java-format
+msgid "Invalid flags {0}"
+msgstr "無效的旗標 {0}"
-#: org/postgresql/jdbc/AbstractBlobClob.java:94
-msgid "Cannot truncate LOB to a negative length."
+#: org/postgresql/xa/PGXAConnection.java:181
+#: org/postgresql/xa/PGXAConnection.java:257
+#: org/postgresql/xa/PGXAConnection.java:449
+msgid "xid must not be null"
msgstr ""
-#: org/postgresql/jdbc/AbstractBlobClob.java:101
-#: org/postgresql/jdbc/AbstractBlobClob.java:245
+#: org/postgresql/xa/PGXAConnection.java:185
+msgid "Connection is busy with another transaction"
+msgstr ""
+
+#: org/postgresql/xa/PGXAConnection.java:194
+#: org/postgresql/xa/PGXAConnection.java:267
+msgid "suspend/resume not implemented"
+msgstr "暫停(suspend)/再繼續(resume)尚未被實作。"
+
+#: org/postgresql/xa/PGXAConnection.java:202
+#: org/postgresql/xa/PGXAConnection.java:209
+#: org/postgresql/xa/PGXAConnection.java:213
#, java-format
-msgid "PostgreSQL LOBs can only index to: {0}"
-msgstr "PostgreSQL LOBs 僅能索引到:{0}"
+msgid ""
+"Invalid protocol state requested. Attempted transaction interleaving is not "
+"supported. xid={0}, currentXid={1}, state={2}, flags={3}"
+msgstr ""
+"事物交易隔絕(Transaction interleaving)未被實作。xid={0}, currentXid={1}, "
+"state={2}, flags={3}"
-#: org/postgresql/jdbc/AbstractBlobClob.java:241
-msgid "LOB positioning offsets start at 1."
+#: org/postgresql/xa/PGXAConnection.java:224
+msgid "Error disabling autocommit"
msgstr ""
-#: org/postgresql/jdbc/AbstractBlobClob.java:257
-msgid "free() was called on this LOB previously"
+#: org/postgresql/xa/PGXAConnection.java:261
+#, java-format
+msgid ""
+"tried to call end without corresponding start call. state={0}, start "
+"xid={1}, currentXid={2}, preparedXid={3}"
msgstr ""
-#: org/postgresql/jdbc/BatchResultHandler.java:41
-#: org/postgresql/jdbc/PgConnection.java:474
-#: org/postgresql/jdbc/PgPreparedStatement.java:138
-#: org/postgresql/jdbc/PgStatement.java:299
-msgid "A result was returned when none was expected."
-msgstr "傳回預期之外的結果。"
+#: org/postgresql/xa/PGXAConnection.java:297
+#, java-format
+msgid ""
+"Preparing already prepared transaction, the prepared xid {0}, prepare xid={1}"
+msgstr ""
-#: org/postgresql/jdbc/BatchResultHandler.java:59
-msgid "Too many update results were returned."
+#: org/postgresql/xa/PGXAConnection.java:300
+#, java-format
+msgid "Current connection does not have an associated xid. prepare xid={0}"
msgstr ""
-#: org/postgresql/jdbc/BatchResultHandler.java:88
+#: org/postgresql/xa/PGXAConnection.java:307
#, java-format
msgid ""
-"Batch entry {0} {1} was aborted. Call getNextException to see the cause."
-msgstr "批次處理 {0} {1} 被中止,呼叫 getNextException 以取得原因。"
+"Not implemented: Prepare must be issued using the same connection that "
+"started the transaction. currentXid={0}, prepare xid={1}"
+msgstr ""
-#: org/postgresql/jdbc/EscapedFunctions.java:243
+#: org/postgresql/xa/PGXAConnection.java:311
#, java-format
-msgid "{0} function takes four and only four argument."
-msgstr "{0} 函式取得四個且僅有四個引數。"
+msgid "Prepare called before end. prepare xid={0}, state={1}"
+msgstr ""
-#: org/postgresql/jdbc/EscapedFunctions.java:273
-#: org/postgresql/jdbc/EscapedFunctions.java:347
-#: org/postgresql/jdbc/EscapedFunctions.java:752
-#: org/postgresql/jdbc/EscapedFunctions.java:790
+#: org/postgresql/xa/PGXAConnection.java:331
#, java-format
-msgid "{0} function takes two and only two arguments."
-msgstr "{0} 函式取得二個且僅有二個引數。"
+msgid "Error preparing transaction. prepare xid={0}"
+msgstr ""
-#: org/postgresql/jdbc/EscapedFunctions.java:291
-#: org/postgresql/jdbc/EscapedFunctions.java:329
-#: org/postgresql/jdbc/EscapedFunctions.java:449
-#: org/postgresql/jdbc/EscapedFunctions.java:464
-#: org/postgresql/jdbc/EscapedFunctions.java:479
-#: org/postgresql/jdbc/EscapedFunctions.java:494
-#: org/postgresql/jdbc/EscapedFunctions.java:509
-#: org/postgresql/jdbc/EscapedFunctions.java:524
-#: org/postgresql/jdbc/EscapedFunctions.java:539
-#: org/postgresql/jdbc/EscapedFunctions.java:554
-#: org/postgresql/jdbc/EscapedFunctions.java:569
-#: org/postgresql/jdbc/EscapedFunctions.java:584
-#: org/postgresql/jdbc/EscapedFunctions.java:599
-#: org/postgresql/jdbc/EscapedFunctions.java:614
-#: org/postgresql/jdbc/EscapedFunctions.java:778
+#: org/postgresql/xa/PGXAConnection.java:382
+msgid "Error during recover"
+msgstr ""
+
+#: org/postgresql/xa/PGXAConnection.java:438
#, java-format
-msgid "{0} function takes one and only one argument."
-msgstr "{0} 函式取得一個且僅有一個引數。"
+msgid ""
+"Error rolling back prepared transaction. rollback xid={0}, preparedXid={1}, "
+"currentXid={2}"
+msgstr ""
-#: org/postgresql/jdbc/EscapedFunctions.java:313
-#: org/postgresql/jdbc/EscapedFunctions.java:394
+#: org/postgresql/xa/PGXAConnection.java:471
#, java-format
-msgid "{0} function takes two or three arguments."
-msgstr "{0} 函式取得二個或三個引數。"
+msgid ""
+"One-phase commit called for xid {0} but connection was prepared with xid {1}"
+msgstr ""
-#: org/postgresql/jdbc/EscapedFunctions.java:419
-#: org/postgresql/jdbc/EscapedFunctions.java:434
-#: org/postgresql/jdbc/EscapedFunctions.java:737
-#: org/postgresql/jdbc/EscapedFunctions.java:767
+#: org/postgresql/xa/PGXAConnection.java:479
+msgid ""
+"Not implemented: one-phase commit must be issued using the same connection "
+"that was used to start it"
+msgstr ""
+
+#: org/postgresql/xa/PGXAConnection.java:483
#, java-format
-msgid "{0} function doesn''t take any argument."
-msgstr "{0} 函式無法取得任何的引數。"
+msgid "One-phase commit with unknown xid. commit xid={0}, currentXid={1}"
+msgstr ""
-#: org/postgresql/jdbc/EscapedFunctions.java:630
-#: org/postgresql/jdbc/EscapedFunctions.java:683
+#: org/postgresql/xa/PGXAConnection.java:487
#, java-format
-msgid "{0} function takes three and only three arguments."
-msgstr "{0} 函式取得三個且僅有三個引數。"
+msgid "commit called before end. commit xid={0}, state={1}"
+msgstr ""
-#: org/postgresql/jdbc/EscapedFunctions.java:643
-#: org/postgresql/jdbc/EscapedFunctions.java:664
-#: org/postgresql/jdbc/EscapedFunctions.java:667
-#: org/postgresql/jdbc/EscapedFunctions.java:700
-#: org/postgresql/jdbc/EscapedFunctions.java:713
-#: org/postgresql/jdbc/EscapedFunctions.java:716
+#: org/postgresql/xa/PGXAConnection.java:498
#, java-format
-msgid "Interval {0} not yet implemented"
-msgstr "隔絕 {0} 尚未被實作。"
+msgid "Error during one-phase commit. commit xid={0}"
+msgstr ""
+
+#: org/postgresql/xa/PGXAConnection.java:517
+msgid ""
+"Not implemented: 2nd phase commit must be issued using an idle connection. "
+"commit xid={0}, currentXid={1}, state={2], transactionState={3}"
+msgstr ""
-#: org/postgresql/jdbc/PgArray.java:166 org/postgresql/jdbc/PgArray.java:822
+#: org/postgresql/xa/PGXAConnection.java:550
#, java-format
-msgid "The array index is out of range: {0}"
-msgstr "陣列索引超過許可範圍:{0}"
+msgid ""
+"Error committing prepared transaction. commit xid={0}, preparedXid={1}, "
+"currentXid={2}"
+msgstr ""
-#: org/postgresql/jdbc/PgArray.java:183 org/postgresql/jdbc/PgArray.java:839
+#: org/postgresql/xa/PGXAConnection.java:567
#, java-format
-msgid "The array index is out of range: {0}, number of elements: {1}."
-msgstr "陣列索引超過許可範圍:{0},元素數量:{1}。"
+msgid "Heuristic commit/rollback not supported. forget xid={0}"
+msgstr ""
-#: org/postgresql/jdbc/PgArray.java:215
-#: org/postgresql/jdbc/PgResultSet.java:1885
-#: org/postgresql/util/HStoreConverter.java:38
-#: org/postgresql/util/HStoreConverter.java:69
-msgid ""
-"Invalid character data was found. This is most likely caused by stored data "
-"containing characters that are invalid for the character set the database "
-"was created in. The most common example of this is storing 8bit data in a "
-"SQL_ASCII database."
+#: org/postgresql/jdbc/PgSQLXML.java:147
+msgid "Unable to decode xml data."
msgstr ""
-"發現不合法的字元,可能的原因是欲儲存的資料中包含資料庫的字元集不支援的字碼,"
-"其中最常見例子的就是將 8 位元資料存入使用 SQL_ASCII 編碼的資料庫中。"
-#: org/postgresql/jdbc/PgCallableStatement.java:90
-#: org/postgresql/jdbc/PgCallableStatement.java:96
-msgid "A CallableStatement was executed with nothing returned."
-msgstr "一個 CallableStatement 執行函式後沒有傳回值。"
+#: org/postgresql/jdbc/PgSQLXML.java:150
+#, java-format
+msgid "Unknown XML Source class: {0}"
+msgstr ""
-#: org/postgresql/jdbc/PgCallableStatement.java:107
+#: org/postgresql/jdbc/PgSQLXML.java:193
#, fuzzy
-msgid "A CallableStatement was executed with an invalid number of parameters"
-msgstr "一個 CallableStatement 已執行包括一個無效的參數數值"
+msgid "Unable to create SAXResult for SQLXML."
+msgstr "為 {0} 建立物件失敗。"
-#: org/postgresql/jdbc/PgCallableStatement.java:139
-#, java-format
-msgid ""
-"A CallableStatement function was executed and the out parameter {0} was of "
-"type {1} however type {2} was registered."
+#: org/postgresql/jdbc/PgSQLXML.java:208
+msgid "Unable to create StAXResult for SQLXML"
msgstr ""
-"一個 CallableStatement 執行函式後輸出的參數型別為 {1} 值為 {0},但是已註冊的"
-"型別是 {2}。"
-#: org/postgresql/jdbc/PgCallableStatement.java:195
-msgid ""
-"This statement does not declare an OUT parameter. Use '{' ?= call ... '}' "
-"to declare one."
-msgstr "這個 statement 未宣告 OUT 參數,使用 '{' ?= call ... '}' 宣告一個。"
+#: org/postgresql/jdbc/PgSQLXML.java:213
+#, fuzzy, java-format
+msgid "Unknown XML Result class: {0}"
+msgstr "未知的 ResultSet 可適用的設置:{0}。"
-#: org/postgresql/jdbc/PgCallableStatement.java:239
-msgid "wasNull cannot be call before fetching a result."
+#: org/postgresql/jdbc/PgSQLXML.java:225
+#, fuzzy
+msgid "This SQLXML object has already been freed."
+msgstr "這個 PooledConnection 已經被關閉。"
+
+#: org/postgresql/jdbc/PgSQLXML.java:234
+msgid ""
+"This SQLXML object has not been initialized, so you cannot retrieve data "
+"from it."
msgstr ""
-#: org/postgresql/jdbc/PgCallableStatement.java:377
-#: org/postgresql/jdbc/PgCallableStatement.java:396
+#: org/postgresql/jdbc/PgSQLXML.java:247
#, java-format
-msgid ""
-"Parameter of type {0} was registered, but call to get{1} (sqltype={2}) was "
-"made."
-msgstr "已註冊參數型別 {0},但是又呼叫了get{1}(sqltype={2})。"
+msgid "Failed to convert binary xml data to encoding: {0}."
+msgstr ""
+
+#: org/postgresql/jdbc/PgSQLXML.java:273
+msgid "Unable to convert DOMResult SQLXML data to a string."
+msgstr ""
-#: org/postgresql/jdbc/PgCallableStatement.java:417
+#: org/postgresql/jdbc/PgSQLXML.java:287
msgid ""
-"A CallableStatement was declared, but no call to registerOutParameter(1, "
-"<some type>) was made."
+"This SQLXML object has already been initialized, so you cannot manipulate it "
+"further."
msgstr ""
-"已經宣告 CallableStatement 函式,但是尚未呼叫 registerOutParameter (1, "
-"<some_type>) 。"
-#: org/postgresql/jdbc/PgCallableStatement.java:423
-msgid "No function outputs were registered."
+#: org/postgresql/jdbc/PSQLSavepoint.java:37
+#: org/postgresql/jdbc/PSQLSavepoint.java:51
+#: org/postgresql/jdbc/PSQLSavepoint.java:69
+msgid "Cannot reference a savepoint after it has been released."
+msgstr "無法參照已經被釋放的儲存點。"
+
+#: org/postgresql/jdbc/PSQLSavepoint.java:42
+msgid "Cannot retrieve the id of a named savepoint."
+msgstr "無法取得已命名儲存點的 id。"
+
+#: org/postgresql/jdbc/PSQLSavepoint.java:56
+msgid "Cannot retrieve the name of an unnamed savepoint."
+msgstr "無法取得未命名儲存點(Savepoint)的名稱。"
+
+#: org/postgresql/jdbc/PgArray.java:157 org/postgresql/jdbc/PgArray.java:844
+#, java-format
+msgid "The array index is out of range: {0}"
+msgstr "陣列索引超過許可範圍:{0}"
+
+#: org/postgresql/jdbc/PgArray.java:178 org/postgresql/jdbc/PgArray.java:861
+#, java-format
+msgid "The array index is out of range: {0}, number of elements: {1}."
+msgstr "陣列索引超過許可範圍:{0},元素數量:{1}。"
+
+#: org/postgresql/jdbc/PgParameterMetaData.java:83
+#, java-format
+msgid "The parameter index is out of range: {0}, number of parameters: {1}."
+msgstr "參數索引超出許可範圍:{0},參數總數:{1}。"
+
+#: org/postgresql/jdbc/BatchResultHandler.java:92
+msgid "Too many update results were returned."
msgstr ""
-#: org/postgresql/jdbc/PgCallableStatement.java:429
+#: org/postgresql/jdbc/BatchResultHandler.java:146
+#, fuzzy, java-format
msgid ""
-"Results cannot be retrieved from a CallableStatement before it is executed."
-msgstr ""
+"Batch entry {0} {1} was aborted: {2} Call getNextException to see other "
+"errors in the batch."
+msgstr "批次處理 {0} {1} 被中止,呼叫 getNextException 以取得原因。"
-#: org/postgresql/jdbc/PgConnection.java:312
+#: org/postgresql/jdbc/PgConnection.java:272
#, java-format
msgid "Unsupported value for stringtype parameter: {0}"
msgstr "字串型別參數值未被支持:{0}"
-#: org/postgresql/jdbc/PgConnection.java:457
-#: org/postgresql/jdbc/PgPreparedStatement.java:115
-#: org/postgresql/jdbc/PgStatement.java:282
-#: org/postgresql/jdbc/TypeInfoCache.java:230
-#: org/postgresql/jdbc/TypeInfoCache.java:370
-#: org/postgresql/jdbc/TypeInfoCache.java:412
+#: org/postgresql/jdbc/PgConnection.java:424
+#: org/postgresql/jdbc/PgStatement.java:225
+#: org/postgresql/jdbc/TypeInfoCache.java:226
+#: org/postgresql/jdbc/TypeInfoCache.java:371
+#: org/postgresql/jdbc/TypeInfoCache.java:411
+#: org/postgresql/jdbc/TypeInfoCache.java:484
#: org/postgresql/jdbc/TypeInfoCache.java:489
-#: org/postgresql/jdbc/TypeInfoCache.java:494
-#: org/postgresql/jdbc/TypeInfoCache.java:535
-#: org/postgresql/jdbc/TypeInfoCache.java:540
+#: org/postgresql/jdbc/TypeInfoCache.java:526
+#: org/postgresql/jdbc/TypeInfoCache.java:531
+#: org/postgresql/jdbc/PgPreparedStatement.java:119
msgid "No results were returned by the query."
msgstr "查詢沒有傳回任何結果。"
-#: org/postgresql/jdbc/PgConnection.java:578
+#: org/postgresql/jdbc/PgConnection.java:441
+#: org/postgresql/jdbc/PgStatement.java:254
+msgid "A result was returned when none was expected."
+msgstr "傳回預期之外的結果。"
+
+#: org/postgresql/jdbc/PgConnection.java:545
msgid "Custom type maps are not supported."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:620
+#: org/postgresql/jdbc/PgConnection.java:587
#, java-format
msgid "Failed to create object for: {0}."
msgstr "為 {0} 建立物件失敗。"
-#: org/postgresql/jdbc/PgConnection.java:672
+#: org/postgresql/jdbc/PgConnection.java:641
#, java-format
msgid "Unable to load the class {0} responsible for the datatype {1}"
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:724
+#: org/postgresql/jdbc/PgConnection.java:693
msgid ""
"Cannot change transaction read-only property in the middle of a transaction."
msgstr "不能在事物交易過程中改變事物交易唯讀屬性。"
-#: org/postgresql/jdbc/PgConnection.java:775
+#: org/postgresql/jdbc/PgConnection.java:756
msgid "Cannot commit when autoCommit is enabled."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:786
-#: org/postgresql/jdbc/PgConnection.java:1358
-#: org/postgresql/jdbc/PgConnection.java:1395
+#: org/postgresql/jdbc/PgConnection.java:767
+#: org/postgresql/jdbc/PgConnection.java:1384
+#: org/postgresql/jdbc/PgConnection.java:1428
#, fuzzy
msgid "This connection has been closed."
msgstr "Connection 已經被關閉。"
-#: org/postgresql/jdbc/PgConnection.java:796
+#: org/postgresql/jdbc/PgConnection.java:777
msgid "Cannot rollback when autoCommit is enabled."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:870
+#: org/postgresql/jdbc/PgConnection.java:827
msgid ""
"Cannot change transaction isolation level in the middle of a transaction."
msgstr "不能在事務交易過程中改變事物交易隔絕等級。"
-#: org/postgresql/jdbc/PgConnection.java:876
+#: org/postgresql/jdbc/PgConnection.java:833
#, java-format
msgid "Transaction isolation level {0} not supported."
msgstr "不支援交易隔絕等級 {0} 。"
-#: org/postgresql/jdbc/PgConnection.java:921
+#: org/postgresql/jdbc/PgConnection.java:878
msgid "Finalizing a Connection that was never closed:"
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:1009
+#: org/postgresql/jdbc/PgConnection.java:945
msgid "Unable to translate data into the desired encoding."
msgstr "無法將資料轉成目標編碼。"
-#: org/postgresql/jdbc/PgConnection.java:1081
-#: org/postgresql/jdbc/PgResultSet.java:1782
-#: org/postgresql/jdbc/PgStatement.java:1053
+#: org/postgresql/jdbc/PgConnection.java:1008
+#: org/postgresql/jdbc/PgStatement.java:903
+#: org/postgresql/jdbc/PgResultSet.java:1817
msgid "Fetch size must be a value greater to or equal to 0."
msgstr "資料讀取筆數(fetch size)必須大於或等於 0。"
-#: org/postgresql/jdbc/PgConnection.java:1311
+#: org/postgresql/jdbc/PgConnection.java:1289
+#: org/postgresql/jdbc/PgConnection.java:1330
#, java-format
msgid "Unable to find server array type for provided name {0}."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:1327
+#: org/postgresql/jdbc/PgConnection.java:1312
+#, fuzzy, java-format
+msgid "Invalid elements {0}"
+msgstr "無效的旗標 {0}"
+
+#: org/postgresql/jdbc/PgConnection.java:1348
#, fuzzy, java-format
msgid "Invalid timeout ({0}<0)."
msgstr "無效的串流長度 {0}."
-#: org/postgresql/jdbc/PgConnection.java:1340
+#: org/postgresql/jdbc/PgConnection.java:1372
msgid "Validating connection."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:1375
+#: org/postgresql/jdbc/PgConnection.java:1405
#, fuzzy, java-format
msgid "Failed to set ClientInfo property: {0}"
msgstr "為 {0} 建立物件失敗。"
-#: org/postgresql/jdbc/PgConnection.java:1383
+#: org/postgresql/jdbc/PgConnection.java:1415
msgid "ClientInfo property not supported."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:1408
+#: org/postgresql/jdbc/PgConnection.java:1441
msgid "One ore more ClientInfo failed."
msgstr ""
-#: org/postgresql/jdbc/PgConnection.java:1517
+#: org/postgresql/jdbc/PgConnection.java:1540
+#, fuzzy
+msgid "Network timeout must be a value greater than or equal to 0."
+msgstr "查詢逾時等候時間必須大於或等於 0。"
+
+#: org/postgresql/jdbc/PgConnection.java:1552
+msgid "Unable to set network timeout."
+msgstr ""
+
+#: org/postgresql/jdbc/PgConnection.java:1563
+msgid "Unable to get network timeout."
+msgstr ""
+
+#: org/postgresql/jdbc/PgConnection.java:1580
#, java-format
msgid "Unknown ResultSet holdability setting: {0}."
msgstr "未知的 ResultSet 可適用的設置:{0}。"
-#: org/postgresql/jdbc/PgConnection.java:1531
-#: org/postgresql/jdbc/PgConnection.java:1554
-#: org/postgresql/jdbc/PgConnection.java:1576
-#: org/postgresql/jdbc/PgConnection.java:1587
-msgid "Server versions prior to 8.0 do not support savepoints."
-msgstr "8.0 版之前的伺服器不支援儲存點(SavePints)。"
-
-#: org/postgresql/jdbc/PgConnection.java:1535
-#: org/postgresql/jdbc/PgConnection.java:1558
+#: org/postgresql/jdbc/PgConnection.java:1598
+#: org/postgresql/jdbc/PgConnection.java:1619
msgid "Cannot establish a savepoint in auto-commit mode."
msgstr "在自動確認事物交易模式無法建立儲存點(Savepoint)。"
-#: org/postgresql/jdbc/PgConnection.java:1635
+#: org/postgresql/jdbc/PgConnection.java:1685
msgid "Returning autogenerated keys is not supported."
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:78
+#: org/postgresql/jdbc/PgStatement.java:235
+msgid "Multiple ResultSets were returned by the query."
+msgstr "查詢傳回多個 ResultSet。"
+
+#: org/postgresql/jdbc/PgStatement.java:316
+msgid "Can''t use executeWithFlags(int) on a Statement."
+msgstr ""
+
+#: org/postgresql/jdbc/PgStatement.java:509
+msgid "Maximum number of rows must be a value grater than or equal to 0."
+msgstr "最大資料讀取筆數必須大於或等於 0。"
+
+#: org/postgresql/jdbc/PgStatement.java:550
+msgid "Query timeout must be a value greater than or equals to 0."
+msgstr "查詢逾時等候時間必須大於或等於 0。"
+
+#: org/postgresql/jdbc/PgStatement.java:590
+msgid "The maximum field size must be a value greater than or equal to 0."
+msgstr "最大欄位容量必須大於或等於 0。"
+
+#: org/postgresql/jdbc/PgStatement.java:689
+msgid "This statement has been closed."
+msgstr "這個 statement 已經被關閉。"
+
+#: org/postgresql/jdbc/PgStatement.java:895
+#: org/postgresql/jdbc/PgResultSet.java:878
+#, java-format
+msgid "Invalid fetch direction constant: {0}."
+msgstr "無效的 fetch 方向常數:{0}。"
+
+#: org/postgresql/jdbc/PgStatement.java:1145
+#: org/postgresql/jdbc/PgStatement.java:1173
+msgid "Returning autogenerated keys by column index is not supported."
+msgstr ""
+
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:66
msgid ""
"Unable to determine a value for MaxIndexKeys due to missing system catalog "
"data."
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:100
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:89
msgid "Unable to find name datatype in the system catalogs."
msgstr "在系統 catalog 中找不到名稱資料類型(datatype)。"
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1117
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1028
msgid "proname"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1117
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1028
msgid "oid"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1119
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1714
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1030
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1481
msgid "typtype"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1122
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1033
msgid "proargtypes"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1732
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1499
msgid "adsrc"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1872
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1963
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1512
+msgid "attidentity"
+msgstr ""
+
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1608
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1684
msgid "rolname"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1873
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1964
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1609
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1685
msgid "relacl"
msgstr ""
-#: org/postgresql/jdbc/PgDatabaseMetaData.java:1878
+#: org/postgresql/jdbc/PgDatabaseMetaData.java:1615
msgid "attacl"
msgstr ""
-#: org/postgresql/jdbc/PgParameterMetaData.java:86
+#: org/postgresql/jdbc/AbstractBlobClob.java:78
+msgid ""
+"Truncation of large objects is only implemented in 8.3 and later servers."
+msgstr "大型物件的截斷(Truncation)僅被實作執行在 8.3 和後來的伺服器。"
+
+#: org/postgresql/jdbc/AbstractBlobClob.java:83
+msgid "Cannot truncate LOB to a negative length."
+msgstr ""
+
+#: org/postgresql/jdbc/AbstractBlobClob.java:90
+#: org/postgresql/jdbc/AbstractBlobClob.java:234
#, java-format
-msgid "The parameter index is out of range: {0}, number of parameters: {1}."
-msgstr "參數索引超出許可範圍:{0},參數總數:{1}。"
+msgid "PostgreSQL LOBs can only index to: {0}"
+msgstr "PostgreSQL LOBs 僅能索引到:{0}"
-#: org/postgresql/jdbc/PgPreparedStatement.java:102
-#: org/postgresql/jdbc/PgPreparedStatement.java:128
-#: org/postgresql/jdbc/PgPreparedStatement.java:150
-#: org/postgresql/jdbc/PgPreparedStatement.java:1108
+#: org/postgresql/jdbc/AbstractBlobClob.java:230
+msgid "LOB positioning offsets start at 1."
+msgstr ""
+
+#: org/postgresql/jdbc/AbstractBlobClob.java:246
+msgid "free() was called on this LOB previously"
+msgstr ""
+
+#: org/postgresql/jdbc/PgPreparedStatement.java:106
+#: org/postgresql/jdbc/PgPreparedStatement.java:127
+#: org/postgresql/jdbc/PgPreparedStatement.java:139
+#: org/postgresql/jdbc/PgPreparedStatement.java:1035
msgid ""
"Can''t use query methods that take a query string on a PreparedStatement."
msgstr "在 PreparedStatement 上不能使用獲取查詢字串的查詢方法。"
-#: org/postgresql/jdbc/PgPreparedStatement.java:119
-#: org/postgresql/jdbc/PgStatement.java:286
-msgid "Multiple ResultSets were returned by the query."
-msgstr "查詢傳回多個 ResultSet。"
-
-#: org/postgresql/jdbc/PgPreparedStatement.java:270
+#: org/postgresql/jdbc/PgPreparedStatement.java:249
msgid "Unknown Types value."
msgstr "不明的型別值。"
-#: org/postgresql/jdbc/PgPreparedStatement.java:417
-#: org/postgresql/jdbc/PgPreparedStatement.java:486
-#: org/postgresql/jdbc/PgPreparedStatement.java:1251
-#: org/postgresql/jdbc/PgPreparedStatement.java:1583
+#: org/postgresql/jdbc/PgPreparedStatement.java:382
+#: org/postgresql/jdbc/PgPreparedStatement.java:439
+#: org/postgresql/jdbc/PgPreparedStatement.java:1191
+#: org/postgresql/jdbc/PgPreparedStatement.java:1490
#, java-format
msgid "Invalid stream length {0}."
msgstr "無效的串流長度 {0}."
-#: org/postgresql/jdbc/PgPreparedStatement.java:447
+#: org/postgresql/jdbc/PgPreparedStatement.java:411
#, java-format
msgid "The JVM claims not to support the {0} encoding."
msgstr "JVM 聲明並不支援 {0} 編碼。"
-#: org/postgresql/jdbc/PgPreparedStatement.java:450
-#: org/postgresql/jdbc/PgPreparedStatement.java:519
-#: org/postgresql/jdbc/PgResultSet.java:1075
-#: org/postgresql/jdbc/PgResultSet.java:1109
+#: org/postgresql/jdbc/PgPreparedStatement.java:414
+#: org/postgresql/jdbc/PgResultSet.java:1122
+#: org/postgresql/jdbc/PgResultSet.java:1156
msgid "Provided InputStream failed."
msgstr "提供的 InputStream 已失敗。"
-#: org/postgresql/jdbc/PgPreparedStatement.java:536
-#: org/postgresql/jdbc/PgPreparedStatement.java:1170
+#: org/postgresql/jdbc/PgPreparedStatement.java:460
+#: org/postgresql/jdbc/PgPreparedStatement.java:1096
#, java-format
msgid "Unknown type {0}."
msgstr "不明的型別 {0}"
-#: org/postgresql/jdbc/PgPreparedStatement.java:553
+#: org/postgresql/jdbc/PgPreparedStatement.java:477
msgid "No hstore extension installed."
msgstr ""
-#: org/postgresql/jdbc/PgPreparedStatement.java:683
-#: org/postgresql/jdbc/PgPreparedStatement.java:705
-#: org/postgresql/jdbc/PgPreparedStatement.java:715
-#: org/postgresql/jdbc/PgPreparedStatement.java:725
+#: org/postgresql/jdbc/PgPreparedStatement.java:619
+#: org/postgresql/jdbc/PgPreparedStatement.java:642
+#: org/postgresql/jdbc/PgPreparedStatement.java:652
+#: org/postgresql/jdbc/PgPreparedStatement.java:664
#, java-format
msgid "Cannot cast an instance of {0} to type {1}"
msgstr "不能轉換一個 {0} 實例到型別 {1}"
-#: org/postgresql/jdbc/PgPreparedStatement.java:741
+#: org/postgresql/jdbc/PgPreparedStatement.java:682
#, java-format
msgid "Unsupported Types value: {0}"
msgstr "未被支持的型別值:{0}"
-#: org/postgresql/jdbc/PgPreparedStatement.java:970
+#: org/postgresql/jdbc/PgPreparedStatement.java:894
#, java-format
msgid "Cannot convert an instance of {0} to type {1}"
msgstr "無法轉換 {0} 到類型 {1} 的實例"
-#: org/postgresql/jdbc/PgPreparedStatement.java:1040
+#: org/postgresql/jdbc/PgPreparedStatement.java:968
#, java-format
msgid ""
"Can''t infer the SQL type to use for an instance of {0}. Use setObject() "
"with an explicit Types value to specify the type to use."
msgstr ""
-#: org/postgresql/jdbc/PgPreparedStatement.java:1207
-#: org/postgresql/jdbc/PgPreparedStatement.java:1303
-#: org/postgresql/jdbc/PgPreparedStatement.java:1340
+#: org/postgresql/jdbc/PgPreparedStatement.java:1133
+#: org/postgresql/jdbc/PgPreparedStatement.java:1233
msgid "Unexpected error writing large object to database."
msgstr "將大型物件(large object)寫入資料庫時發生不明錯誤。"
-#: org/postgresql/jdbc/PgPreparedStatement.java:1278
-#: org/postgresql/jdbc/PgResultSet.java:1163
+#: org/postgresql/jdbc/PgPreparedStatement.java:1178
+#: org/postgresql/jdbc/PgResultSet.java:1210
msgid "Provided Reader failed."
msgstr "提供的 Reader 已失敗。"
-#: org/postgresql/jdbc/PgPreparedStatement.java:1542
-#: org/postgresql/util/StreamWrapper.java:59
-msgid "Object is too large to send over the protocol."
+#: org/postgresql/jdbc/BooleanTypeUtil.java:99
+#, java-format
+msgid "Cannot cast to boolean: \"{0}\""
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:285
+#: org/postgresql/jdbc/PgResultSet.java:280
msgid ""
"Operation requires a scrollable ResultSet, but this ResultSet is "
"FORWARD_ONLY."
msgstr "操作要求可捲動的 ResultSet,但此 ResultSet 是 FORWARD_ONLY。"
-#: org/postgresql/jdbc/PgResultSet.java:456
-msgid "Unexpected error while decoding character data from a large object."
-msgstr "從大型物件(large object)解碼字元資料時發生錯誤。"
-
-#: org/postgresql/jdbc/PgResultSet.java:507
-#: org/postgresql/jdbc/PgResultSet.java:537
-#: org/postgresql/jdbc/PgResultSet.java:570
-#: org/postgresql/jdbc/PgResultSet.java:2964
+#: org/postgresql/jdbc/PgResultSet.java:492
+#: org/postgresql/jdbc/PgResultSet.java:532
+#: org/postgresql/jdbc/PgResultSet.java:556
+#: org/postgresql/jdbc/PgResultSet.java:594
+#: org/postgresql/jdbc/PgResultSet.java:624
#: org/postgresql/jdbc/PgResultSet.java:3008
+#: org/postgresql/jdbc/PgResultSet.java:3052
#, fuzzy, java-format
msgid "Cannot convert the column of type {0} to requested type {1}."
msgstr "無法轉換 {0} 到類型 {1} 的實例"
-#: org/postgresql/jdbc/PgResultSet.java:789
-#: org/postgresql/jdbc/PgResultSet.java:810
-#: org/postgresql/jdbc/PgResultSet.java:1797
+#: org/postgresql/jdbc/PgResultSet.java:838
+#: org/postgresql/jdbc/PgResultSet.java:859
+#: org/postgresql/jdbc/PgResultSet.java:1832
msgid "Can''t use relative move methods while on the insert row."
msgstr "不能在新增的資料列上使用相對位置 move 方法。"
-#: org/postgresql/jdbc/PgResultSet.java:829
-#: org/postgresql/jdbc/PgStatement.java:1045
-#, java-format
-msgid "Invalid fetch direction constant: {0}."
-msgstr "無效的 fetch 方向常數:{0}。"
-
-#: org/postgresql/jdbc/PgResultSet.java:840
+#: org/postgresql/jdbc/PgResultSet.java:889
msgid "Cannot call cancelRowUpdates() when on the insert row."
msgstr "不能在新增的資料列上呼叫 cancelRowUpdates()。"
-#: org/postgresql/jdbc/PgResultSet.java:856
+#: org/postgresql/jdbc/PgResultSet.java:905
msgid "Cannot call deleteRow() when on the insert row."
msgstr "不能在新增的資料上呼叫 deleteRow()。"
-#: org/postgresql/jdbc/PgResultSet.java:863
+#: org/postgresql/jdbc/PgResultSet.java:912
msgid ""
"Currently positioned before the start of the ResultSet. You cannot call "
"deleteRow() here."
msgstr "不能在 ResultSet 的第一筆資料之前呼叫 deleteRow()。"
-#: org/postgresql/jdbc/PgResultSet.java:869
+#: org/postgresql/jdbc/PgResultSet.java:918
msgid ""
"Currently positioned after the end of the ResultSet. You cannot call "
"deleteRow() here."
msgstr "不能在 ResultSet 的最後一筆資料之後呼叫 deleteRow()。"
-#: org/postgresql/jdbc/PgResultSet.java:873
+#: org/postgresql/jdbc/PgResultSet.java:922
msgid "There are no rows in this ResultSet."
msgstr "ResultSet 中找不到資料列。"
-#: org/postgresql/jdbc/PgResultSet.java:914
+#: org/postgresql/jdbc/PgResultSet.java:963
msgid "Not on the insert row."
msgstr "不在新增的資料列上。"
-#: org/postgresql/jdbc/PgResultSet.java:916
+#: org/postgresql/jdbc/PgResultSet.java:965
msgid "You must specify at least one column value to insert a row."
msgstr ""
-#: org/postgresql/jdbc/PgResultSet.java:1072
-#: org/postgresql/jdbc/PgResultSet.java:1706
-#: org/postgresql/jdbc/PgResultSet.java:2377
-#: org/postgresql/jdbc/PgResultSet.java:2402
+#: org/postgresql/jdbc/PgResultSet.java:1119
+#: org/postgresql/jdbc/PgResultSet.java:1754
+#: org/postgresql/jdbc/PgResultSet.java:2416
+#: org/postgresql/jdbc/PgResultSet.java:2437
#, java-format
msgid "The JVM claims not to support the encoding: {0}"
msgstr "JVM 聲明並不支援編碼:{0} 。"
-#: org/postgresql/jdbc/PgResultSet.java:1214
+#: org/postgresql/jdbc/PgResultSet.java:1261
msgid "Can''t refresh the insert row."
msgstr "無法重讀新增的資料列。"
-#: org/postgresql/jdbc/PgResultSet.java:1280
+#: org/postgresql/jdbc/PgResultSet.java:1328
msgid "Cannot call updateRow() when on the insert row."
msgstr "不能在新增的資料列上呼叫 deleteRow()。"
-#: org/postgresql/jdbc/PgResultSet.java:1287
-#: org/postgresql/jdbc/PgResultSet.java:3025
+#: org/postgresql/jdbc/PgResultSet.java:1335
+#: org/postgresql/jdbc/PgResultSet.java:3069
msgid ""
"Cannot update the ResultSet because it is either before the start or after "
"the end of the results."
msgstr "無法更新 ResultSet,可能在第一筆資料之前或最未筆資料之後。"
-#: org/postgresql/jdbc/PgResultSet.java:1486
+#: org/postgresql/jdbc/PgResultSet.java:1535
msgid "ResultSets with concurrency CONCUR_READ_ONLY cannot be updated."
msgstr "ResultSets 與並發同作(Concurrency) CONCUR_READ_ONLY 不能被更新。"
-#: org/postgresql/jdbc/PgResultSet.java:1555
+#: org/postgresql/jdbc/PgResultSet.java:1603
#, java-format
msgid "No primary key found for table {0}."
msgstr "{0} 資料表中未找到主鍵(Primary key)。"
-#: org/postgresql/jdbc/PgResultSet.java:1941
-#: org/postgresql/jdbc/PgResultSet.java:1946
-#: org/postgresql/jdbc/PgResultSet.java:1986
-#: org/postgresql/jdbc/PgResultSet.java:1992
-#: org/postgresql/jdbc/PgResultSet.java:2790
-#: org/postgresql/jdbc/PgResultSet.java:2796
-#: org/postgresql/jdbc/PgResultSet.java:2820
-#: org/postgresql/jdbc/PgResultSet.java:2825
-#: org/postgresql/jdbc/PgResultSet.java:2841
-#: org/postgresql/jdbc/PgResultSet.java:2862
-#: org/postgresql/jdbc/PgResultSet.java:2873
-#: org/postgresql/jdbc/PgResultSet.java:2886
-#: org/postgresql/jdbc/PgResultSet.java:3013
+#: org/postgresql/jdbc/PgResultSet.java:2011
+#: org/postgresql/jdbc/PgResultSet.java:2016
+#: org/postgresql/jdbc/PgResultSet.java:2803
+#: org/postgresql/jdbc/PgResultSet.java:2809
+#: org/postgresql/jdbc/PgResultSet.java:2834
+#: org/postgresql/jdbc/PgResultSet.java:2840
+#: org/postgresql/jdbc/PgResultSet.java:2864
+#: org/postgresql/jdbc/PgResultSet.java:2869
+#: org/postgresql/jdbc/PgResultSet.java:2885
+#: org/postgresql/jdbc/PgResultSet.java:2906
+#: org/postgresql/jdbc/PgResultSet.java:2917
+#: org/postgresql/jdbc/PgResultSet.java:2930
+#: org/postgresql/jdbc/PgResultSet.java:3057
#, java-format
msgid "Bad value for type {0} : {1}"
msgstr "不良的型別值 {0} : {1}"
-#: org/postgresql/jdbc/PgResultSet.java:2564
+#: org/postgresql/jdbc/PgResultSet.java:2589
#, java-format
msgid "The column name {0} was not found in this ResultSet."
-msgstr "ResultSet 中找不到欄位名稱 {0}。"
-
-#: org/postgresql/jdbc/PgResultSet.java:2689
-msgid ""
-"ResultSet is not updateable. The query that generated this result set must "
-"select only one table, and must select all primary keys from that table. See "
-"the JDBC 2.1 API Specification, section 5.6 for more details."
-msgstr ""
-"不可更新的 ResultSet。用來產生這個 ResultSet 的 SQL 命令只能操作一個資料表,"
-"並且必需選擇所有主鍵欄位,詳細請參閱 JDBC 2.1 API 規格書 5.6 節。"
-
-#: org/postgresql/jdbc/PgResultSet.java:2701
-msgid "This ResultSet is closed."
-msgstr "這個 ResultSet 已經被關閉。"
-
-#: org/postgresql/jdbc/PgResultSet.java:2732
-msgid "ResultSet not positioned properly, perhaps you need to call next."
-msgstr "查詢結果指標位置不正確,您也許需要呼叫 ResultSet 的 next() 方法。"
-
-#: org/postgresql/jdbc/PgResultSet.java:3045
-#, fuzzy
-msgid "Invalid UUID data."
-msgstr "無效的旗標"
-
-#: org/postgresql/jdbc/PgSQLXML.java:150
-msgid "Unable to decode xml data."
-msgstr ""
-
-#: org/postgresql/jdbc/PgSQLXML.java:153
-#, java-format
-msgid "Unknown XML Source class: {0}"
-msgstr ""
-
-#: org/postgresql/jdbc/PgSQLXML.java:196
-#, fuzzy
-msgid "Unable to create SAXResult for SQLXML."
-msgstr "為 {0} 建立物件失敗。"
-
-#: org/postgresql/jdbc/PgSQLXML.java:211
-msgid "Unable to create StAXResult for SQLXML"
-msgstr ""
-
-#: org/postgresql/jdbc/PgSQLXML.java:216
-#, fuzzy, java-format
-msgid "Unknown XML Result class: {0}"
-msgstr "未知的 ResultSet 可適用的設置:{0}。"
-
-#: org/postgresql/jdbc/PgSQLXML.java:228
-#, fuzzy
-msgid "This SQLXML object has already been freed."
-msgstr "這個 PooledConnection 已經被關閉。"
-
-#: org/postgresql/jdbc/PgSQLXML.java:237
-msgid ""
-"This SQLXML object has not been initialized, so you cannot retrieve data "
-"from it."
-msgstr ""
-
-#: org/postgresql/jdbc/PgSQLXML.java:250
-#, java-format
-msgid "Failed to convert binary xml data to encoding: {0}."
-msgstr ""
-
-#: org/postgresql/jdbc/PgSQLXML.java:276
-msgid "Unable to convert DOMResult SQLXML data to a string."
-msgstr ""
-
-#: org/postgresql/jdbc/PgSQLXML.java:290
-msgid ""
-"This SQLXML object has already been initialized, so you cannot manipulate it "
-"further."
-msgstr ""
-
-#: org/postgresql/jdbc/PgStatement.java:325
-msgid "Can''t use executeWithFlags(int) on a Statement."
-msgstr ""
-
-#: org/postgresql/jdbc/PgStatement.java:484
-msgid "Maximum number of rows must be a value grater than or equal to 0."
-msgstr "最大資料讀取筆數必須大於或等於 0。"
-
-#: org/postgresql/jdbc/PgStatement.java:525
-msgid "Query timeout must be a value greater than or equals to 0."
-msgstr "查詢逾時等候時間必須大於或等於 0。"
-
-#: org/postgresql/jdbc/PgStatement.java:561
-msgid "The maximum field size must be a value greater than or equal to 0."
-msgstr "最大欄位容量必須大於或等於 0。"
-
-#: org/postgresql/jdbc/PgStatement.java:871
-msgid "This statement has been closed."
-msgstr "這個 statement 已經被關閉。"
+msgstr "ResultSet 中找不到欄位名稱 {0}。"
-#: org/postgresql/jdbc/PgStatement.java:1148
-#, fuzzy
+#: org/postgresql/jdbc/PgResultSet.java:2725
msgid ""
-"Returning autogenerated keys is only supported for 8.2 and later servers."
-msgstr "大型物件的截斷(Truncation)僅被實作執行在 8.3 和後來的伺服器。"
-
-#: org/postgresql/jdbc/PgStatement.java:1326
-#: org/postgresql/jdbc/PgStatement.java:1357
-msgid "Returning autogenerated keys by column index is not supported."
+"ResultSet is not updateable. The query that generated this result set must "
+"select only one table, and must select all primary keys from that table. See "
+"the JDBC 2.1 API Specification, section 5.6 for more details."
msgstr ""
+"不可更新的 ResultSet。用來產生這個 ResultSet 的 SQL 命令只能操作一個資料表,"
+"並且必需選擇所有主鍵欄位,詳細請參閱 JDBC 2.1 API 規格書 5.6 節。"
-#: org/postgresql/jdbc/PSQLSavepoint.java:40
-#: org/postgresql/jdbc/PSQLSavepoint.java:54
-#: org/postgresql/jdbc/PSQLSavepoint.java:72
-msgid "Cannot reference a savepoint after it has been released."
-msgstr "無法參照已經被釋放的儲存點。"
+#: org/postgresql/jdbc/PgResultSet.java:2737
+msgid "This ResultSet is closed."
+msgstr "這個 ResultSet 已經被關閉。"
-#: org/postgresql/jdbc/PSQLSavepoint.java:45
-msgid "Cannot retrieve the id of a named savepoint."
-msgstr "無法取得已命名儲存點的 id。"
+#: org/postgresql/jdbc/PgResultSet.java:2768
+msgid "ResultSet not positioned properly, perhaps you need to call next."
+msgstr "查詢結果指標位置不正確,您也許需要呼叫 ResultSet 的 next() 方法。"
-#: org/postgresql/jdbc/PSQLSavepoint.java:59
-msgid "Cannot retrieve the name of an unnamed savepoint."
-msgstr "無法取得未命名儲存點(Savepoint)的名稱。"
+#: org/postgresql/jdbc/PgResultSet.java:3089
+#, fuzzy
+msgid "Invalid UUID data."
+msgstr "無效的旗標"
+
+#: org/postgresql/jdbc/PgResultSet.java:3178
+#: org/postgresql/jdbc/PgResultSet.java:3185
+#: org/postgresql/jdbc/PgResultSet.java:3196
+#: org/postgresql/jdbc/PgResultSet.java:3207
+#: org/postgresql/jdbc/PgResultSet.java:3218
+#: org/postgresql/jdbc/PgResultSet.java:3229
+#: org/postgresql/jdbc/PgResultSet.java:3240
+#: org/postgresql/jdbc/PgResultSet.java:3251
+#: org/postgresql/jdbc/PgResultSet.java:3262
+#: org/postgresql/jdbc/PgResultSet.java:3269
+#: org/postgresql/jdbc/PgResultSet.java:3276
+#: org/postgresql/jdbc/PgResultSet.java:3287
+#: org/postgresql/jdbc/PgResultSet.java:3304
+#: org/postgresql/jdbc/PgResultSet.java:3311
+#: org/postgresql/jdbc/PgResultSet.java:3318
+#: org/postgresql/jdbc/PgResultSet.java:3329
+#: org/postgresql/jdbc/PgResultSet.java:3336
+#: org/postgresql/jdbc/PgResultSet.java:3343
+#: org/postgresql/jdbc/PgResultSet.java:3381
+#: org/postgresql/jdbc/PgResultSet.java:3388
+#: org/postgresql/jdbc/PgResultSet.java:3395
+#: org/postgresql/jdbc/PgResultSet.java:3415
+#: org/postgresql/jdbc/PgResultSet.java:3428
+#, fuzzy, java-format
+msgid "conversion to {0} from {1} not supported"
+msgstr "不支援交易隔絕等級 {0} 。"
-#: org/postgresql/jdbc/TimestampUtils.java:298
+#: org/postgresql/jdbc/TimestampUtils.java:355
+#: org/postgresql/jdbc/TimestampUtils.java:423
#, fuzzy, java-format
msgid "Bad value for type timestamp/date/time: {1}"
msgstr "不良的型別值 {0} : {1}"
-#: org/postgresql/jdbc/TimestampUtils.java:359
-msgid ""
-"Infinite value found for timestamp/date. This cannot be represented as time."
-msgstr ""
-
-#: org/postgresql/jdbc/TimestampUtils.java:674
-#: org/postgresql/jdbc/TimestampUtils.java:710
-#: org/postgresql/jdbc/TimestampUtils.java:757
+#: org/postgresql/jdbc/TimestampUtils.java:858
+#: org/postgresql/jdbc/TimestampUtils.java:915
+#: org/postgresql/jdbc/TimestampUtils.java:961
+#: org/postgresql/jdbc/TimestampUtils.java:1010
#, fuzzy, java-format
msgid "Unsupported binary encoding of {0}."
msgstr "未被支持的型別值:{0}"
-#: org/postgresql/largeobject/LargeObjectManager.java:147
-msgid "Failed to initialize LargeObject API"
-msgstr "初始化 LargeObject API 失敗"
-
-#: org/postgresql/largeobject/LargeObjectManager.java:265
-#: org/postgresql/largeobject/LargeObjectManager.java:308
-msgid "Large Objects may not be used in auto-commit mode."
-msgstr "大型物件無法被使用在自動確認事物交易模式。"
+#: org/postgresql/jdbc/PgCallableStatement.java:86
+#: org/postgresql/jdbc/PgCallableStatement.java:96
+msgid "A CallableStatement was executed with nothing returned."
+msgstr "一個 CallableStatement 執行函式後沒有傳回值。"
-#: org/postgresql/osgi/PGDataSourceFactory.java:85
-#, fuzzy, java-format
-msgid "Unsupported properties: {0}"
-msgstr "未被支持的型別值:{0}"
+#: org/postgresql/jdbc/PgCallableStatement.java:107
+#, fuzzy
+msgid "A CallableStatement was executed with an invalid number of parameters"
+msgstr "一個 CallableStatement 已執行包括一個無效的參數數值"
-#: org/postgresql/PGProperty.java:450 org/postgresql/PGProperty.java:470
+#: org/postgresql/jdbc/PgCallableStatement.java:145
#, java-format
-msgid "{0} parameter value must be an integer but was: {1}"
+msgid ""
+"A CallableStatement function was executed and the out parameter {0} was of "
+"type {1} however type {2} was registered."
msgstr ""
+"一個 CallableStatement 執行函式後輸出的參數型別為 {1} 值為 {0},但是已註冊的"
+"型別是 {2}。"
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:125
+#: org/postgresql/jdbc/PgCallableStatement.java:202
msgid ""
-"Could not find a java cryptographic algorithm: X.509 CertificateFactory not "
-"available."
-msgstr ""
+"This statement does not declare an OUT parameter. Use '{' ?= call ... '}' "
+"to declare one."
+msgstr "這個 statement 未宣告 OUT 參數,使用 '{' ?= call ... '}' 宣告一個。"
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:135
-#, java-format
-msgid "Could not open SSL certificate file {0}."
+#: org/postgresql/jdbc/PgCallableStatement.java:246
+msgid "wasNull cannot be call before fetching a result."
msgstr ""
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:140
+#: org/postgresql/jdbc/PgCallableStatement.java:384
+#: org/postgresql/jdbc/PgCallableStatement.java:403
#, java-format
-msgid "Loading the SSL certificate {0} into a KeyManager failed."
-msgstr ""
+msgid ""
+"Parameter of type {0} was registered, but call to get{1} (sqltype={2}) was "
+"made."
+msgstr "已註冊參數型別 {0},但是又呼叫了get{1}(sqltype={2})。"
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:195
-msgid "Enter SSL password: "
+#: org/postgresql/jdbc/PgCallableStatement.java:424
+msgid ""
+"A CallableStatement was declared, but no call to registerOutParameter(1, "
+"<some type>) was made."
msgstr ""
+"已經宣告 CallableStatement 函式,但是尚未呼叫 registerOutParameter (1, "
+"<some_type>) 。"
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:202
-msgid "Could not read password for SSL key file, console is not available."
+#: org/postgresql/jdbc/PgCallableStatement.java:430
+msgid "No function outputs were registered."
msgstr ""
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:207
-#, java-format
-msgid "Could not read password for SSL key file by callbackhandler {0}."
+#: org/postgresql/jdbc/PgCallableStatement.java:436
+msgid ""
+"Results cannot be retrieved from a CallableStatement before it is executed."
msgstr ""
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:226
-#, java-format
-msgid "Could not decrypt SSL key file {0}."
-msgstr ""
+#: org/postgresql/jdbc/PgCallableStatement.java:703
+#, fuzzy, java-format
+msgid "Unsupported type conversion to {1}."
+msgstr "未被支持的型別值:{0}"
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:240
+#: org/postgresql/jdbc/EscapedFunctions.java:240
#, java-format
-msgid "Could not read SSL key file {0}."
-msgstr ""
+msgid "{0} function takes four and only four argument."
+msgstr "{0} 函式取得四個且僅有四個引數。"
-#: org/postgresql/ssl/jdbc4/LazyKeyManager.java:243
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:162
+#: org/postgresql/jdbc/EscapedFunctions.java:270
+#: org/postgresql/jdbc/EscapedFunctions.java:344
+#: org/postgresql/jdbc/EscapedFunctions.java:749
+#: org/postgresql/jdbc/EscapedFunctions.java:787
#, java-format
-msgid "Could not find a java cryptographic algorithm: {0}."
-msgstr ""
+msgid "{0} function takes two and only two arguments."
+msgstr "{0} 函式取得二個且僅有二個引數。"
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:90
+#: org/postgresql/jdbc/EscapedFunctions.java:288
+#: org/postgresql/jdbc/EscapedFunctions.java:326
+#: org/postgresql/jdbc/EscapedFunctions.java:446
+#: org/postgresql/jdbc/EscapedFunctions.java:461
+#: org/postgresql/jdbc/EscapedFunctions.java:476
+#: org/postgresql/jdbc/EscapedFunctions.java:491
+#: org/postgresql/jdbc/EscapedFunctions.java:506
+#: org/postgresql/jdbc/EscapedFunctions.java:521
+#: org/postgresql/jdbc/EscapedFunctions.java:536
+#: org/postgresql/jdbc/EscapedFunctions.java:551
+#: org/postgresql/jdbc/EscapedFunctions.java:566
+#: org/postgresql/jdbc/EscapedFunctions.java:581
+#: org/postgresql/jdbc/EscapedFunctions.java:596
+#: org/postgresql/jdbc/EscapedFunctions.java:611
+#: org/postgresql/jdbc/EscapedFunctions.java:775
#, java-format
-msgid "The password callback class provided {0} could not be instantiated."
-msgstr ""
+msgid "{0} function takes one and only one argument."
+msgstr "{0} 函式取得一個且僅有一個引數。"
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:123
+#: org/postgresql/jdbc/EscapedFunctions.java:310
+#: org/postgresql/jdbc/EscapedFunctions.java:391
#, java-format
-msgid "Could not open SSL root certificate file {0}."
-msgstr ""
+msgid "{0} function takes two or three arguments."
+msgstr "{0} 函式取得二個或三個引數。"
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:139
+#: org/postgresql/jdbc/EscapedFunctions.java:416
+#: org/postgresql/jdbc/EscapedFunctions.java:431
+#: org/postgresql/jdbc/EscapedFunctions.java:734
+#: org/postgresql/jdbc/EscapedFunctions.java:764
#, java-format
-msgid "Could not read SSL root certificate file {0}."
-msgstr ""
+msgid "{0} function doesn''t take any argument."
+msgstr "{0} 函式無法取得任何的引數。"
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:143
+#: org/postgresql/jdbc/EscapedFunctions.java:627
+#: org/postgresql/jdbc/EscapedFunctions.java:680
#, java-format
-msgid "Loading the SSL root certificate {0} into a TrustManager failed."
-msgstr ""
-
-#: org/postgresql/ssl/jdbc4/LibPQFactory.java:156
-msgid "Could not initialize SSL context."
-msgstr ""
+msgid "{0} function takes three and only three arguments."
+msgstr "{0} 函式取得三個且僅有三個引數。"
-#: org/postgresql/ssl/MakeSSL.java:52
+#: org/postgresql/jdbc/EscapedFunctions.java:640
+#: org/postgresql/jdbc/EscapedFunctions.java:661
+#: org/postgresql/jdbc/EscapedFunctions.java:664
+#: org/postgresql/jdbc/EscapedFunctions.java:697
+#: org/postgresql/jdbc/EscapedFunctions.java:710
+#: org/postgresql/jdbc/EscapedFunctions.java:713
#, java-format
-msgid "The SSLSocketFactory class provided {0} could not be instantiated."
-msgstr ""
+msgid "Interval {0} not yet implemented"
+msgstr "隔絕 {0} 尚未被實作。"
-#: org/postgresql/ssl/MakeSSL.java:67
+#: org/postgresql/PGProperty.java:535 org/postgresql/PGProperty.java:555
#, java-format
-msgid "SSL error: {0}"
+msgid "{0} parameter value must be an integer but was: {1}"
msgstr ""
-#: org/postgresql/ssl/MakeSSL.java:78
-#, java-format
-msgid "The HostnameVerifier class provided {0} could not be instantiated."
-msgstr ""
+#: org/postgresql/largeobject/LargeObjectManager.java:144
+msgid "Failed to initialize LargeObject API"
+msgstr "初始化 LargeObject API 失敗"
-#: org/postgresql/ssl/MakeSSL.java:84
-#, java-format
-msgid "The hostname {0} could not be verified by hostnameverifier {1}."
-msgstr ""
+#: org/postgresql/largeobject/LargeObjectManager.java:262
+#: org/postgresql/largeobject/LargeObjectManager.java:305
+msgid "Large Objects may not be used in auto-commit mode."
+msgstr "大型物件無法被使用在自動確認事物交易模式。"
-#: org/postgresql/ssl/MakeSSL.java:93
+#: org/postgresql/copy/PGCopyInputStream.java:51
#, java-format
-msgid "The hostname {0} could not be verified."
-msgstr ""
-
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:167
-msgid "The sslfactoryarg property may not be empty."
-msgstr ""
-
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:183
-msgid ""
-"The environment variable containing the server's SSL certificate must not be "
-"empty."
-msgstr ""
-
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:191
-msgid ""
-"The system property containing the server's SSL certificate must not be "
-"empty."
-msgstr ""
-
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:198
-msgid ""
-"The sslfactoryarg property must start with the prefix file:, classpath:, "
-"env:, sys:, or -----BEGIN CERTIFICATE-----."
+msgid "Copying from database failed: {0}"
msgstr ""
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:210
+#: org/postgresql/copy/PGCopyInputStream.java:67
+#: org/postgresql/copy/PGCopyOutputStream.java:94
#, fuzzy
-msgid "An error occurred reading the certificate"
-msgstr "進行 SSL 連線時發生錯誤。"
+msgid "This copy stream is closed."
+msgstr "這個 ResultSet 已經被關閉。"
-#: org/postgresql/ssl/SingleCertValidatingFactory.java:243
-msgid "No X509TrustManager found"
+#: org/postgresql/copy/PGCopyInputStream.java:110
+msgid "Read from copy failed."
msgstr ""
-#: org/postgresql/util/PGInterval.java:155
-msgid "Conversion of interval failed"
-msgstr "隔絕(Interval)轉換失敗。"
-
-#: org/postgresql/util/PGmoney.java:65
-msgid "Conversion of money failed."
-msgstr "money 轉換失敗。"
-
-#: org/postgresql/util/ServerErrorMessage.java:165
-#, java-format
-msgid "Detail: {0}"
-msgstr "詳細:{0}"
-
-#: org/postgresql/util/ServerErrorMessage.java:170
+#: org/postgresql/copy/CopyManager.java:53
#, java-format
-msgid "Hint: {0}"
-msgstr "建議:{0}"
-
-#: org/postgresql/util/ServerErrorMessage.java:174
-#, java-format
-msgid "Position: {0}"
-msgstr "位置:{0}"
+msgid "Requested CopyIn but got {0}"
+msgstr ""
-#: org/postgresql/util/ServerErrorMessage.java:178
+#: org/postgresql/copy/CopyManager.java:64
#, java-format
-msgid "Where: {0}"
-msgstr "在位置:{0}"
+msgid "Requested CopyOut but got {0}"
+msgstr ""
-#: org/postgresql/util/ServerErrorMessage.java:184
+#: org/postgresql/copy/CopyManager.java:75
#, java-format
-msgid "Internal Query: {0}"
-msgstr "內部查詢:{0}"
+msgid "Requested CopyDual but got {0}"
+msgstr ""
-#: org/postgresql/util/ServerErrorMessage.java:188
+#: org/postgresql/copy/PGCopyOutputStream.java:71
#, java-format
-msgid "Internal Position: {0}"
-msgstr "內部位置:{0}"
+msgid "Cannot write to copy a byte of value {0}"
+msgstr ""
-#: org/postgresql/util/ServerErrorMessage.java:195
-#, java-format
-msgid "Location: File: {0}, Routine: {1}, Line: {2}"
-msgstr "位置:檔案:{0},常式:{1},行:{2}"
+#: org/postgresql/fastpath/Fastpath.java:80
+#, fuzzy, java-format
+msgid "Fastpath call {0} - No result was returned and we expected a numeric."
+msgstr "Fastpath 呼叫 {0} - 沒有傳回值,且應該傳回一個整數。"
-#: org/postgresql/util/ServerErrorMessage.java:200
+#: org/postgresql/fastpath/Fastpath.java:157
#, java-format
-msgid "Server SQLState: {0}"
-msgstr "伺服器 SQLState:{0}"
+msgid "Fastpath call {0} - No result was returned and we expected an integer."
+msgstr "Fastpath 呼叫 {0} - 沒有傳回值,且應該傳回一個整數。"
-#: org/postgresql/xa/PGXAConnection.java:148
+#: org/postgresql/fastpath/Fastpath.java:165
+#, fuzzy, java-format
msgid ""
-"Transaction control methods setAutoCommit(true), commit, rollback and "
-"setSavePoint not allowed while an XA transaction is active."
-msgstr ""
-
-#: org/postgresql/xa/PGXAConnection.java:196
-#: org/postgresql/xa/PGXAConnection.java:265
-msgid "Invalid flags"
-msgstr "無效的旗標"
-
-#: org/postgresql/xa/PGXAConnection.java:200
-#: org/postgresql/xa/PGXAConnection.java:269
-#: org/postgresql/xa/PGXAConnection.java:437
-msgid "xid must not be null"
-msgstr ""
-
-#: org/postgresql/xa/PGXAConnection.java:204
-msgid "Connection is busy with another transaction"
-msgstr ""
-
-#: org/postgresql/xa/PGXAConnection.java:213
-#: org/postgresql/xa/PGXAConnection.java:279
-msgid "suspend/resume not implemented"
-msgstr "暫停(suspend)/再繼續(resume)尚未被實作。"
-
-#: org/postgresql/xa/PGXAConnection.java:219
-#: org/postgresql/xa/PGXAConnection.java:224
-#: org/postgresql/xa/PGXAConnection.java:228
-msgid "Transaction interleaving not implemented"
-msgstr "事物交易隔絕(Transaction interleaving)未被實作。"
-
-#: org/postgresql/xa/PGXAConnection.java:239
-msgid "Error disabling autocommit"
-msgstr ""
+"Fastpath call {0} - No result was returned or wrong size while expecting an "
+"integer."
+msgstr "Fastpath 呼叫 {0} - 沒有傳回值,且應該傳回一個整數。"
-#: org/postgresql/xa/PGXAConnection.java:273
-msgid "tried to call end without corresponding start call"
-msgstr ""
+#: org/postgresql/fastpath/Fastpath.java:182
+#, fuzzy, java-format
+msgid "Fastpath call {0} - No result was returned and we expected a long."
+msgstr "Fastpath 呼叫 {0} - 沒有傳回值,且應該傳回一個整數。"
-#: org/postgresql/xa/PGXAConnection.java:305
+#: org/postgresql/fastpath/Fastpath.java:190
+#, fuzzy, java-format
msgid ""
-"Not implemented: Prepare must be issued using the same connection that "
-"started the transaction"
-msgstr ""
-
-#: org/postgresql/xa/PGXAConnection.java:309
-msgid "Prepare called before end"
-msgstr ""
-
-#: org/postgresql/xa/PGXAConnection.java:317
-msgid "Server versions prior to 8.1 do not support two-phase commit."
-msgstr "8.1 版之前的伺服器不支援二段式提交(Two-Phase Commit)。"
+"Fastpath call {0} - No result was returned or wrong size while expecting a "
+"long."
+msgstr "Fastpath 呼叫 {0} - 沒有傳回值,且應該傳回一個整數。"
-#: org/postgresql/xa/PGXAConnection.java:334
-msgid "Error preparing transaction"
-msgstr ""
+#: org/postgresql/fastpath/Fastpath.java:302
+#, java-format
+msgid "The fastpath function {0} is unknown."
+msgstr "不明的 fastpath 函式 {0}。"
-#: org/postgresql/xa/PGXAConnection.java:349
-msgid "Invalid flag"
-msgstr "無效的旗標"
+#~ msgid ""
+#~ "Connection refused. Check that the hostname and port are correct and that "
+#~ "the postmaster is accepting TCP/IP connections."
+#~ msgstr ""
+#~ "連線被拒,請檢查主機名稱和埠號,並確定 postmaster 可以接受 TCP/IP 連線。"
-#: org/postgresql/xa/PGXAConnection.java:384
-msgid "Error during recover"
-msgstr ""
+#, fuzzy
+#~ msgid "The connection url is invalid."
+#~ msgstr "嘗試連線已失敗。"
-#: org/postgresql/xa/PGXAConnection.java:423
-#: org/postgresql/xa/PGXAConnection.java:426
-msgid "Error rolling back prepared transaction"
-msgstr ""
+#~ msgid "Connection rejected: {0}."
+#~ msgstr "連線已被拒絕:{0}。"
-#: org/postgresql/xa/PGXAConnection.java:464
-msgid ""
-"Not implemented: one-phase commit must be issued using the same connection "
-"that was used to start it"
-msgstr ""
+#~ msgid "Backend start-up failed: {0}."
+#~ msgstr "後端啟動失敗:{0}。"
-#: org/postgresql/xa/PGXAConnection.java:468
-msgid "commit called before end"
-msgstr ""
+#~ msgid "Server versions prior to 8.0 do not support savepoints."
+#~ msgstr "8.0 版之前的伺服器不支援儲存點(SavePints)。"
-#: org/postgresql/xa/PGXAConnection.java:478
-msgid "Error during one-phase commit"
-msgstr ""
+#~ msgid "Unexpected error while decoding character data from a large object."
+#~ msgstr "從大型物件(large object)解碼字元資料時發生錯誤。"
-#: org/postgresql/xa/PGXAConnection.java:497
-msgid ""
-"Not implemented: 2nd phase commit must be issued using an idle connection"
-msgstr ""
+#, fuzzy
+#~ msgid ""
+#~ "Returning autogenerated keys is only supported for 8.2 and later servers."
+#~ msgstr "大型物件的截斷(Truncation)僅被實作執行在 8.3 和後來的伺服器。"
-#: org/postgresql/xa/PGXAConnection.java:513
-msgid "Error committing prepared transaction"
-msgstr ""
+#~ msgid "Server versions prior to 8.1 do not support two-phase commit."
+#~ msgstr "8.1 版之前的伺服器不支援二段式提交(Two-Phase Commit)。"
-#: org/postgresql/xa/PGXAConnection.java:529
-msgid "Heuristic commit/rollback not supported"
-msgstr ""
+#~ msgid "Invalid flag"
+#~ msgstr "無效的旗標"
#~ msgid "The class {0} does not implement org.postgresql.util.PGobject."
#~ msgstr "類別 {0} 未實做 org.postgresql.util.PGobject。"
diff --git a/pgjdbc/src/main/java/org/postgresql/util/Base64.java b/pgjdbc/src/main/java/org/postgresql/util/Base64.java
index 67b4e41..35fb7f5 100644
--- a/pgjdbc/src/main/java/org/postgresql/util/Base64.java
+++ b/pgjdbc/src/main/java/org/postgresql/util/Base64.java
@@ -62,24 +62,24 @@ public class Base64 {
/**
* No options specified. Value is zero.
*/
- public final static int NO_OPTIONS = 0;
+ public static final int NO_OPTIONS = 0;
/**
* Specify encoding.
*/
- public final static int ENCODE = 1;
+ public static final int ENCODE = 1;
/**
* Specify decoding.
*/
- public final static int DECODE = 0;
+ public static final int DECODE = 0;
/**
* Don't break lines when encoding (violates strict Base64 specification)
*/
- public final static int DONT_BREAK_LINES = 8;
+ public static final int DONT_BREAK_LINES = 8;
/* ******** P R I V A T E F I E L D S ******** */
@@ -88,32 +88,32 @@ public class Base64 {
/**
* Maximum line length (76) of Base64 output.
*/
- private final static int MAX_LINE_LENGTH = 76;
+ private static final int MAX_LINE_LENGTH = 76;
/**
* The equals sign (=) as a byte.
*/
- private final static byte EQUALS_SIGN = (byte) '=';
+ private static final byte EQUALS_SIGN = (byte) '=';
/**
* The new line character (\n) as a byte.
*/
- private final static byte NEW_LINE = (byte) '\n';
+ private static final byte NEW_LINE = (byte) '\n';
/**
* Preferred encoding.
*/
- private final static String PREFERRED_ENCODING = "UTF-8";
+ private static final String PREFERRED_ENCODING = "UTF-8";
/**
* The 64 valid Base64 values.
*/
- private final static byte[] ALPHABET;
- private final static byte[] _NATIVE_ALPHABET = { /* May be something funny like EBCDIC */
+ private static final byte[] ALPHABET;
+ private static final byte[] _NATIVE_ALPHABET = { /* May be something funny like EBCDIC */
(byte) 'A', (byte) 'B', (byte) 'C', (byte) 'D', (byte) 'E', (byte) 'F', (byte) 'G',
(byte) 'H', (byte) 'I', (byte) 'J', (byte) 'K', (byte) 'L', (byte) 'M', (byte) 'N',
(byte) 'O', (byte) 'P', (byte) 'Q', (byte) 'R', (byte) 'S', (byte) 'T', (byte) 'U',
@@ -143,7 +143,7 @@ public class Base64 {
* Translates a Base64 value to either its 6-bit reconstruction value or a negative number
* indicating some other meaning.
**/
- private final static byte[] DECODABET = {-9, -9, -9, -9, -9, -9, -9, -9, -9, // Decimal 0 - 8
+ private static final byte[] DECODABET = {-9, -9, -9, -9, -9, -9, -9, -9, -9, // Decimal 0 - 8
-5, -5, // Whitespace: Tab and Linefeed
-9, -9, // Decimal 11 - 12
-5, // Whitespace: Carriage Return
@@ -180,8 +180,8 @@ public class Base64 {
// I think I end up not using the BAD_ENCODING indicator.
// private final static byte BAD_ENCODING = -9; // Indicates error in encoding
- private final static byte WHITE_SPACE_ENC = -5; // Indicates white space in encoding
- private final static byte EQUALS_SIGN_ENC = -1; // Indicates equals sign in encoding
+ private static final byte WHITE_SPACE_ENC = -5; // Indicates white space in encoding
+ private static final byte EQUALS_SIGN_ENC = -1; // Indicates equals sign in encoding
/**
diff --git a/pgjdbc/src/main/java/org/postgresql/util/ByteConverter.java b/pgjdbc/src/main/java/org/postgresql/util/ByteConverter.java
index 73e56d6..5464236 100644
--- a/pgjdbc/src/main/java/org/postgresql/util/ByteConverter.java
+++ b/pgjdbc/src/main/java/org/postgresql/util/ByteConverter.java
@@ -62,6 +62,19 @@ public class ByteConverter {
}
/**
+ * Parses a boolean value from the byte array.
+ *
+ * @param bytes
+ * The byte array to parse.
+ * @param idx
+ * The starting index to read from bytes.
+ * @return parsed boolean value.
+ */
+ public static boolean bool(byte[] bytes, int idx) {
+ return bytes[idx] == 1;
+ }
+
+ /**
* Parses a float value from the byte array.
*
* @param bytes The byte array to parse.
@@ -128,6 +141,20 @@ public class ByteConverter {
}
/**
+ * Encodes a boolean value to the byte array.
+ *
+ * @param target
+ * The byte array to encode to.
+ * @param idx
+ * The starting index in the byte array.
+ * @param value
+ * The value to encode.
+ */
+ public static void bool(byte[] target, int idx, boolean value) {
+ target[idx] = value ? (byte) 1 : (byte) 0;
+ }
+
+ /**
* Encodes a int value to the byte array.
*
* @param target The byte array to encode to.
diff --git a/pgjdbc/src/main/java/org/postgresql/util/DriverInfo.java b/pgjdbc/src/main/java/org/postgresql/util/DriverInfo.java
new file mode 100644
index 0000000..0e2e5e0
--- /dev/null
+++ b/pgjdbc/src/main/java/org/postgresql/util/DriverInfo.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2017, PostgreSQL Global Development Group
+ * See the LICENSE file in the project root for more information.
+ */
+
+package org.postgresql.util;
+
+/**
+ * Utility class with constants of Driver information.
+ */
+public final class DriverInfo {
+
+ private DriverInfo() {
+ }
+
+ // Driver name
+ public static final String DRIVER_NAME = "PostgreSQL JDBC Driver";
+ public static final String DRIVER_SHORT_NAME = "PgJDBC";
+ public static final String DRIVER_VERSION = "/*$mvn.project.property.parsedversion.osgiversion$*/";
+ public static final String DRIVER_FULL_NAME = DRIVER_NAME + " " + DRIVER_VERSION;
+
+ // Driver version
+ public static final int MAJOR_VERSION = /*$mvn.project.property.parsedversion.majorversion+";"$*//*-*/42;
+ public static final int MINOR_VERSION = /*$mvn.project.property.parsedversion.minorversion+";"$*//*-*/0;
+ public static final int PATCH_VERSION = /*$mvn.project.property.parsedversion.incrementalversion+";"$*//*-*/0;
+
+ // JDBC specification
+ public static final String JDBC_VERSION = "/*$mvn.project.property.jdbc.specification.version$*/";
+ private static final int JDBC_INTVERSION = /*$mvn.project.property.jdbc.specification.version.nodot+";"$*//*-*/42;
+ public static final int JDBC_MAJOR_VERSION = JDBC_INTVERSION / 10;
+ public static final int JDBC_MINOR_VERSION = JDBC_INTVERSION % 10;
+
+}
diff --git a/pgjdbc/src/main/java/org/postgresql/util/ExpressionProperties.java b/pgjdbc/src/main/java/org/postgresql/util/ExpressionProperties.java
new file mode 100644
index 0000000..7c9d60a
--- /dev/null
+++ b/pgjdbc/src/main/java/org/postgresql/util/ExpressionProperties.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright (c) 2017, PostgreSQL Global Development Group
+ * See the LICENSE file in the project root for more information.
+ */
+
+package org.postgresql.util;
+
+import java.util.Properties;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class ExpressionProperties extends Properties {
+
+ private static final Pattern EXPRESSION = Pattern.compile("\\$\\{([^}]+)\\}");
+
+ private final Properties[] defaults;
+
+ /**
+ * Creates an empty property list with the specified defaults.
+ *
+ * @param defaults java.util.Properties
+ */
+ public ExpressionProperties(Properties ...defaults) {
+ this.defaults = defaults;
+ }
+
+ /**
+ * Returns property value with all {@code ${propKey}} like references replaced with the value of
+ * the relevant property with recursive resolution.
+ *
+ * The method returns <code>null</code> if the property is not found.
+ *
+ * @param key the property key.
+ *
+ * @return the value in this property list with
+ * the specified key value.
+ */
+ @Override
+ public String getProperty(String key) {
+ String value = getRawPropertyValue(key);
+ return replaceProperties(value);
+ }
+
+ @Override
+ public String getProperty(String key, String defaultValue) {
+ String value = getRawPropertyValue(key);
+ if (value == null) {
+ value = defaultValue;
+ }
+ return replaceProperties(value);
+ }
+
+ /**
+ * Returns raw value of a property without any replacements
+ * @param key property name
+ * @return raw property value
+ */
+ public String getRawPropertyValue(String key) {
+ String value = super.getProperty(key);
+ if (value != null) {
+ return value;
+ }
+ for (Properties properties : defaults) {
+ value = properties.getProperty(key);
+ if (value != null) {
+ return value;
+ }
+ }
+ return null;
+ }
+
+ private String replaceProperties(String value) {
+ if (value == null) {
+ return null;
+ }
+ Matcher matcher = EXPRESSION.matcher(value);
+ StringBuffer sb = null;
+ while (matcher.find()) {
+ if (sb == null) {
+ sb = new StringBuffer();
+ }
+ String propValue = getProperty(matcher.group(1));
+ if (propValue == null) {
+ // Use original content like ${propKey} if property is not found
+ propValue = matcher.group();
+ }
+ matcher.appendReplacement(sb, Matcher.quoteReplacement(propValue));
+ }
+ if (sb == null) {
+ return value;
+ }
+ matcher.appendTail(sb);
+ return sb.toString();
+ }
+}
diff --git a/pgjdbc/src/main/java/org/postgresql/util/GT.java b/pgjdbc/src/main/java/org/postgresql/util/GT.java
index 58036fa..4780e4f 100644
--- a/pgjdbc/src/main/java/org/postgresql/util/GT.java
+++ b/pgjdbc/src/main/java/org/postgresql/util/GT.java
@@ -6,6 +6,7 @@
package org.postgresql.util;
import java.text.MessageFormat;
+import java.util.Locale;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
@@ -17,8 +18,8 @@ import java.util.ResourceBundle;
*/
public class GT {
- private final static GT _gt = new GT();
- private final static Object noargs[] = new Object[0];
+ private static final GT _gt = new GT();
+ private static final Object[] noargs = new Object[0];
public static String tr(String message, Object... args) {
return _gt.translate(message, args);
@@ -28,14 +29,18 @@ public class GT {
private GT() {
try {
+ //#if mvn.project.property.postgresql.jdbc.spec < "JDBC4.1"
_bundle = ResourceBundle.getBundle("org.postgresql.translation.messages");
+ //#else
+ _bundle = ResourceBundle.getBundle("org.postgresql.translation.messages", Locale.getDefault(Locale.Category.DISPLAY));
+ //#endif
} catch (MissingResourceException mre) {
// translation files have not been installed
_bundle = null;
}
}
- private String translate(String message, Object args[]) {
+ private String translate(String message, Object[] args) {
if (_bundle != null && message != null) {
try {
message = _bundle.getString(message);
diff --git a/pgjdbc/src/main/java/org/postgresql/util/HostSpec.java b/pgjdbc/src/main/java/org/postgresql/util/HostSpec.java
index 064dd03..940b9b2 100644
--- a/pgjdbc/src/main/java/org/postgresql/util/HostSpec.java
+++ b/pgjdbc/src/main/java/org/postgresql/util/HostSpec.java
@@ -5,10 +5,17 @@
package org.postgresql.util;
+import static java.util.regex.Pattern.compile;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
/**
* Simple container for host and port.
*/
public class HostSpec {
+ public static String DEFAULT_NON_PROXY_HOSTS = "localhost|127.*|[::1]|0.0.0.0|[::0]";
+
protected final String host;
protected final int port;
@@ -39,4 +46,51 @@ public class HostSpec {
public int hashCode() {
return port ^ host.hashCode();
}
+
+ public Boolean shouldResolve() {
+ String socksProxy = System.getProperty("socksProxyHost");
+ if (socksProxy == null || socksProxy.trim().isEmpty()) {
+ return true;
+ }
+ return matchesNonProxyHosts();
+ }
+
+ private Boolean matchesNonProxyHosts() {
+ String nonProxyHosts = System.getProperty("socksNonProxyHosts", DEFAULT_NON_PROXY_HOSTS);
+ if (nonProxyHosts == null || this.host.isEmpty()) {
+ return false;
+ }
+
+ Pattern pattern = toPattern(nonProxyHosts);
+ Matcher matcher = pattern == null ? null : pattern.matcher(this.host);
+ return matcher != null && matcher.matches();
+ }
+
+ private Pattern toPattern(String mask) {
+ StringBuilder joiner = new StringBuilder();
+ String separator = "";
+ for (String disjunct : mask.split("\\|")) {
+ if (!disjunct.isEmpty()) {
+ String regex = disjunctToRegex(disjunct.toLowerCase());
+ joiner.append(separator).append(regex);
+ separator = "|";
+ }
+ }
+
+ return joiner.length() == 0 ? null : compile(joiner.toString());
+ }
+
+ private String disjunctToRegex(String disjunct) {
+ String regex;
+
+ if (disjunct.startsWith("*")) {
+ regex = ".*" + Pattern.quote(disjunct.substring(1));
+ } else if (disjunct.endsWith("*")) {
+ regex = Pattern.quote(disjunct.substring(0, disjunct.length() - 1)) + ".*";
+ } else {
+ regex = Pattern.quote(disjunct);
+ }
+
+ return regex;
+ }
}
diff --git a/pgjdbc/src/main/java/org/postgresql/util/LruCache.java b/pgjdbc/src/main/java/org/postgresql/util/LruCache.java
index 663e617..ebdebd9 100644
--- a/pgjdbc/src/main/java/org/postgresql/util/LruCache.java
+++ b/pgjdbc/src/main/java/org/postgresql/util/LruCache.java
@@ -144,14 +144,14 @@ public class LruCache<Key, Value extends CanEstimateSize> {
}
}
- public final static CreateAction NOOP_CREATE_ACTION = new CreateAction() {
+ public static final CreateAction NOOP_CREATE_ACTION = new CreateAction() {
@Override
public Object create(Object o) throws SQLException {
return null;
}
};
- public final static EvictAction NOOP_EVICT_ACTION = new EvictAction() {
+ public static final EvictAction NOOP_EVICT_ACTION = new EvictAction() {
@Override
public void evict(Object o) throws SQLException {
return;
diff --git a/pgjdbc/src/main/java/org/postgresql/util/MD5Digest.java b/pgjdbc/src/main/java/org/postgresql/util/MD5Digest.java
index c46c486..fec1fa7 100644
--- a/pgjdbc/src/main/java/org/postgresql/util/MD5Digest.java
+++ b/pgjdbc/src/main/java/org/postgresql/util/MD5Digest.java
@@ -26,7 +26,7 @@ public class MD5Digest {
* @param salt A four-salt sent by the server.
* @return A 35-byte array, comprising the string "md5" and an MD5 digest.
*/
- public static byte[] encode(byte user[], byte password[], byte salt[]) {
+ public static byte[] encode(byte[] user, byte[] password, byte[] salt) {
MessageDigest md;
byte[] temp_digest;
byte[] pass_digest;
@@ -59,7 +59,7 @@ public class MD5Digest {
* Turn 16-byte stream into a human-readable 32-byte hex string
*/
private static void bytesToHex(byte[] bytes, byte[] hex, int offset) {
- final char lookup[] =
+ final char[] lookup =
{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
int i;
diff --git a/pgjdbc/src/main/java/org/postgresql/util/PGInterval.java b/pgjdbc/src/main/java/org/postgresql/util/PGInterval.java
index 23b0a2d..95c04a2 100644
--- a/pgjdbc/src/main/java/org/postgresql/util/PGInterval.java
+++ b/pgjdbc/src/main/java/org/postgresql/util/PGInterval.java
@@ -25,7 +25,7 @@ public class PGInterval extends PGobject implements Serializable, Cloneable {
private int minutes;
private double seconds;
- private final static DecimalFormat secondsFormat;
+ private static final DecimalFormat secondsFormat;
static {
secondsFormat = new DecimalFormat("0.00####");
diff --git a/pgjdbc/src/main/java/org/postgresql/util/PGJDBCMain.java b/pgjdbc/src/main/java/org/postgresql/util/PGJDBCMain.java
index f621bf4..5c06bcc 100644
--- a/pgjdbc/src/main/java/org/postgresql/util/PGJDBCMain.java
+++ b/pgjdbc/src/main/java/org/postgresql/util/PGJDBCMain.java
@@ -5,19 +5,23 @@
package org.postgresql.util;
+import org.postgresql.Driver;
+
public class PGJDBCMain {
public static void main(String[] args) {
- PSQLDriverVersion.main(args);
+ java.net.URL url = Driver.class.getResource("/org/postgresql/Driver.class");
+ System.out.printf("%n%s%n", org.postgresql.util.DriverInfo.DRIVER_FULL_NAME);
+ System.out.printf("Found in: %s%n%n", url);
- System.out.println("\nThe PgJDBC driver is not an executable Java program.\n\n"
- + "You must install it according to the JDBC driver installation "
- + "instructions for your application / container / appserver, "
- + "then use it by specifying a JDBC URL of the form \n" + " jdbc:postgresql://\n"
- + "or using an application specific method.\n\n"
- + "See the PgJDBC documentation: http://jdbc.postgresql.org/documentation/head/index.html\n\n"
- + "This command has had no effect.\n");
+ System.out.printf("The PgJDBC driver is not an executable Java program.%n%n"
+ + "You must install it according to the JDBC driver installation "
+ + "instructions for your application / container / appserver, "
+ + "then use it by specifying a JDBC URL of the form %n jdbc:postgresql://%n"
+ + "or using an application specific method.%n%n"
+ + "See the PgJDBC documentation: http://jdbc.postgresql.org/documentation/head/index.html%n%n"
+ + "This command has had no effect.%n");
System.exit(1);
}
diff --git a/pgjdbc/src/main/java/org/postgresql/util/PGmoney.java b/pgjdbc/src/main/java/org/postgresql/util/PGmoney.java
index 3e2ed95..eb3f998 100644
--- a/pgjdbc/src/main/java/org/postgresql/util/PGmoney.java
+++ b/pgjdbc/src/main/java/org/postgresql/util/PGmoney.java
@@ -6,7 +6,6 @@
package org.postgresql.util;
-
import java.io.Serializable;
import java.sql.SQLException;
diff --git a/pgjdbc/src/main/java/org/postgresql/util/PSQLDriverVersion.java b/pgjdbc/src/main/java/org/postgresql/util/PSQLDriverVersion.java
deleted file mode 100644
index 6053c9d..0000000
--- a/pgjdbc/src/main/java/org/postgresql/util/PSQLDriverVersion.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (c) 2004, PostgreSQL Global Development Group
- * See the LICENSE file in the project root for more information.
- */
-
-
-package org.postgresql.util;
-
-import org.postgresql.Driver;
-
-/**
- * This class holds the current build number and a utility program to print it and the file it came
- * from. The primary purpose of this is to keep from filling the cvs history of Driver.java with
- * commits simply changing the build number. The utility program can also be helpful for people to
- * determine what version they really have and resolve problems with old and unknown versions
- * located somewhere in the classpath.
- */
-public class PSQLDriverVersion {
-
- public static void main(String args[]) {
- java.net.URL url = Driver.class.getResource("/org/postgresql/Driver.class");
- System.out.println(Driver.getVersion());
- System.out.println("Found in: " + url);
- }
-}
diff --git a/pgjdbc/src/main/java/org/postgresql/util/PSQLState.java b/pgjdbc/src/main/java/org/postgresql/util/PSQLState.java
index 8e74442..e72dd63 100644
--- a/pgjdbc/src/main/java/org/postgresql/util/PSQLState.java
+++ b/pgjdbc/src/main/java/org/postgresql/util/PSQLState.java
@@ -9,110 +9,108 @@ package org.postgresql.util;
/**
* This class is used for holding SQLState codes.
*/
-public class PSQLState implements java.io.Serializable {
- private String state;
+public enum PSQLState {
- public String getState() {
- return this.state;
- }
-
- public PSQLState(String state) {
- this.state = state;
- }
+ UNKNOWN_STATE(""),
- @Override
- public boolean equals(Object o) {
- if (this == o) {
- return true;
- }
- if (o == null || getClass() != o.getClass()) {
- return false;
- }
- PSQLState psqlState = (PSQLState) o;
- return !(state != null ? !state.equals(psqlState.state) : psqlState.state != null);
- }
-
- @Override
- public int hashCode() {
- return state != null ? state.hashCode() : 0;
- }
+ TOO_MANY_RESULTS("0100E"),
- // begin constant state codes
- public final static PSQLState UNKNOWN_STATE = new PSQLState("");
+ NO_DATA("02000"),
- public final static PSQLState TOO_MANY_RESULTS = new PSQLState("0100E");
-
- public final static PSQLState NO_DATA = new PSQLState("02000");
-
- public final static PSQLState INVALID_PARAMETER_TYPE = new PSQLState("07006");
+ INVALID_PARAMETER_TYPE("07006"),
/**
* We could establish a connection with the server for unknown reasons. Could be a network
* problem.
*/
- public final static PSQLState CONNECTION_UNABLE_TO_CONNECT = new PSQLState("08001");
+ CONNECTION_UNABLE_TO_CONNECT("08001"),
- public final static PSQLState CONNECTION_DOES_NOT_EXIST = new PSQLState("08003");
+ CONNECTION_DOES_NOT_EXIST("08003"),
/**
* The server rejected our connection attempt. Usually an authentication failure, but could be a
* configuration error like asking for a SSL connection with a server that wasn't built with SSL
* support.
*/
- public final static PSQLState CONNECTION_REJECTED = new PSQLState("08004");
+ CONNECTION_REJECTED("08004"),
/**
* After a connection has been established, it went bad.
*/
- public final static PSQLState CONNECTION_FAILURE = new PSQLState("08006");
- public final static PSQLState CONNECTION_FAILURE_DURING_TRANSACTION = new PSQLState("08007");
+ CONNECTION_FAILURE("08006"),
+ CONNECTION_FAILURE_DURING_TRANSACTION("08007"),
/**
* The server sent us a response the driver was not prepared for and is either bizarre datastream
* corruption, a driver bug, or a protocol violation on the server's part.
*/
- public final static PSQLState PROTOCOL_VIOLATION = new PSQLState("08P01");
+ PROTOCOL_VIOLATION("08P01"),
+
+ COMMUNICATION_ERROR("08S01"),
- public final static PSQLState COMMUNICATION_ERROR = new PSQLState("08S01");
+ NOT_IMPLEMENTED("0A000"),
- public final static PSQLState NOT_IMPLEMENTED = new PSQLState("0A000");
+ DATA_ERROR("22000"),
+ STRING_DATA_RIGHT_TRUNCATION("22001"),
+ NUMERIC_VALUE_OUT_OF_RANGE("22003"),
+ BAD_DATETIME_FORMAT("22007"),
+ DATETIME_OVERFLOW("22008"),
+ DIVISION_BY_ZERO("22012"),
+ MOST_SPECIFIC_TYPE_DOES_NOT_MATCH("2200G"),
+ INVALID_PARAMETER_VALUE("22023"),
- public final static PSQLState DATA_ERROR = new PSQLState("22000");
- public final static PSQLState NUMERIC_VALUE_OUT_OF_RANGE = new PSQLState("22003");
- public final static PSQLState BAD_DATETIME_FORMAT = new PSQLState("22007");
- public final static PSQLState DATETIME_OVERFLOW = new PSQLState("22008");
- public final static PSQLState DIVISION_BY_ZERO = new PSQLState("22012");
- public final static PSQLState MOST_SPECIFIC_TYPE_DOES_NOT_MATCH = new PSQLState("2200G");
- public final static PSQLState INVALID_PARAMETER_VALUE = new PSQLState("22023");
+ INVALID_CURSOR_STATE("24000"),
- public final static PSQLState INVALID_CURSOR_STATE = new PSQLState("24000");
+ TRANSACTION_STATE_INVALID("25000"),
+ ACTIVE_SQL_TRANSACTION("25001"),
+ NO_ACTIVE_SQL_TRANSACTION("25P01"),
+ IN_FAILED_SQL_TRANSACTION("25P02"),
- public final static PSQLState TRANSACTION_STATE_INVALID = new PSQLState("25000");
- public final static PSQLState ACTIVE_SQL_TRANSACTION = new PSQLState("25001");
- public final static PSQLState NO_ACTIVE_SQL_TRANSACTION = new PSQLState("25P01");
- public final static PSQLState IN_FAILED_SQL_TRANSACTION = new PSQLState("25P02");
+ INVALID_SQL_STATEMENT_NAME("26000"),
+ INVALID_AUTHORIZATION_SPECIFICATION("28000"),
- public final static PSQLState INVALID_SQL_STATEMENT_NAME = new PSQLState("26000");
- public final static PSQLState INVALID_AUTHORIZATION_SPECIFICATION = new PSQLState("28000");
+ STATEMENT_NOT_ALLOWED_IN_FUNCTION_CALL("2F003"),
- public final static PSQLState STATEMENT_NOT_ALLOWED_IN_FUNCTION_CALL = new PSQLState("2F003");
+ INVALID_SAVEPOINT_SPECIFICATION("3B000"),
- public final static PSQLState INVALID_SAVEPOINT_SPECIFICATION = new PSQLState("3B000");
+ SYNTAX_ERROR("42601"),
+ UNDEFINED_COLUMN("42703"),
+ UNDEFINED_OBJECT("42704"),
+ WRONG_OBJECT_TYPE("42809"),
+ NUMERIC_CONSTANT_OUT_OF_RANGE("42820"),
+ DATA_TYPE_MISMATCH("42821"),
+ UNDEFINED_FUNCTION("42883"),
+ INVALID_NAME("42602"),
+ DATATYPE_MISMATCH("42804"),
+ CANNOT_COERCE("42846"),
- public final static PSQLState SYNTAX_ERROR = new PSQLState("42601");
- public final static PSQLState UNDEFINED_COLUMN = new PSQLState("42703");
- public final static PSQLState UNDEFINED_OBJECT = new PSQLState("42704");
- public final static PSQLState WRONG_OBJECT_TYPE = new PSQLState("42809");
- public final static PSQLState NUMERIC_CONSTANT_OUT_OF_RANGE = new PSQLState("42820");
- public final static PSQLState DATA_TYPE_MISMATCH = new PSQLState("42821");
- public final static PSQLState UNDEFINED_FUNCTION = new PSQLState("42883");
- public final static PSQLState INVALID_NAME = new PSQLState("42602");
+ OUT_OF_MEMORY("53200"),
+ OBJECT_NOT_IN_STATE("55000"),
+ OBJECT_IN_USE("55006"),
- public final static PSQLState OUT_OF_MEMORY = new PSQLState("53200");
- public final static PSQLState OBJECT_NOT_IN_STATE = new PSQLState("55000");
+ QUERY_CANCELED("57014"),
- public final static PSQLState SYSTEM_ERROR = new PSQLState("60000");
- public final static PSQLState IO_ERROR = new PSQLState("58030");
+ SYSTEM_ERROR("60000"),
+ IO_ERROR("58030"),
+
+ UNEXPECTED_ERROR("99999");
+
+ private final String state;
+
+ PSQLState(String state) {
+ this.state = state;
+ }
+
+ public String getState() {
+ return this.state;
+ }
+
+ public static boolean isConnectionError(String psqlState) {
+ return PSQLState.CONNECTION_UNABLE_TO_CONNECT.getState().equals(psqlState)
+ || PSQLState.CONNECTION_DOES_NOT_EXIST.getState().equals(psqlState)
+ || PSQLState.CONNECTION_REJECTED.getState().equals(psqlState)
+ || PSQLState.CONNECTION_FAILURE.getState().equals(psqlState)
+ || PSQLState.CONNECTION_FAILURE_DURING_TRANSACTION.getState().equals(psqlState);
+ }
- public final static PSQLState UNEXPECTED_ERROR = new PSQLState("99999");
}
diff --git a/pgjdbc/src/main/java/org/postgresql/util/PSQLWarning.java b/pgjdbc/src/main/java/org/postgresql/util/PSQLWarning.java
index 0a81fb0..c52ff22 100644
--- a/pgjdbc/src/main/java/org/postgresql/util/PSQLWarning.java
+++ b/pgjdbc/src/main/java/org/postgresql/util/PSQLWarning.java
@@ -13,17 +13,10 @@ public class PSQLWarning extends SQLWarning {
private ServerErrorMessage serverError;
public PSQLWarning(ServerErrorMessage err) {
+ super(err.toString(), err.getSQLState());
this.serverError = err;
}
- public String toString() {
- return serverError.toString();
- }
-
- public String getSQLState() {
- return serverError.getSQLState();
- }
-
public String getMessage() {
return serverError.getMessage();
}
diff --git a/pgjdbc/src/main/java/org/postgresql/util/ReaderInputStream.java b/pgjdbc/src/main/java/org/postgresql/util/ReaderInputStream.java
new file mode 100644
index 0000000..6d7c514
--- /dev/null
+++ b/pgjdbc/src/main/java/org/postgresql/util/ReaderInputStream.java
@@ -0,0 +1,162 @@
+/*
+ * Copyright (c) 2016, PostgreSQL Global Development Group
+ * See the LICENSE file in the project root for more information.
+ */
+
+package org.postgresql.util;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Reader;
+import java.nio.ByteBuffer;
+import java.nio.CharBuffer;
+import java.nio.charset.CharacterCodingException;
+import java.nio.charset.Charset;
+import java.nio.charset.CharsetEncoder;
+import java.nio.charset.CoderResult;
+
+/**
+ * ReaderInputStream accepts a UTF-16 char stream (Reader) as input and
+ * converts it to a UTF-8 byte stream (InputStream) as output.
+ *
+ * This is the inverse of java.io.InputStreamReader which converts a
+ * binary stream to a character stream.
+ */
+public class ReaderInputStream extends InputStream {
+ private static final int DEFAULT_CHAR_BUFFER_SIZE = 8 * 1024;
+
+ private static final Charset UTF_8 = Charset.forName("UTF-8");
+
+ private final Reader reader;
+ private final CharsetEncoder encoder;
+ private final ByteBuffer bbuf;
+ private final CharBuffer cbuf;
+
+ /**
+ * true when all of the characters have been read from the reader into inbuf
+ */
+ private boolean endOfInput;
+ private final byte[] oneByte = new byte[1];
+
+ public ReaderInputStream(Reader reader) {
+ this(reader, DEFAULT_CHAR_BUFFER_SIZE);
+ }
+
+ /**
+ * Allow ReaderInputStreamTest to use small buffers to force UTF-16
+ * surrogate pairs to cross buffer boundaries in interesting ways.
+ * Because this constructor is package-private, the unit test must be in
+ * the same package.
+ */
+ ReaderInputStream(Reader reader, int charBufferSize) {
+ if (reader == null) {
+ throw new IllegalArgumentException("reader cannot be null");
+ }
+
+ // The standard UTF-8 encoder will only encode a UTF-16 surrogate pair
+ // when both surrogates are available in the CharBuffer.
+ if (charBufferSize < 2) {
+ throw new IllegalArgumentException("charBufferSize must be at least 2 chars");
+ }
+
+ this.reader = reader;
+ this.encoder = UTF_8.newEncoder();
+ // encoder.maxBytesPerChar() always returns 3.0 for UTF-8
+ this.bbuf = ByteBuffer.allocate(3 * charBufferSize);
+ this.bbuf.flip(); // prepare for subsequent write
+ this.cbuf = CharBuffer.allocate(charBufferSize);
+ this.cbuf.flip(); // prepare for subsequent write
+ }
+
+ private void advance() throws IOException {
+ assert !endOfInput;
+ assert !bbuf.hasRemaining()
+ : "advance() should be called when output byte buffer is empty. bbuf: " + bbuf + ", as string: " + bbuf.asCharBuffer().toString();
+ assert cbuf.remaining() < 2;
+
+ // given that bbuf.capacity = 3 x cbuf.capacity, the only time that we should have a
+ // remaining char is if the last char read was the 1st half of a surrogate pair
+ if (cbuf.remaining() == 0) {
+ cbuf.clear();
+ } else {
+ cbuf.compact();
+ }
+
+ int n = reader.read(cbuf); // read #1
+ cbuf.flip();
+
+ CoderResult result;
+
+ endOfInput = n == -1;
+
+ bbuf.clear();
+ result = encoder.encode(cbuf, bbuf, endOfInput);
+ checkEncodeResult(result);
+
+ if (endOfInput) {
+ result = encoder.flush(bbuf);
+ checkEncodeResult(result);
+ }
+
+ bbuf.flip();
+ }
+
+ private void checkEncodeResult(CoderResult result) throws CharacterCodingException {
+ if (result.isError()) {
+ result.throwException();
+ }
+ }
+
+ @Override
+ public int read() throws IOException {
+ int res = 0;
+ while (res != -1) {
+ res = read(oneByte);
+ if (res > 0) {
+ return oneByte[0];
+ }
+ }
+ return -1;
+ }
+
+ // The implementation of InputStream.read(byte[], int, int) silently ignores
+ // an IOException thrown by overrides of the read() method.
+ @Override
+ public int read(byte[] b, int off, int len) throws IOException {
+ if (b == null) {
+ throw new NullPointerException();
+ } else if (off < 0 || len < 0 || len > b.length - off) {
+ throw new IndexOutOfBoundsException();
+ } else if (len == 0) {
+ return 0;
+ }
+ if (endOfInput && !bbuf.hasRemaining()) {
+ return -1;
+ }
+
+ int totalRead = 0;
+ while (len > 0 && !endOfInput) {
+ if (bbuf.hasRemaining()) {
+ int remaining = Math.min(len, bbuf.remaining());
+ bbuf.get(b, off, remaining);
+ totalRead += remaining;
+ off += remaining;
+ len -= remaining;
+ if (len == 0) {
+ return totalRead;
+ }
+ }
+ advance();
+ }
+ if (endOfInput && !bbuf.hasRemaining() && totalRead == 0) {
+ return -1;
+ }
+ return totalRead;
+ }
+
+ @Override
+ public void close() throws IOException {
+ endOfInput = true;
+ reader.close();
+ }
+}
diff --git a/pgjdbc/src/main/java/org/postgresql/util/ServerErrorMessage.java b/pgjdbc/src/main/java/org/postgresql/util/ServerErrorMessage.java
index fb194a8..bc522c2 100644
--- a/pgjdbc/src/main/java/org/postgresql/util/ServerErrorMessage.java
+++ b/pgjdbc/src/main/java/org/postgresql/util/ServerErrorMessage.java
@@ -11,9 +11,13 @@ import org.postgresql.core.EncodingPredictor;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
+import java.util.logging.Level;
+import java.util.logging.Logger;
public class ServerErrorMessage implements Serializable {
+ private static final Logger LOGGER = Logger.getLogger(ServerErrorMessage.class.getName());
+
private static final Character SEVERITY = 'S';
private static final Character MESSAGE = 'M';
private static final Character DETAIL = 'D';
@@ -33,10 +37,9 @@ public class ServerErrorMessage implements Serializable {
private static final Character CONSTRAINT = 'n';
private final Map<Character, String> m_mesgParts = new HashMap<Character, String>();
- private final int verbosity;
- public ServerErrorMessage(EncodingPredictor.DecodeResult serverError, int verbosity) {
- this(serverError.result, verbosity);
+ public ServerErrorMessage(EncodingPredictor.DecodeResult serverError) {
+ this(serverError.result);
if (serverError.encoding != null) {
m_mesgParts.put(MESSAGE, m_mesgParts.get(MESSAGE)
+ GT.tr(" (pgjdbc: autodetected server-encoding to be {0}, if the message is not readable, please check database logs and/or host, port, dbname, user, password, pg_hba.conf)",
@@ -45,9 +48,7 @@ public class ServerErrorMessage implements Serializable {
}
}
- public ServerErrorMessage(String p_serverError, int verbosity) {
- this.verbosity = verbosity;
-
+ public ServerErrorMessage(String p_serverError) {
char[] l_chars = p_serverError.toCharArray();
int l_pos = 0;
int l_length = l_chars.length;
@@ -188,7 +189,7 @@ public class ServerErrorMessage implements Serializable {
l_totalMessage.append("\n ").append(GT.tr("Where: {0}", l_message));
}
- if (verbosity > 2) {
+ if (LOGGER.isLoggable(Level.FINEST)) {
String l_internalQuery = m_mesgParts.get(INTERNAL_QUERY);
if (l_internalQuery != null) {
l_totalMessage.append("\n ").append(GT.tr("Internal Query: {0}", l_internalQuery));
@@ -203,7 +204,7 @@ public class ServerErrorMessage implements Serializable {
String l_routine = m_mesgParts.get(ROUTINE);
if (l_file != null || l_line != null || l_routine != null) {
l_totalMessage.append("\n ").append(GT.tr("Location: File: {0}, Routine: {1}, Line: {2}",
- new Object[]{l_file, l_routine, l_line}));
+ l_file, l_routine, l_line));
}
l_message = m_mesgParts.get(SQLSTATE);
if (l_message != null) {
diff --git a/pgjdbc/src/main/java/org/postgresql/util/SharedTimer.java b/pgjdbc/src/main/java/org/postgresql/util/SharedTimer.java
index 9d9f42a..bde4ab2 100644
--- a/pgjdbc/src/main/java/org/postgresql/util/SharedTimer.java
+++ b/pgjdbc/src/main/java/org/postgresql/util/SharedTimer.java
@@ -3,24 +3,22 @@
* See the LICENSE file in the project root for more information.
*/
-
package org.postgresql.util;
-import org.postgresql.core.Logger;
-
import java.util.Timer;
import java.util.concurrent.atomic.AtomicInteger;
+import java.util.logging.Level;
+import java.util.logging.Logger;
public class SharedTimer {
// Incremented for each Timer created, this allows each to have a unique Timer name
- private static AtomicInteger timerCount = new AtomicInteger(0);
+ private static final AtomicInteger timerCount = new AtomicInteger(0);
- private Logger log;
+ private static final Logger LOGGER = Logger.getLogger(SharedTimer.class.getName());
private volatile Timer timer = null;
- private AtomicInteger refCount = new AtomicInteger(0);
+ private final AtomicInteger refCount = new AtomicInteger(0);
- public SharedTimer(Logger log) {
- this.log = log;
+ public SharedTimer() {
}
public int getRefCount() {
@@ -55,17 +53,17 @@ public class SharedTimer {
int count = refCount.decrementAndGet();
if (count > 0) {
// There are outstanding references to the timer so do nothing
- log.debug("Outstanding references still exist so not closing shared Timer");
+ LOGGER.log(Level.FINEST, "Outstanding references still exist so not closing shared Timer");
} else if (count == 0) {
// This is the last usage of the Timer so cancel it so it's resources can be release.
- log.debug("No outstanding references to shared Timer, will cancel and close it");
+ LOGGER.log(Level.FINEST, "No outstanding references to shared Timer, will cancel and close it");
if (timer != null) {
timer.cancel();
timer = null;
}
} else {
// Should not get here under normal circumstance, probably a bug in app code.
- log.debug(
+ LOGGER.log(Level.WARNING,
"releaseTimer() called too many times; there is probably a bug in the calling code");
refCount.set(0);
}
diff --git a/pgjdbc/src/main/java/org/postgresql/util/UnixCrypt.java b/pgjdbc/src/main/java/org/postgresql/util/UnixCrypt.java
deleted file mode 100644
index fabd622..0000000
--- a/pgjdbc/src/main/java/org/postgresql/util/UnixCrypt.java
+++ /dev/null
@@ -1,590 +0,0 @@
-/*
- * Copyright (c) 2003, PostgreSQL Global Development Group
- * See the LICENSE file in the project root for more information.
- */
-
-package org.postgresql.util;
-
-/**
- * Contains static methods to encrypt and compare passwords with Unix encrypted passwords.
- * <P>
- * See <A HREF="http://www.zeh.com/local/jfd/crypt.html"> John Dumas's Java Crypt page</A> for the
- * original source.
- * </P>
- *
- * @author jdumas at zgs.com (John Dumas)
- */
-public class UnixCrypt extends Object {
- //
- // Null constructor - can't instantiate class
- private UnixCrypt() {
- }
-
- private static final int ITERATIONS = 16;
-
- private static final int con_salt[] = {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
- 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,
- 0x0A, 0x0B, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A,
- 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12,
- 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A,
- 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22,
- 0x23, 0x24, 0x25, 0x20, 0x21, 0x22, 0x23, 0x24,
- 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C,
- 0x2D, 0x2E, 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34,
- 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C,
- 0x3D, 0x3E, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00,
- };
-
- private static final boolean shifts2[] = {
- false, false, true, true, true, true, true, true,
- false, true, true, true, true, true, true, false
- };
-
- private static final int skb[][] = {{
- /* for C bits (numbered as per FIPS 46) 1 2 3 4 5 6 */
- 0x00000000, 0x00000010, 0x20000000, 0x20000010,
- 0x00010000, 0x00010010, 0x20010000, 0x20010010,
- 0x00000800, 0x00000810, 0x20000800, 0x20000810,
- 0x00010800, 0x00010810, 0x20010800, 0x20010810,
- 0x00000020, 0x00000030, 0x20000020, 0x20000030,
- 0x00010020, 0x00010030, 0x20010020, 0x20010030,
- 0x00000820, 0x00000830, 0x20000820, 0x20000830,
- 0x00010820, 0x00010830, 0x20010820, 0x20010830,
- 0x00080000, 0x00080010, 0x20080000, 0x20080010,
- 0x00090000, 0x00090010, 0x20090000, 0x20090010,
- 0x00080800, 0x00080810, 0x20080800, 0x20080810,
- 0x00090800, 0x00090810, 0x20090800, 0x20090810,
- 0x00080020, 0x00080030, 0x20080020, 0x20080030,
- 0x00090020, 0x00090030, 0x20090020, 0x20090030,
- 0x00080820, 0x00080830, 0x20080820, 0x20080830,
- 0x00090820, 0x00090830, 0x20090820, 0x20090830}, {
- /* for C bits (numbered as per FIPS 46) 7 8 10 11 12 13 */
- 0x00000000, 0x02000000, 0x00002000, 0x02002000,
- 0x00200000, 0x02200000, 0x00202000, 0x02202000,
- 0x00000004, 0x02000004, 0x00002004, 0x02002004,
- 0x00200004, 0x02200004, 0x00202004, 0x02202004,
- 0x00000400, 0x02000400, 0x00002400, 0x02002400,
- 0x00200400, 0x02200400, 0x00202400, 0x02202400,
- 0x00000404, 0x02000404, 0x00002404, 0x02002404,
- 0x00200404, 0x02200404, 0x00202404, 0x02202404,
- 0x10000000, 0x12000000, 0x10002000, 0x12002000,
- 0x10200000, 0x12200000, 0x10202000, 0x12202000,
- 0x10000004, 0x12000004, 0x10002004, 0x12002004,
- 0x10200004, 0x12200004, 0x10202004, 0x12202004,
- 0x10000400, 0x12000400, 0x10002400, 0x12002400,
- 0x10200400, 0x12200400, 0x10202400, 0x12202400,
- 0x10000404, 0x12000404, 0x10002404, 0x12002404,
- 0x10200404, 0x12200404, 0x10202404, 0x12202404}, {
- /* for C bits (numbered as per FIPS 46) 14 15 16 17 19 20 */
- 0x00000000, 0x00000001, 0x00040000, 0x00040001,
- 0x01000000, 0x01000001, 0x01040000, 0x01040001,
- 0x00000002, 0x00000003, 0x00040002, 0x00040003,
- 0x01000002, 0x01000003, 0x01040002, 0x01040003,
- 0x00000200, 0x00000201, 0x00040200, 0x00040201,
- 0x01000200, 0x01000201, 0x01040200, 0x01040201,
- 0x00000202, 0x00000203, 0x00040202, 0x00040203,
- 0x01000202, 0x01000203, 0x01040202, 0x01040203,
- 0x08000000, 0x08000001, 0x08040000, 0x08040001,
- 0x09000000, 0x09000001, 0x09040000, 0x09040001,
- 0x08000002, 0x08000003, 0x08040002, 0x08040003,
- 0x09000002, 0x09000003, 0x09040002, 0x09040003,
- 0x08000200, 0x08000201, 0x08040200, 0x08040201,
- 0x09000200, 0x09000201, 0x09040200, 0x09040201,
- 0x08000202, 0x08000203, 0x08040202, 0x08040203,
- 0x09000202, 0x09000203, 0x09040202, 0x09040203}, {
- /* for C bits (numbered as per FIPS 46) 21 23 24 26 27 28 */
- 0x00000000, 0x00100000, 0x00000100, 0x00100100,
- 0x00000008, 0x00100008, 0x00000108, 0x00100108,
- 0x00001000, 0x00101000, 0x00001100, 0x00101100,
- 0x00001008, 0x00101008, 0x00001108, 0x00101108,
- 0x04000000, 0x04100000, 0x04000100, 0x04100100,
- 0x04000008, 0x04100008, 0x04000108, 0x04100108,
- 0x04001000, 0x04101000, 0x04001100, 0x04101100,
- 0x04001008, 0x04101008, 0x04001108, 0x04101108,
- 0x00020000, 0x00120000, 0x00020100, 0x00120100,
- 0x00020008, 0x00120008, 0x00020108, 0x00120108,
- 0x00021000, 0x00121000, 0x00021100, 0x00121100,
- 0x00021008, 0x00121008, 0x00021108, 0x00121108,
- 0x04020000, 0x04120000, 0x04020100, 0x04120100,
- 0x04020008, 0x04120008, 0x04020108, 0x04120108,
- 0x04021000, 0x04121000, 0x04021100, 0x04121100,
- 0x04021008, 0x04121008, 0x04021108, 0x04121108}, {
- /* for D bits (numbered as per FIPS 46) 1 2 3 4 5 6 */
- 0x00000000, 0x10000000, 0x00010000, 0x10010000,
- 0x00000004, 0x10000004, 0x00010004, 0x10010004,
- 0x20000000, 0x30000000, 0x20010000, 0x30010000,
- 0x20000004, 0x30000004, 0x20010004, 0x30010004,
- 0x00100000, 0x10100000, 0x00110000, 0x10110000,
- 0x00100004, 0x10100004, 0x00110004, 0x10110004,
- 0x20100000, 0x30100000, 0x20110000, 0x30110000,
- 0x20100004, 0x30100004, 0x20110004, 0x30110004,
- 0x00001000, 0x10001000, 0x00011000, 0x10011000,
- 0x00001004, 0x10001004, 0x00011004, 0x10011004,
- 0x20001000, 0x30001000, 0x20011000, 0x30011000,
- 0x20001004, 0x30001004, 0x20011004, 0x30011004,
- 0x00101000, 0x10101000, 0x00111000, 0x10111000,
- 0x00101004, 0x10101004, 0x00111004, 0x10111004,
- 0x20101000, 0x30101000, 0x20111000, 0x30111000,
- 0x20101004, 0x30101004, 0x20111004, 0x30111004}, {
- /* for D bits (numbered as per FIPS 46) 8 9 11 12 13 14 */
- 0x00000000, 0x08000000, 0x00000008, 0x08000008,
- 0x00000400, 0x08000400, 0x00000408, 0x08000408,
- 0x00020000, 0x08020000, 0x00020008, 0x08020008,
- 0x00020400, 0x08020400, 0x00020408, 0x08020408,
- 0x00000001, 0x08000001, 0x00000009, 0x08000009,
- 0x00000401, 0x08000401, 0x00000409, 0x08000409,
- 0x00020001, 0x08020001, 0x00020009, 0x08020009,
- 0x00020401, 0x08020401, 0x00020409, 0x08020409,
- 0x02000000, 0x0A000000, 0x02000008, 0x0A000008,
- 0x02000400, 0x0A000400, 0x02000408, 0x0A000408,
- 0x02020000, 0x0A020000, 0x02020008, 0x0A020008,
- 0x02020400, 0x0A020400, 0x02020408, 0x0A020408,
- 0x02000001, 0x0A000001, 0x02000009, 0x0A000009,
- 0x02000401, 0x0A000401, 0x02000409, 0x0A000409,
- 0x02020001, 0x0A020001, 0x02020009, 0x0A020009,
- 0x02020401, 0x0A020401, 0x02020409, 0x0A020409}, {
- /* for D bits (numbered as per FIPS 46) 16 17 18 19 20 21 */
- 0x00000000, 0x00000100, 0x00080000, 0x00080100,
- 0x01000000, 0x01000100, 0x01080000, 0x01080100,
- 0x00000010, 0x00000110, 0x00080010, 0x00080110,
- 0x01000010, 0x01000110, 0x01080010, 0x01080110,
- 0x00200000, 0x00200100, 0x00280000, 0x00280100,
- 0x01200000, 0x01200100, 0x01280000, 0x01280100,
- 0x00200010, 0x00200110, 0x00280010, 0x00280110,
- 0x01200010, 0x01200110, 0x01280010, 0x01280110,
- 0x00000200, 0x00000300, 0x00080200, 0x00080300,
- 0x01000200, 0x01000300, 0x01080200, 0x01080300,
- 0x00000210, 0x00000310, 0x00080210, 0x00080310,
- 0x01000210, 0x01000310, 0x01080210, 0x01080310,
- 0x00200200, 0x00200300, 0x00280200, 0x00280300,
- 0x01200200, 0x01200300, 0x01280200, 0x01280300,
- 0x00200210, 0x00200310, 0x00280210, 0x00280310,
- 0x01200210, 0x01200310, 0x01280210, 0x01280310}, {
- /* for D bits (numbered as per FIPS 46) 22 23 24 25 27 28 */
- 0x00000000, 0x04000000, 0x00040000, 0x04040000,
- 0x00000002, 0x04000002, 0x00040002, 0x04040002,
- 0x00002000, 0x04002000, 0x00042000, 0x04042000,
- 0x00002002, 0x04002002, 0x00042002, 0x04042002,
- 0x00000020, 0x04000020, 0x00040020, 0x04040020,
- 0x00000022, 0x04000022, 0x00040022, 0x04040022,
- 0x00002020, 0x04002020, 0x00042020, 0x04042020,
- 0x00002022, 0x04002022, 0x00042022, 0x04042022,
- 0x00000800, 0x04000800, 0x00040800, 0x04040800,
- 0x00000802, 0x04000802, 0x00040802, 0x04040802,
- 0x00002800, 0x04002800, 0x00042800, 0x04042800,
- 0x00002802, 0x04002802, 0x00042802, 0x04042802,
- 0x00000820, 0x04000820, 0x00040820, 0x04040820,
- 0x00000822, 0x04000822, 0x00040822, 0x04040822,
- 0x00002820, 0x04002820, 0x00042820, 0x04042820,
- 0x00002822, 0x04002822, 0x00042822, 0x04042822},
- };
-
- private static final int SPtrans[][] = {{
- /* nibble 0 */
- 0x00820200, 0x00020000, 0x80800000, 0x80820200,
- 0x00800000, 0x80020200, 0x80020000, 0x80800000,
- 0x80020200, 0x00820200, 0x00820000, 0x80000200,
- 0x80800200, 0x00800000, 0x00000000, 0x80020000,
- 0x00020000, 0x80000000, 0x00800200, 0x00020200,
- 0x80820200, 0x00820000, 0x80000200, 0x00800200,
- 0x80000000, 0x00000200, 0x00020200, 0x80820000,
- 0x00000200, 0x80800200, 0x80820000, 0x00000000,
- 0x00000000, 0x80820200, 0x00800200, 0x80020000,
- 0x00820200, 0x00020000, 0x80000200, 0x00800200,
- 0x80820000, 0x00000200, 0x00020200, 0x80800000,
- 0x80020200, 0x80000000, 0x80800000, 0x00820000,
- 0x80820200, 0x00020200, 0x00820000, 0x80800200,
- 0x00800000, 0x80000200, 0x80020000, 0x00000000,
- 0x00020000, 0x00800000, 0x80800200, 0x00820200,
- 0x80000000, 0x80820000, 0x00000200, 0x80020200}, {
- /* nibble 1 */
- 0x10042004, 0x00000000, 0x00042000, 0x10040000,
- 0x10000004, 0x00002004, 0x10002000, 0x00042000,
- 0x00002000, 0x10040004, 0x00000004, 0x10002000,
- 0x00040004, 0x10042000, 0x10040000, 0x00000004,
- 0x00040000, 0x10002004, 0x10040004, 0x00002000,
- 0x00042004, 0x10000000, 0x00000000, 0x00040004,
- 0x10002004, 0x00042004, 0x10042000, 0x10000004,
- 0x10000000, 0x00040000, 0x00002004, 0x10042004,
- 0x00040004, 0x10042000, 0x10002000, 0x00042004,
- 0x10042004, 0x00040004, 0x10000004, 0x00000000,
- 0x10000000, 0x00002004, 0x00040000, 0x10040004,
- 0x00002000, 0x10000000, 0x00042004, 0x10002004,
- 0x10042000, 0x00002000, 0x00000000, 0x10000004,
- 0x00000004, 0x10042004, 0x00042000, 0x10040000,
- 0x10040004, 0x00040000, 0x00002004, 0x10002000,
- 0x10002004, 0x00000004, 0x10040000, 0x00042000}, {
- /* nibble 2 */
- 0x41000000, 0x01010040, 0x00000040, 0x41000040,
- 0x40010000, 0x01000000, 0x41000040, 0x00010040,
- 0x01000040, 0x00010000, 0x01010000, 0x40000000,
- 0x41010040, 0x40000040, 0x40000000, 0x41010000,
- 0x00000000, 0x40010000, 0x01010040, 0x00000040,
- 0x40000040, 0x41010040, 0x00010000, 0x41000000,
- 0x41010000, 0x01000040, 0x40010040, 0x01010000,
- 0x00010040, 0x00000000, 0x01000000, 0x40010040,
- 0x01010040, 0x00000040, 0x40000000, 0x00010000,
- 0x40000040, 0x40010000, 0x01010000, 0x41000040,
- 0x00000000, 0x01010040, 0x00010040, 0x41010000,
- 0x40010000, 0x01000000, 0x41010040, 0x40000000,
- 0x40010040, 0x41000000, 0x01000000, 0x41010040,
- 0x00010000, 0x01000040, 0x41000040, 0x00010040,
- 0x01000040, 0x00000000, 0x41010000, 0x40000040,
- 0x41000000, 0x40010040, 0x00000040, 0x01010000}, {
- /* nibble 3 */
- 0x00100402, 0x04000400, 0x00000002, 0x04100402,
- 0x00000000, 0x04100000, 0x04000402, 0x00100002,
- 0x04100400, 0x04000002, 0x04000000, 0x00000402,
- 0x04000002, 0x00100402, 0x00100000, 0x04000000,
- 0x04100002, 0x00100400, 0x00000400, 0x00000002,
- 0x00100400, 0x04000402, 0x04100000, 0x00000400,
- 0x00000402, 0x00000000, 0x00100002, 0x04100400,
- 0x04000400, 0x04100002, 0x04100402, 0x00100000,
- 0x04100002, 0x00000402, 0x00100000, 0x04000002,
- 0x00100400, 0x04000400, 0x00000002, 0x04100000,
- 0x04000402, 0x00000000, 0x00000400, 0x00100002,
- 0x00000000, 0x04100002, 0x04100400, 0x00000400,
- 0x04000000, 0x04100402, 0x00100402, 0x00100000,
- 0x04100402, 0x00000002, 0x04000400, 0x00100402,
- 0x00100002, 0x00100400, 0x04100000, 0x04000402,
- 0x00000402, 0x04000000, 0x04000002, 0x04100400}, {
- /* nibble 4 */
- 0x02000000, 0x00004000, 0x00000100, 0x02004108,
- 0x02004008, 0x02000100, 0x00004108, 0x02004000,
- 0x00004000, 0x00000008, 0x02000008, 0x00004100,
- 0x02000108, 0x02004008, 0x02004100, 0x00000000,
- 0x00004100, 0x02000000, 0x00004008, 0x00000108,
- 0x02000100, 0x00004108, 0x00000000, 0x02000008,
- 0x00000008, 0x02000108, 0x02004108, 0x00004008,
- 0x02004000, 0x00000100, 0x00000108, 0x02004100,
- 0x02004100, 0x02000108, 0x00004008, 0x02004000,
- 0x00004000, 0x00000008, 0x02000008, 0x02000100,
- 0x02000000, 0x00004100, 0x02004108, 0x00000000,
- 0x00004108, 0x02000000, 0x00000100, 0x00004008,
- 0x02000108, 0x00000100, 0x00000000, 0x02004108,
- 0x02004008, 0x02004100, 0x00000108, 0x00004000,
- 0x00004100, 0x02004008, 0x02000100, 0x00000108,
- 0x00000008, 0x00004108, 0x02004000, 0x02000008}, {
- /* nibble 5 */
- 0x20000010, 0x00080010, 0x00000000, 0x20080800,
- 0x00080010, 0x00000800, 0x20000810, 0x00080000,
- 0x00000810, 0x20080810, 0x00080800, 0x20000000,
- 0x20000800, 0x20000010, 0x20080000, 0x00080810,
- 0x00080000, 0x20000810, 0x20080010, 0x00000000,
- 0x00000800, 0x00000010, 0x20080800, 0x20080010,
- 0x20080810, 0x20080000, 0x20000000, 0x00000810,
- 0x00000010, 0x00080800, 0x00080810, 0x20000800,
- 0x00000810, 0x20000000, 0x20000800, 0x00080810,
- 0x20080800, 0x00080010, 0x00000000, 0x20000800,
- 0x20000000, 0x00000800, 0x20080010, 0x00080000,
- 0x00080010, 0x20080810, 0x00080800, 0x00000010,
- 0x20080810, 0x00080800, 0x00080000, 0x20000810,
- 0x20000010, 0x20080000, 0x00080810, 0x00000000,
- 0x00000800, 0x20000010, 0x20000810, 0x20080800,
- 0x20080000, 0x00000810, 0x00000010, 0x20080010}, {
- /* nibble 6 */
- 0x00001000, 0x00000080, 0x00400080, 0x00400001,
- 0x00401081, 0x00001001, 0x00001080, 0x00000000,
- 0x00400000, 0x00400081, 0x00000081, 0x00401000,
- 0x00000001, 0x00401080, 0x00401000, 0x00000081,
- 0x00400081, 0x00001000, 0x00001001, 0x00401081,
- 0x00000000, 0x00400080, 0x00400001, 0x00001080,
- 0x00401001, 0x00001081, 0x00401080, 0x00000001,
- 0x00001081, 0x00401001, 0x00000080, 0x00400000,
- 0x00001081, 0x00401000, 0x00401001, 0x00000081,
- 0x00001000, 0x00000080, 0x00400000, 0x00401001,
- 0x00400081, 0x00001081, 0x00001080, 0x00000000,
- 0x00000080, 0x00400001, 0x00000001, 0x00400080,
- 0x00000000, 0x00400081, 0x00400080, 0x00001080,
- 0x00000081, 0x00001000, 0x00401081, 0x00400000,
- 0x00401080, 0x00000001, 0x00001001, 0x00401081,
- 0x00400001, 0x00401080, 0x00401000, 0x00001001}, {
- /* nibble 7 */
- 0x08200020, 0x08208000, 0x00008020, 0x00000000,
- 0x08008000, 0x00200020, 0x08200000, 0x08208020,
- 0x00000020, 0x08000000, 0x00208000, 0x00008020,
- 0x00208020, 0x08008020, 0x08000020, 0x08200000,
- 0x00008000, 0x00208020, 0x00200020, 0x08008000,
- 0x08208020, 0x08000020, 0x00000000, 0x00208000,
- 0x08000000, 0x00200000, 0x08008020, 0x08200020,
- 0x00200000, 0x00008000, 0x08208000, 0x00000020,
- 0x00200000, 0x00008000, 0x08000020, 0x08208020,
- 0x00008020, 0x08000000, 0x00000000, 0x00208000,
- 0x08200020, 0x08008020, 0x08008000, 0x00200020,
- 0x08208000, 0x00000020, 0x00200020, 0x08008000,
- 0x08208020, 0x00200000, 0x08200000, 0x08000020,
- 0x00208000, 0x00008020, 0x08008020, 0x08200000,
- 0x00000020, 0x08208000, 0x00208020, 0x00000000,
- 0x08000000, 0x08200020, 0x00008000, 0x00208020}
- };
-
- private static final byte cov_2byte[] = {
- 0x2E, 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35,
- 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44,
- 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C,
- 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54,
- 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x61, 0x62,
- 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A,
- 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72,
- 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A
- };
-
- private static final int byteToUnsigned(byte b) {
- int value = b;
-
- return (value >= 0 ? value : value + 256);
- }
-
- private static int fourBytesToInt(byte b[], int offset) {
- int value;
-
- value = byteToUnsigned(b[offset++]);
- value |= (byteToUnsigned(b[offset++]) << 8);
- value |= (byteToUnsigned(b[offset++]) << 16);
- value |= (byteToUnsigned(b[offset++]) << 24);
-
- return (value);
- }
-
- private static final void intToFourBytes(int iValue, byte b[], int offset) {
- b[offset++] = (byte) ((iValue) & 0xff);
- b[offset++] = (byte) ((iValue >>> 8) & 0xff);
- b[offset++] = (byte) ((iValue >>> 16) & 0xff);
- b[offset++] = (byte) ((iValue >>> 24) & 0xff);
- }
-
- private static final void PERM_OP(int a, int b, int n, int m, int results[]) {
- int t;
-
- t = ((a >>> n) ^ b) & m;
- a ^= t << n;
- b ^= t;
-
- results[0] = a;
- results[1] = b;
- }
-
- private static final int HPERM_OP(int a, int n, int m) {
- int t;
-
- t = ((a << (16 - n)) ^ a) & m;
- a = a ^ t ^ (t >>> (16 - n));
-
- return (a);
- }
-
- private static int[] des_set_key(byte key[]) {
- int schedule[] = new int[ITERATIONS * 2];
-
- int c = fourBytesToInt(key, 0);
- int d = fourBytesToInt(key, 4);
-
- int results[] = new int[2];
-
- PERM_OP(d, c, 4, 0x0f0f0f0f, results);
- d = results[0];
- c = results[1];
-
- c = HPERM_OP(c, -2, 0xcccc0000);
- d = HPERM_OP(d, -2, 0xcccc0000);
-
- PERM_OP(d, c, 1, 0x55555555, results);
- d = results[0];
- c = results[1];
-
- PERM_OP(c, d, 8, 0x00ff00ff, results);
- c = results[0];
- d = results[1];
-
- PERM_OP(d, c, 1, 0x55555555, results);
- d = results[0];
- c = results[1];
-
- d = ((d & 0x000000ff) << 16)
- | (d & 0x0000ff00)
- | ((d & 0x00ff0000) >>> 16)
- | ((c & 0xf0000000) >>> 4);
- c &= 0x0fffffff;
-
- int s;
- int t;
- int j = 0;
-
- for (int i = 0; i < ITERATIONS; i++) {
- if (shifts2[i]) {
- c = (c >>> 2) | (c << 26);
- d = (d >>> 2) | (d << 26);
- } else {
- c = (c >>> 1) | (c << 27);
- d = (d >>> 1) | (d << 27);
- }
-
- c &= 0x0fffffff;
- d &= 0x0fffffff;
-
- s = skb[0][(c) & 0x3f]
- | skb[1][((c >>> 6) & 0x03) | ((c >>> 7) & 0x3c)]
- | skb[2][((c >>> 13) & 0x0f) | ((c >>> 14) & 0x30)]
- | skb[3][((c >>> 20) & 0x01) | ((c >>> 21) & 0x06) | ((c >>> 22) & 0x38)];
-
- t = skb[4][(d) & 0x3f]
- | skb[5][((d >>> 7) & 0x03) | ((d >>> 8) & 0x3c)]
- | skb[6][(d >>> 15) & 0x3f]
- | skb[7][((d >>> 21) & 0x0f) | ((d >>> 22) & 0x30)];
-
- schedule[j++] = ((t << 16) | (s & 0x0000ffff)) & 0xffffffff;
- s = ((s >>> 16) | (t & 0xffff0000));
-
- s = (s << 4) | (s >>> 28);
- schedule[j++] = s & 0xffffffff;
- }
- return (schedule);
- }
-
- private static final int D_ENCRYPT(int L, int R, int S, int E0, int E1, int s[]) {
- int t;
- int u;
- int v;
-
- v = R ^ (R >>> 16);
- u = v & E0;
- v = v & E1;
- u = (u ^ (u << 16)) ^ R ^ s[S];
- t = (v ^ (v << 16)) ^ R ^ s[S + 1];
- t = (t >>> 4) | (t << 28);
-
- L ^= SPtrans[1][(t) & 0x3f]
- | SPtrans[3][(t >>> 8) & 0x3f]
- | SPtrans[5][(t >>> 16) & 0x3f]
- | SPtrans[7][(t >>> 24) & 0x3f]
- | SPtrans[0][(u) & 0x3f]
- | SPtrans[2][(u >>> 8) & 0x3f]
- | SPtrans[4][(u >>> 16) & 0x3f]
- | SPtrans[6][(u >>> 24) & 0x3f];
-
- return (L);
- }
-
- private static final int[] body(int schedule[], int Eswap0, int Eswap1) {
- int left = 0;
- int right = 0;
- int t = 0;
-
- for (int j = 0; j < 25; j++) {
- for (int i = 0; i < ITERATIONS * 2; i += 4) {
- left = D_ENCRYPT(left, right, i, Eswap0, Eswap1, schedule);
- right = D_ENCRYPT(right, left, i + 2, Eswap0, Eswap1, schedule);
- }
- t = left;
- left = right;
- right = t;
- }
-
- t = right;
-
- right = (left >>> 1) | (left << 31);
- left = (t >>> 1) | (t << 31);
-
- left &= 0xffffffff;
- right &= 0xffffffff;
-
- int results[] = new int[2];
-
- PERM_OP(right, left, 1, 0x55555555, results);
- right = results[0];
- left = results[1];
-
- PERM_OP(left, right, 8, 0x00ff00ff, results);
- left = results[0];
- right = results[1];
-
- PERM_OP(right, left, 2, 0x33333333, results);
- right = results[0];
- left = results[1];
-
- PERM_OP(left, right, 16, 0x0000ffff, results);
- left = results[0];
- right = results[1];
-
- PERM_OP(right, left, 4, 0x0f0f0f0f, results);
- right = results[0];
- left = results[1];
-
- int out[] = new int[2];
-
- out[0] = left;
- out[1] = right;
-
- return (out);
- }
-
- /**
- * <P>
- * Encrypt a password given the cleartext password and a "salt".
- * </P>
- *
- * @param salt A two-character string representing the salt used to iterate the encryption engine
- * in lots of different ways. If you are generating a new encryption then this value should
- * be randomised.
- * @param original The password to be encrypted.
- * @return A string consisting of the 2-character salt followed by the encrypted password.
- */
- public static final byte[] crypt(byte salt[], byte original[]) {
- byte result[] = new byte[13];
-
- byte byteZero = salt[0];
- byte byteOne = salt[1];
-
- result[0] = byteZero;
- result[1] = byteOne;
-
- int Eswap0 = con_salt[byteZero];
- int Eswap1 = con_salt[byteOne] << 4;
-
- byte key[] = new byte[8];
-
- for (int i = 0; i < key.length; i++) {
- key[i] = (byte) 0;
- }
-
- for (int i = 0; i < key.length && i < original.length; i++) {
- int iChar = original[i];
-
- key[i] = (byte) (iChar << 1);
- }
-
- int schedule[] = des_set_key(key);
- int out[] = body(schedule, Eswap0, Eswap1);
-
- byte b[] = new byte[9];
-
- intToFourBytes(out[0], b, 0);
- intToFourBytes(out[1], b, 4);
- b[8] = 0;
-
- for (int i = 2, y = 0, u = 0x80; i < 13; i++) {
- for (int j = 0, c = 0; j < 6; j++) {
- c <<= 1;
-
- if ((b[y] & u) != 0) {
- c |= 1;
- }
-
- u >>>= 1;
-
- if (u == 0) {
- y++;
- u = 0x80;
- }
- result[i] = cov_2byte[c];
- }
- }
- return result;
- }
-}
diff --git a/pgjdbc/src/main/java/org/postgresql/util/WriterHandler.java b/pgjdbc/src/main/java/org/postgresql/util/WriterHandler.java
new file mode 100644
index 0000000..822f953
--- /dev/null
+++ b/pgjdbc/src/main/java/org/postgresql/util/WriterHandler.java
@@ -0,0 +1,125 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+
+package org.postgresql.util;
+
+import java.io.Writer;
+
+import java.util.logging.ErrorManager;
+import java.util.logging.Formatter;
+import java.util.logging.Handler;
+import java.util.logging.Level;
+import java.util.logging.LogRecord;
+import java.util.logging.SimpleFormatter;
+
+public class WriterHandler extends Handler {
+
+ private boolean doneHeader;
+
+ private Writer writer;
+
+ public WriterHandler(Writer inWriter) {
+ super();
+ setLevel(Level.INFO);
+ setFilter(null);
+ setFormatter(new SimpleFormatter());
+ writer = inWriter;
+ }
+
+ public WriterHandler(Writer inWriter, Formatter formatter) {
+ super();
+ setLevel(Level.INFO);
+ setFilter(null);
+ setFormatter(formatter);
+ writer = inWriter;
+
+ }
+
+ public synchronized void publish(final LogRecord record) {
+ if (!isLoggable(record)) {
+ return;
+ }
+ String msg;
+ try {
+ msg = getFormatter().format(record);
+ } catch (Exception ex) {
+ // We don't want to throw an exception here, but we
+ // report the exception to any registered ErrorManager.
+ reportError(null, ex, ErrorManager.FORMAT_FAILURE);
+ return;
+ }
+
+ try {
+ if (!doneHeader) {
+ writer.write(getFormatter().getHead(this));
+ doneHeader = true;
+ }
+ writer.write(msg);
+ } catch (Exception ex) {
+ // We don't want to throw an exception here, but we
+ // report the exception to any registered ErrorManager.
+ reportError(null, ex, ErrorManager.WRITE_FAILURE);
+ }
+ }
+
+ public boolean isLoggable(final LogRecord record) {
+ if (writer == null || record == null) {
+ return false;
+ }
+ return super.isLoggable(record);
+ }
+
+ public synchronized void flush() {
+ if (writer != null) {
+ try {
+ writer.flush();
+ } catch (Exception ex) {
+ // We don't want to throw an exception here, but we
+ // report the exception to any registered ErrorManager.
+ reportError(null, ex, ErrorManager.FLUSH_FAILURE);
+ }
+ }
+ }
+
+ private synchronized void flushAndClose() throws SecurityException {
+
+ if (writer != null) {
+ try {
+ if (!doneHeader) {
+ writer.write(getFormatter().getHead(this));
+ doneHeader = true;
+ }
+ writer.write(getFormatter().getTail(this));
+ writer.flush();
+ writer.close();
+ } catch (Exception ex) {
+ // We don't want to throw an exception here, but we
+ // report the exception to any registered ErrorManager.
+ reportError(null, ex, ErrorManager.CLOSE_FAILURE);
+ }
+ writer = null;
+
+ }
+ }
+
+ public synchronized void close() throws SecurityException {
+ flushAndClose();
+ }
+}
diff --git a/pgjdbc/src/main/java/org/postgresql/xa/PGXAConnection.java b/pgjdbc/src/main/java/org/postgresql/xa/PGXAConnection.java
index 67dfeea..fdf123e 100644
--- a/pgjdbc/src/main/java/org/postgresql/xa/PGXAConnection.java
+++ b/pgjdbc/src/main/java/org/postgresql/xa/PGXAConnection.java
@@ -7,8 +7,6 @@ package org.postgresql.xa;
import org.postgresql.PGConnection;
import org.postgresql.core.BaseConnection;
-import org.postgresql.core.Logger;
-import org.postgresql.core.ServerVersion;
import org.postgresql.core.TransactionState;
import org.postgresql.ds.PGPooledConnection;
import org.postgresql.util.GT;
@@ -24,6 +22,8 @@ import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.LinkedList;
+import java.util.logging.Level;
+import java.util.logging.Logger;
import javax.sql.XAConnection;
import javax.transaction.xa.XAException;
@@ -41,36 +41,20 @@ import javax.transaction.xa.Xid;
* @author Heikki Linnakangas (heikki.linnakangas at iki.fi)
*/
public class PGXAConnection extends PGPooledConnection implements XAConnection, XAResource {
+
+ private static final Logger LOGGER = Logger.getLogger(PGXAConnection.class.getName());
+
/**
* Underlying physical database connection. It's used for issuing PREPARE TRANSACTION/ COMMIT
* PREPARED/ROLLBACK PREPARED commands.
*/
private final BaseConnection conn;
- private final Logger logger;
- /*
- * PGXAConnection-object can be in one of three states:
- *
- * IDLE Not associated with a XA-transaction. You can still call getConnection and use the
- * connection outside XA. currentXid is null. autoCommit is true on a connection by getConnection,
- * per normal JDBC rules, though the caller can change it to false and manage transactions itself
- * using Connection.commit and rollback.
- *
- * ACTIVE start has been called, and we're associated with an XA transaction. currentXid is valid.
- * autoCommit is false on a connection returned by getConnection, and should not be messed with by
- * the caller or the XA transaction will be broken.
- *
- * ENDED end has been called, but the transaction has not yet been prepared. currentXid is still
- * valid. You shouldn't use the connection for anything else than issuing a XAResource.commit or
- * rollback.
- */
private Xid currentXid;
- private int state;
-
- private static final int STATE_IDLE = 0;
- private static final int STATE_ACTIVE = 1;
- private static final int STATE_ENDED = 2;
+ private State state;
+ private Xid preparedXid;
+ private boolean committedOrRolledBack;
/*
* When an XA transaction is started, we put the underlying connection into non-autocommit mode.
@@ -80,33 +64,29 @@ public class PGXAConnection extends PGPooledConnection implements XAConnection,
private boolean localAutoCommitMode = true;
private void debug(String s) {
- logger.debug("XAResource " + Integer.toHexString(this.hashCode()) + ": " + s);
+ if (LOGGER.isLoggable(Level.FINEST)) {
+ LOGGER.log(Level.FINEST, "XAResource {0}: {1}", new Object[]{Integer.toHexString(this.hashCode()), s});
+ }
}
public PGXAConnection(BaseConnection conn) throws SQLException {
super(conn, true, true);
this.conn = conn;
- this.state = STATE_IDLE;
- this.logger = conn.getLogger();
+ this.state = State.IDLE;
}
-
- /****
+ /**
* XAConnection interface
- ****/
-
+ */
+ @Override
public Connection getConnection() throws SQLException {
- if (logger.logDebug()) {
- debug("PGXAConnection.getConnection called");
- }
-
Connection conn = super.getConnection();
// When we're outside an XA transaction, autocommit
// is supposed to be true, per usual JDBC convention.
// When an XA transaction is in progress, it should be
// false.
- if (state == STATE_IDLE) {
+ if (state == State.IDLE) {
conn.setAutoCommit(true);
}
@@ -119,6 +99,7 @@ public class PGXAConnection extends PGPooledConnection implements XAConnection,
new Class[]{Connection.class, PGConnection.class}, handler);
}
+ @Override
public XAResource getXAResource() {
return this;
}
@@ -128,14 +109,15 @@ public class PGXAConnection extends PGPooledConnection implements XAConnection,
* connection is used for an XA transaction.
*/
private class ConnectionHandler implements InvocationHandler {
- private Connection con;
+ private final Connection con;
- public ConnectionHandler(Connection con) {
+ ConnectionHandler(Connection con) {
this.con = con;
}
+ @Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
- if (state != STATE_IDLE) {
+ if (state != State.IDLE) {
String methodName = method.getName();
if (methodName.equals("commit")
|| methodName.equals("rollback")
@@ -183,22 +165,23 @@ public class PGXAConnection extends PGPooledConnection implements XAConnection,
*
* Postconditions: 1. Connection is associated with the transaction
*/
+ @Override
public void start(Xid xid, int flags) throws XAException {
- if (logger.logDebug()) {
+ if (LOGGER.isLoggable(Level.FINEST)) {
debug("starting transaction xid = " + xid);
}
// Check preconditions
if (flags != XAResource.TMNOFLAGS && flags != XAResource.TMRESUME
&& flags != XAResource.TMJOIN) {
- throw new PGXAException(GT.tr("Invalid flags"), XAException.XAER_INVAL);
+ throw new PGXAException(GT.tr("Invalid flags {0}", flags), XAException.XAER_INVAL);
}
if (xid == null) {
throw new PGXAException(GT.tr("xid must not be null"), XAException.XAER_INVAL);
}
- if (state == STATE_ACTIVE) {
+ if (state == State.ACTIVE) {
throw new PGXAException(GT.tr("Connection is busy with another transaction"),
XAException.XAER_PROTO);
}
@@ -213,17 +196,21 @@ public class PGXAConnection extends PGPooledConnection implements XAConnection,
// It's ok to join an ended transaction. WebLogic does that.
if (flags == TMJOIN) {
- if (state != STATE_ENDED) {
- throw new PGXAException(GT.tr("Transaction interleaving not implemented"),
- XAException.XAER_RMERR);
+ if (state != State.ENDED) {
+ throw new PGXAException(
+ GT.tr(
+ "Invalid protocol state requested. Attempted transaction interleaving is not supported. xid={0}, currentXid={1}, state={2}, flags={3}",
+ xid, currentXid, state, flags), XAException.XAER_RMERR);
}
if (!xid.equals(currentXid)) {
- throw new PGXAException(GT.tr("Transaction interleaving not implemented"),
- XAException.XAER_RMERR);
+ throw new PGXAException(
+ GT.tr(
+ "Invalid protocol state requested. Attempted transaction interleaving is not supported. xid={0}, currentXid={1}, state={2}, flags={3}",
+ xid, currentXid, state, flags), XAException.XAER_RMERR);
}
- } else if (state == STATE_ENDED) {
- throw new PGXAException(GT.tr("Transaction interleaving not implemented"),
+ } else if (state == State.ENDED) {
+ throw new PGXAException(GT.tr("Invalid protocol state requested. Attempted transaction interleaving is not supported. xid={0}, currentXid={1}, state={2}, flags={3}", xid, currentXid, state, flags),
XAException.XAER_RMERR);
}
@@ -239,8 +226,10 @@ public class PGXAConnection extends PGPooledConnection implements XAConnection,
}
// Preconditions are met, Associate connection with the transaction
- state = STATE_ACTIVE;
+ state = State.ACTIVE;
currentXid = xid;
+ preparedXid = null;
+ committedOrRolledBack = false;
}
/**
@@ -251,8 +240,9 @@ public class PGXAConnection extends PGPooledConnection implements XAConnection,
*
* Postconditions: 1. connection is disassociated from the transaction.
*/
+ @Override
public void end(Xid xid, int flags) throws XAException {
- if (logger.logDebug()) {
+ if (LOGGER.isLoggable(Level.FINEST)) {
debug("ending transaction xid = " + xid);
}
@@ -260,15 +250,15 @@ public class PGXAConnection extends PGPooledConnection implements XAConnection,
if (flags != XAResource.TMSUSPEND && flags != XAResource.TMFAIL
&& flags != XAResource.TMSUCCESS) {
- throw new PGXAException(GT.tr("Invalid flags"), XAException.XAER_INVAL);
+ throw new PGXAException(GT.tr("Invalid flags {0}", flags), XAException.XAER_INVAL);
}
if (xid == null) {
throw new PGXAException(GT.tr("xid must not be null"), XAException.XAER_INVAL);
}
- if (state != STATE_ACTIVE || !currentXid.equals(xid)) {
- throw new PGXAException(GT.tr("tried to call end without corresponding start call"),
+ if (state != State.ACTIVE || !currentXid.equals(xid)) {
+ throw new PGXAException(GT.tr("tried to call end without corresponding start call. state={0}, start xid={1}, currentXid={2}, preparedXid={3}", state, xid, currentXid, preparedXid),
XAException.XAER_PROTO);
}
@@ -281,7 +271,7 @@ public class PGXAConnection extends PGPooledConnection implements XAConnection,
// if TMFAIL was given.
// All clear. We don't have any real work to do.
- state = STATE_ENDED;
+ state = State.ENDED;
}
/**
@@ -291,31 +281,40 @@ public class PGXAConnection extends PGPooledConnection implements XAConnection,
*
* Postconditions: 1. Transaction is prepared
*/
+ @Override
public int prepare(Xid xid) throws XAException {
- if (logger.logDebug()) {
+ if (LOGGER.isLoggable(Level.FINEST)) {
debug("preparing transaction xid = " + xid);
}
// Check preconditions
+ if (currentXid == null && preparedXid != null) {
+ if (LOGGER.isLoggable(Level.FINEST)) {
+ debug("Prepare xid " + xid + " but current connection is not attached to a transaction"
+ + " while it was prepared in past with prepared xid " + preparedXid);
+ }
+ throw new PGXAException(GT.tr(
+ "Preparing already prepared transaction, the prepared xid {0}, prepare xid={1}", preparedXid, xid), XAException.XAER_PROTO);
+ } else if (currentXid == null) {
+ throw new PGXAException(GT.tr(
+ "Current connection does not have an associated xid. prepare xid={0}", xid), XAException.XAER_NOTA);
+ }
if (!currentXid.equals(xid)) {
- throw new PGXAException(
- GT.tr(
- "Not implemented: Prepare must be issued using the same connection that started the transaction"),
+ if (LOGGER.isLoggable(Level.FINEST)) {
+ debug("Error to prepare xid " + xid + ", the current connection already bound with xid " + currentXid);
+ }
+ throw new PGXAException(GT.tr(
+ "Not implemented: Prepare must be issued using the same connection that started the transaction. currentXid={0}, prepare xid={1}", currentXid, xid),
XAException.XAER_RMERR);
}
- if (state != STATE_ENDED) {
- throw new PGXAException(GT.tr("Prepare called before end"), XAException.XAER_INVAL);
+ if (state != State.ENDED) {
+ throw new PGXAException(GT.tr("Prepare called before end. prepare xid={0}, state={1}", xid), XAException.XAER_INVAL);
}
- state = STATE_IDLE;
+ state = State.IDLE;
+ preparedXid = currentXid;
currentXid = null;
- if (!conn.haveMinimumServerVersion(ServerVersion.v8_1)) {
- throw new PGXAException(
- GT.tr("Server versions prior to 8.1 do not support two-phase commit."),
- XAException.XAER_RMERR);
- }
-
try {
String s = RecoveredXid.xidToString(xid);
@@ -329,7 +328,7 @@ public class PGXAConnection extends PGPooledConnection implements XAConnection,
return XA_OK;
} catch (SQLException ex) {
- throw new PGXAException(GT.tr("Error preparing transaction"), ex, XAException.XAER_RMERR);
+ throw new PGXAException(GT.tr("Error preparing transaction. prepare xid={0}", xid), ex, XAException.XAER_RMERR);
}
}
@@ -340,11 +339,12 @@ public class PGXAConnection extends PGPooledConnection implements XAConnection,
*
* Postconditions: 1. list of prepared xids is returned
*/
+ @Override
public Xid[] recover(int flag) throws XAException {
// Check preconditions
if (flag != TMSTARTRSCAN && flag != TMENDRSCAN && flag != TMNOFLAGS
&& flag != (TMSTARTRSCAN | TMENDRSCAN)) {
- throw new PGXAException(GT.tr("Invalid flag"), XAException.XAER_INVAL);
+ throw new PGXAException(GT.tr("Invalid flags {0}", flag), XAException.XAER_INVAL);
}
// We don't check for precondition 2, because we would have to add some additional state in
@@ -392,16 +392,17 @@ public class PGXAConnection extends PGPooledConnection implements XAConnection,
*
* Postconditions: 1. Transaction is rolled back and disassociated from connection
*/
+ @Override
public void rollback(Xid xid) throws XAException {
- if (logger.logDebug()) {
+ if (LOGGER.isLoggable(Level.FINEST)) {
debug("rolling back xid = " + xid);
}
// We don't explicitly check precondition 1.
try {
- if (currentXid != null && xid.equals(currentXid)) {
- state = STATE_IDLE;
+ if (currentXid != null && currentXid.equals(xid)) {
+ state = State.IDLE;
currentXid = null;
conn.rollback();
conn.setAutoCommit(localAutoCommitMode);
@@ -416,18 +417,31 @@ public class PGXAConnection extends PGPooledConnection implements XAConnection,
stmt.close();
}
}
+ committedOrRolledBack = true;
} catch (SQLException ex) {
+ int errorCode = XAException.XAER_RMERR;
if (PSQLState.UNDEFINED_OBJECT.getState().equals(ex.getSQLState())) {
- throw new PGXAException(GT.tr("Error rolling back prepared transaction"), ex,
- XAException.XAER_NOTA);
+ if (committedOrRolledBack || !xid.equals(preparedXid)) {
+ if (LOGGER.isLoggable(Level.FINEST)) {
+ debug("rolling back xid " + xid + " while the connection prepared xid is " + preparedXid
+ + (committedOrRolledBack ? ", but the connection was already committed/rolled-back" : ""));
+ }
+ errorCode = XAException.XAER_NOTA;
+ }
}
- throw new PGXAException(GT.tr("Error rolling back prepared transaction"), ex,
- XAException.XAER_RMERR);
+ if (PSQLState.isConnectionError(ex.getSQLState())) {
+ if (LOGGER.isLoggable(Level.FINEST)) {
+ debug("rollback connection failure (sql error code " + ex.getSQLState() + "), reconnection could be expected");
+ }
+ errorCode = XAException.XAER_RMFAIL;
+ }
+ throw new PGXAException(GT.tr("Error rolling back prepared transaction. rollback xid={0}, preparedXid={1}, currentXid={2}", xid, preparedXid), ex, errorCode);
}
}
+ @Override
public void commit(Xid xid, boolean onePhase) throws XAException {
- if (logger.logDebug()) {
+ if (LOGGER.isLoggable(Level.FINEST)) {
debug("committing xid = " + xid + (onePhase ? " (one phase) " : " (two phase)"));
}
@@ -453,27 +467,35 @@ public class PGXAConnection extends PGPooledConnection implements XAConnection,
private void commitOnePhase(Xid xid) throws XAException {
try {
// Check preconditions
- if (currentXid == null || !currentXid.equals(xid)) {
- // In fact, we don't know if xid is bogus, or if it just wasn't associated with this
- // connection.
+ if (xid.equals(preparedXid)) { // TODO: check if the condition should be negated
+ throw new PGXAException(GT.tr("One-phase commit called for xid {0} but connection was prepared with xid {1}",
+ xid, preparedXid), XAException.XAER_PROTO);
+ }
+ if (currentXid == null && !committedOrRolledBack) {
+ // In fact, we don't know if xid is bogus, or if it just wasn't associated with this connection.
// Assume it's our fault.
- throw new PGXAException(
- GT.tr(
- "Not implemented: one-phase commit must be issued using the same connection that was used to start it"),
+ // TODO: pick proper error message. Current one does not clarify what went wrong
+ throw new PGXAException(GT.tr(
+ "Not implemented: one-phase commit must be issued using the same connection that was used to start it", xid),
XAException.XAER_RMERR);
}
- if (state != STATE_ENDED) {
- throw new PGXAException(GT.tr("commit called before end"), XAException.XAER_PROTO);
+ if (!xid.equals(currentXid) || committedOrRolledBack) {
+ throw new PGXAException(GT.tr("One-phase commit with unknown xid. commit xid={0}, currentXid={1}",
+ xid, currentXid), XAException.XAER_NOTA);
+ }
+ if (state != State.ENDED) {
+ throw new PGXAException(GT.tr("commit called before end. commit xid={0}, state={1}", xid, state), XAException.XAER_PROTO);
}
// Preconditions are met. Commit
- state = STATE_IDLE;
+ state = State.IDLE;
currentXid = null;
+ committedOrRolledBack = true;
conn.commit();
conn.setAutoCommit(localAutoCommitMode);
} catch (SQLException ex) {
- throw new PGXAException(GT.tr("Error during one-phase commit"), ex, XAException.XAER_RMERR);
+ throw new PGXAException(GT.tr("Error during one-phase commit. commit xid={0}", xid), ex, XAException.XAER_RMFAIL);
}
}
@@ -489,10 +511,10 @@ public class PGXAConnection extends PGPooledConnection implements XAConnection,
// Check preconditions. The connection mustn't be used for another
// other XA or local transaction, or the COMMIT PREPARED command
// would mess it up.
- if (state != STATE_IDLE
+ if (state != State.IDLE
|| conn.getTransactionState() != TransactionState.IDLE) {
throw new PGXAException(
- GT.tr("Not implemented: 2nd phase commit must be issued using an idle connection"),
+ GT.tr("Not implemented: 2nd phase commit must be issued using an idle connection. commit xid={0}, currentXid={1}, state={2], transactionState={3}", xid, currentXid, state, conn.getTransactionState()),
XAException.XAER_RMERR);
}
@@ -507,12 +529,29 @@ public class PGXAConnection extends PGPooledConnection implements XAConnection,
stmt.close();
conn.setAutoCommit(localAutoCommitMode);
}
+ committedOrRolledBack = true;
} catch (SQLException ex) {
- throw new PGXAException(GT.tr("Error committing prepared transaction"), ex,
- XAException.XAER_RMERR);
+ int errorCode = XAException.XAER_RMERR;
+ if (PSQLState.UNDEFINED_OBJECT.getState().equals(ex.getSQLState())) {
+ if (committedOrRolledBack || !xid.equals(preparedXid)) {
+ if (LOGGER.isLoggable(Level.FINEST)) {
+ debug("committing xid " + xid + " while the connection prepared xid is " + preparedXid
+ + (committedOrRolledBack ? ", but the connection was already committed/rolled-back" : ""));
+ }
+ errorCode = XAException.XAER_NOTA;
+ }
+ }
+ if (PSQLState.isConnectionError(ex.getSQLState())) {
+ if (LOGGER.isLoggable(Level.FINEST)) {
+ debug("commit connection failure (sql error code " + ex.getSQLState() + "), reconnection could be expected");
+ }
+ errorCode = XAException.XAER_RMFAIL;
+ }
+ throw new PGXAException(GT.tr("Error committing prepared transaction. commit xid={0}, preparedXid={1}, currentXid={2}", xid, preparedXid, currentXid), ex, errorCode);
}
}
+ @Override
public boolean isSameRM(XAResource xares) throws XAException {
// This trivial implementation makes sure that the
// application server doesn't try to use another connection
@@ -523,14 +562,16 @@ public class PGXAConnection extends PGPooledConnection implements XAConnection,
/**
* Does nothing, since we don't do heuristics,
*/
+ @Override
public void forget(Xid xid) throws XAException {
- throw new PGXAException(GT.tr("Heuristic commit/rollback not supported"),
+ throw new PGXAException(GT.tr("Heuristic commit/rollback not supported. forget xid={0}", xid),
XAException.XAER_NOTA);
}
/**
* We don't do transaction timeouts. Just returns 0.
*/
+ @Override
public int getTransactionTimeout() {
return 0;
}
@@ -538,7 +579,31 @@ public class PGXAConnection extends PGPooledConnection implements XAConnection,
/**
* We don't do transaction timeouts. Returns false.
*/
+ @Override
public boolean setTransactionTimeout(int seconds) {
return false;
}
+
+ private enum State {
+ /**
+ * {@code PGXAConnection} not associated with a XA-transaction. You can still call {@link #getConnection()} and
+ * use the connection outside XA. {@code currentXid} is {@code null}. autoCommit is {@code true} on a connection
+ * by getConnection, per normal JDBC rules, though the caller can change it to {@code false} and manage
+ * transactions itself using Connection.commit and rollback.
+ */
+ IDLE,
+ /**
+ * {@link #start(Xid, int)} has been called, and we're associated with an XA transaction. {@code currentXid}
+ * is valid. autoCommit is false on a connection returned by getConnection, and should not be messed with by
+ * the caller or the XA transaction will be broken.
+ */
+ ACTIVE,
+ /**
+ * {@link #end(Xid, int)} has been called, but the transaction has not yet been prepared. {@code currentXid}
+ * is still valid. You shouldn't use the connection for anything else than issuing a {@link XAResource#commit(Xid, boolean)} or
+ * rollback.
+ */
+ ENDED
+ }
+
}
diff --git a/pgjdbc/src/main/java/org/postgresql/xa/PGXADataSource.java b/pgjdbc/src/main/java/org/postgresql/xa/PGXADataSource.java
index fcbfbfd..30059cb 100644
--- a/pgjdbc/src/main/java/org/postgresql/xa/PGXADataSource.java
+++ b/pgjdbc/src/main/java/org/postgresql/xa/PGXADataSource.java
@@ -10,10 +10,8 @@ import org.postgresql.ds.common.BaseDataSource;
import java.sql.Connection;
import java.sql.SQLException;
-import java.sql.SQLFeatureNotSupportedException;
import javax.naming.Reference;
-import javax.naming.Referenceable;
import javax.sql.XAConnection;
import javax.sql.XADataSource;
@@ -22,7 +20,7 @@ import javax.sql.XADataSource;
*
* @author Heikki Linnakangas (heikki.linnakangas at iki.fi)
*/
-public class PGXADataSource extends BaseDataSource implements XADataSource, Referenceable {
+public class PGXADataSource extends BaseDataSource implements XADataSource {
/**
* Gets a connection to the PostgreSQL database. The database is identified by the DataSource
* properties serverName, databaseName, and portNumber. The user to connect as is identified by
@@ -50,7 +48,7 @@ public class PGXADataSource extends BaseDataSource implements XADataSource, Refe
}
public String getDescription() {
- return "JDBC3 XA-enabled DataSource from " + org.postgresql.Driver.getVersion();
+ return "XA-enabled DataSource from " + org.postgresql.util.DriverInfo.DRIVER_FULL_NAME;
}
/**
@@ -60,7 +58,4 @@ public class PGXADataSource extends BaseDataSource implements XADataSource, Refe
return new Reference(getClass().getName(), PGXADataSourceFactory.class.getName(), null);
}
- public java.util.logging.Logger getParentLogger() throws SQLFeatureNotSupportedException {
- throw org.postgresql.Driver.notImplemented(this.getClass(), "getParentLogger()");
- }
}
diff --git a/pgjdbc/src/main/resources/org/postgresql/translation/messages_bg.class b/pgjdbc/src/main/resources/org/postgresql/translation/messages_bg.class
index 716ec83..fe5fcc8 100644
Binary files a/pgjdbc/src/main/resources/org/postgresql/translation/messages_bg.class and b/pgjdbc/src/main/resources/org/postgresql/translation/messages_bg.class differ
diff --git a/pgjdbc/src/main/resources/org/postgresql/translation/messages_cs.class b/pgjdbc/src/main/resources/org/postgresql/translation/messages_cs.class
index c27c2bb..4d47f29 100644
Binary files a/pgjdbc/src/main/resources/org/postgresql/translation/messages_cs.class and b/pgjdbc/src/main/resources/org/postgresql/translation/messages_cs.class differ
diff --git a/pgjdbc/src/main/resources/org/postgresql/translation/messages_de.class b/pgjdbc/src/main/resources/org/postgresql/translation/messages_de.class
index 5e792e4..24b7f79 100644
Binary files a/pgjdbc/src/main/resources/org/postgresql/translation/messages_de.class and b/pgjdbc/src/main/resources/org/postgresql/translation/messages_de.class differ
diff --git a/pgjdbc/src/main/resources/org/postgresql/translation/messages_es.class b/pgjdbc/src/main/resources/org/postgresql/translation/messages_es.class
index 0892303..eb2ce41 100644
Binary files a/pgjdbc/src/main/resources/org/postgresql/translation/messages_es.class and b/pgjdbc/src/main/resources/org/postgresql/translation/messages_es.class differ
diff --git a/pgjdbc/src/main/resources/org/postgresql/translation/messages_fr.class b/pgjdbc/src/main/resources/org/postgresql/translation/messages_fr.class
index 5f0a261..11dff7f 100644
Binary files a/pgjdbc/src/main/resources/org/postgresql/translation/messages_fr.class and b/pgjdbc/src/main/resources/org/postgresql/translation/messages_fr.class differ
diff --git a/pgjdbc/src/main/resources/org/postgresql/translation/messages_it.class b/pgjdbc/src/main/resources/org/postgresql/translation/messages_it.class
index 35f6a04..9137832 100644
Binary files a/pgjdbc/src/main/resources/org/postgresql/translation/messages_it.class and b/pgjdbc/src/main/resources/org/postgresql/translation/messages_it.class differ
diff --git a/pgjdbc/src/main/resources/org/postgresql/translation/messages_ja.class b/pgjdbc/src/main/resources/org/postgresql/translation/messages_ja.class
index d213ca7..e4dd390 100644
Binary files a/pgjdbc/src/main/resources/org/postgresql/translation/messages_ja.class and b/pgjdbc/src/main/resources/org/postgresql/translation/messages_ja.class differ
diff --git a/pgjdbc/src/main/resources/org/postgresql/translation/messages_nl.class b/pgjdbc/src/main/resources/org/postgresql/translation/messages_nl.class
index c90780b..e2bd987 100644
Binary files a/pgjdbc/src/main/resources/org/postgresql/translation/messages_nl.class and b/pgjdbc/src/main/resources/org/postgresql/translation/messages_nl.class differ
diff --git a/pgjdbc/src/main/resources/org/postgresql/translation/messages_pl.class b/pgjdbc/src/main/resources/org/postgresql/translation/messages_pl.class
index 1e0f963..45081b8 100644
Binary files a/pgjdbc/src/main/resources/org/postgresql/translation/messages_pl.class and b/pgjdbc/src/main/resources/org/postgresql/translation/messages_pl.class differ
diff --git a/pgjdbc/src/main/resources/org/postgresql/translation/messages_pt_BR.class b/pgjdbc/src/main/resources/org/postgresql/translation/messages_pt_BR.class
index 5a0a2a8..a33c70a 100644
Binary files a/pgjdbc/src/main/resources/org/postgresql/translation/messages_pt_BR.class and b/pgjdbc/src/main/resources/org/postgresql/translation/messages_pt_BR.class differ
diff --git a/pgjdbc/src/main/resources/org/postgresql/translation/messages_ru.class b/pgjdbc/src/main/resources/org/postgresql/translation/messages_ru.class
index 257d6b3..ae22f4f 100644
Binary files a/pgjdbc/src/main/resources/org/postgresql/translation/messages_ru.class and b/pgjdbc/src/main/resources/org/postgresql/translation/messages_ru.class differ
diff --git a/pgjdbc/src/main/resources/org/postgresql/translation/messages_sr.class b/pgjdbc/src/main/resources/org/postgresql/translation/messages_sr.class
index 3cc1267..664de83 100644
Binary files a/pgjdbc/src/main/resources/org/postgresql/translation/messages_sr.class and b/pgjdbc/src/main/resources/org/postgresql/translation/messages_sr.class differ
diff --git a/pgjdbc/src/main/resources/org/postgresql/translation/messages_tr.class b/pgjdbc/src/main/resources/org/postgresql/translation/messages_tr.class
index c48dbc3..484f59b 100644
Binary files a/pgjdbc/src/main/resources/org/postgresql/translation/messages_tr.class and b/pgjdbc/src/main/resources/org/postgresql/translation/messages_tr.class differ
diff --git a/pgjdbc/src/main/resources/org/postgresql/translation/messages_zh_CN.class b/pgjdbc/src/main/resources/org/postgresql/translation/messages_zh_CN.class
index b6c5c36..d7d8e53 100644
Binary files a/pgjdbc/src/main/resources/org/postgresql/translation/messages_zh_CN.class and b/pgjdbc/src/main/resources/org/postgresql/translation/messages_zh_CN.class differ
diff --git a/pgjdbc/src/main/resources/org/postgresql/translation/messages_zh_TW.class b/pgjdbc/src/main/resources/org/postgresql/translation/messages_zh_TW.class
index 8f13333..8d49899 100644
Binary files a/pgjdbc/src/main/resources/org/postgresql/translation/messages_zh_TW.class and b/pgjdbc/src/main/resources/org/postgresql/translation/messages_zh_TW.class differ
diff --git a/pgjdbc/src/test/java/org/postgresql/core/OidToStringTest.java b/pgjdbc/src/test/java/org/postgresql/core/OidToStringTest.java
new file mode 100644
index 0000000..5f4586f
--- /dev/null
+++ b/pgjdbc/src/test/java/org/postgresql/core/OidToStringTest.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2018, PostgreSQL Global Development Group
+ * See the LICENSE file in the project root for more information.
+ */
+
+package org.postgresql.core;
+
+import org.postgresql.util.PSQLException;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+import java.util.Arrays;
+
+ at RunWith(Parameterized.class)
+public class OidToStringTest {
+ @Parameterized.Parameter(0)
+ public int value;
+ @Parameterized.Parameter(1)
+ public String expected;
+
+ @Parameterized.Parameters(name = "expected={1}, value={0}")
+ public static Iterable<Object[]> data() {
+ return Arrays.asList(new Object[][]{
+ {142, "XML"},
+ {0, "UNSPECIFIED"},
+ {-235, "<unknown:-235>"},
+ });
+ }
+
+ @Test
+ public void run() throws PSQLException {
+ Assert.assertEquals(expected, Oid.toString(value));
+ }
+}
diff --git a/pgjdbc/src/test/java/org/postgresql/core/OidValueOfTest.java b/pgjdbc/src/test/java/org/postgresql/core/OidValueOfTest.java
new file mode 100644
index 0000000..110af68
--- /dev/null
+++ b/pgjdbc/src/test/java/org/postgresql/core/OidValueOfTest.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2018, PostgreSQL Global Development Group
+ * See the LICENSE file in the project root for more information.
+ */
+
+package org.postgresql.core;
+
+import org.postgresql.util.PSQLException;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+import java.util.Arrays;
+
+ at RunWith(Parameterized.class)
+public class OidValueOfTest {
+ @Parameterized.Parameter(0)
+ public int expected;
+ @Parameterized.Parameter(1)
+ public String value;
+
+ @Parameterized.Parameters(name = "expected={0}, value={1}")
+ public static Iterable<Object[]> data() {
+ return Arrays.asList(new Object[][]{
+ {25, "TEXT"},
+ {0, "UNSPECIFIED"},
+ {199, "JSON_ARRAY"},
+ {100, "100"},
+ });
+ }
+
+ @Test
+ public void run() throws PSQLException {
+ Assert.assertEquals(expected, Oid.valueOf(value));
+ }
+}
diff --git a/pgjdbc/src/test/java/org/postgresql/core/ParserTest.java b/pgjdbc/src/test/java/org/postgresql/core/ParserTest.java
index a09b4fa..1d6da29 100644
--- a/pgjdbc/src/test/java/org/postgresql/core/ParserTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/core/ParserTest.java
@@ -5,124 +5,206 @@
package org.postgresql.core;
-import junit.framework.TestCase;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
import org.junit.Assert;
+import org.junit.Ignore;
+import org.junit.Test;
+
+import java.sql.SQLException;
+import java.util.List;
/**
* Test cases for the Parser.
* @author Jeremy Whiting jwhiting at redhat.com
*/
-public class ParserTest extends TestCase {
+public class ParserTest {
/**
* Test to make sure delete command is detected by parser and detected via
* api. Mix up the case of the command to check detection continues to work.
*/
+ @Test
public void testDeleteCommandParsing() {
char[] command = new char[6];
"DELETE".getChars(0, 6, command, 0);
- Assert.assertTrue("Failed to correctly parse upper case command.", Parser.parseDeleteKeyword(command, 0));
+ assertTrue("Failed to correctly parse upper case command.", Parser.parseDeleteKeyword(command, 0));
"DelEtE".getChars(0, 6, command, 0);
- Assert.assertTrue("Failed to correctly parse mixed case command.", Parser.parseDeleteKeyword(command, 0));
+ assertTrue("Failed to correctly parse mixed case command.", Parser.parseDeleteKeyword(command, 0));
"deleteE".getChars(0, 6, command, 0);
- Assert.assertTrue("Failed to correctly parse mixed case command.", Parser.parseDeleteKeyword(command, 0));
+ assertTrue("Failed to correctly parse mixed case command.", Parser.parseDeleteKeyword(command, 0));
"delete".getChars(0, 6, command, 0);
- Assert.assertTrue("Failed to correctly parse lower case command.", Parser.parseDeleteKeyword(command, 0));
+ assertTrue("Failed to correctly parse lower case command.", Parser.parseDeleteKeyword(command, 0));
"Delete".getChars(0, 6, command, 0);
- Assert.assertTrue("Failed to correctly parse mixed case command.", Parser.parseDeleteKeyword(command, 0));
+ assertTrue("Failed to correctly parse mixed case command.", Parser.parseDeleteKeyword(command, 0));
}
/**
* Test UPDATE command parsing.
*/
+ @Test
public void testUpdateCommandParsing() {
char[] command = new char[6];
"UPDATE".getChars(0, 6, command, 0);
- Assert.assertTrue("Failed to correctly parse upper case command.", Parser.parseUpdateKeyword(command, 0));
+ assertTrue("Failed to correctly parse upper case command.", Parser.parseUpdateKeyword(command, 0));
"UpDateE".getChars(0, 6, command, 0);
- Assert.assertTrue("Failed to correctly parse mixed case command.", Parser.parseUpdateKeyword(command, 0));
+ assertTrue("Failed to correctly parse mixed case command.", Parser.parseUpdateKeyword(command, 0));
"updatE".getChars(0, 6, command, 0);
- Assert.assertTrue("Failed to correctly parse mixed case command.", Parser.parseUpdateKeyword(command, 0));
+ assertTrue("Failed to correctly parse mixed case command.", Parser.parseUpdateKeyword(command, 0));
"Update".getChars(0, 6, command, 0);
- Assert.assertTrue("Failed to correctly parse mixed case command.", Parser.parseUpdateKeyword(command, 0));
+ assertTrue("Failed to correctly parse mixed case command.", Parser.parseUpdateKeyword(command, 0));
"update".getChars(0, 6, command, 0);
- Assert.assertTrue("Failed to correctly parse lower case command.", Parser.parseUpdateKeyword(command, 0));
+ assertTrue("Failed to correctly parse lower case command.", Parser.parseUpdateKeyword(command, 0));
}
/**
* Test MOVE command parsing.
*/
+ @Test
public void testMoveCommandParsing() {
char[] command = new char[4];
"MOVE".getChars(0, 4, command, 0);
- Assert.assertTrue("Failed to correctly parse upper case command.", Parser.parseMoveKeyword(command, 0));
+ assertTrue("Failed to correctly parse upper case command.", Parser.parseMoveKeyword(command, 0));
"mOVe".getChars(0, 4, command, 0);
- Assert.assertTrue("Failed to correctly parse mixed case command.", Parser.parseMoveKeyword(command, 0));
+ assertTrue("Failed to correctly parse mixed case command.", Parser.parseMoveKeyword(command, 0));
"movE".getChars(0, 4, command, 0);
- Assert.assertTrue("Failed to correctly parse mixed case command.", Parser.parseMoveKeyword(command, 0));
+ assertTrue("Failed to correctly parse mixed case command.", Parser.parseMoveKeyword(command, 0));
"Move".getChars(0, 4, command, 0);
- Assert.assertTrue("Failed to correctly parse mixed case command.", Parser.parseMoveKeyword(command, 0));
+ assertTrue("Failed to correctly parse mixed case command.", Parser.parseMoveKeyword(command, 0));
"move".getChars(0, 4, command, 0);
- Assert.assertTrue("Failed to correctly parse lower case command.", Parser.parseMoveKeyword(command, 0));
+ assertTrue("Failed to correctly parse lower case command.", Parser.parseMoveKeyword(command, 0));
}
/**
* Test WITH command parsing.
*/
+ @Test
public void testWithCommandParsing() {
char[] command = new char[4];
"WITH".getChars(0, 4, command, 0);
- Assert.assertTrue("Failed to correctly parse upper case command.", Parser.parseWithKeyword(command, 0));
+ assertTrue("Failed to correctly parse upper case command.", Parser.parseWithKeyword(command, 0));
"wITh".getChars(0, 4, command, 0);
- Assert.assertTrue("Failed to correctly parse mixed case command.", Parser.parseWithKeyword(command, 0));
+ assertTrue("Failed to correctly parse mixed case command.", Parser.parseWithKeyword(command, 0));
"witH".getChars(0, 4, command, 0);
- Assert.assertTrue("Failed to correctly parse mixed case command.", Parser.parseWithKeyword(command, 0));
+ assertTrue("Failed to correctly parse mixed case command.", Parser.parseWithKeyword(command, 0));
"With".getChars(0, 4, command, 0);
- Assert.assertTrue("Failed to correctly parse mixed case command.", Parser.parseWithKeyword(command, 0));
+ assertTrue("Failed to correctly parse mixed case command.", Parser.parseWithKeyword(command, 0));
"with".getChars(0, 4, command, 0);
- Assert.assertTrue("Failed to correctly parse lower case command.", Parser.parseWithKeyword(command, 0));
+ assertTrue("Failed to correctly parse lower case command.", Parser.parseWithKeyword(command, 0));
}
/**
* Test SELECT command parsing.
*/
+ @Test
public void testSelectCommandParsing() {
char[] command = new char[6];
"SELECT".getChars(0, 6, command, 0);
- Assert.assertTrue("Failed to correctly parse upper case command.", Parser.parseSelectKeyword(command, 0));
+ assertTrue("Failed to correctly parse upper case command.", Parser.parseSelectKeyword(command, 0));
"sELect".getChars(0, 6, command, 0);
- Assert.assertTrue("Failed to correctly parse mixed case command.", Parser.parseSelectKeyword(command, 0));
+ assertTrue("Failed to correctly parse mixed case command.", Parser.parseSelectKeyword(command, 0));
"selecT".getChars(0, 6, command, 0);
- Assert.assertTrue("Failed to correctly parse mixed case command.", Parser.parseSelectKeyword(command, 0));
+ assertTrue("Failed to correctly parse mixed case command.", Parser.parseSelectKeyword(command, 0));
"Select".getChars(0, 6, command, 0);
- Assert.assertTrue("Failed to correctly parse mixed case command.", Parser.parseSelectKeyword(command, 0));
+ assertTrue("Failed to correctly parse mixed case command.", Parser.parseSelectKeyword(command, 0));
"select".getChars(0, 6, command, 0);
- Assert.assertTrue("Failed to correctly parse lower case command.", Parser.parseSelectKeyword(command, 0));
+ assertTrue("Failed to correctly parse lower case command.", Parser.parseSelectKeyword(command, 0));
}
+ @Test
public void testEscapeProcessing() throws Exception {
- Assert.assertEquals("DATE '1999-01-09'", Parser.replaceProcessing("{d '1999-01-09'}", true, false));
- Assert.assertEquals("DATE '1999-01-09'", Parser.replaceProcessing("{D '1999-01-09'}", true, false));
- Assert.assertEquals("TIME '20:00:03'", Parser.replaceProcessing("{t '20:00:03'}", true, false));
- Assert.assertEquals("TIME '20:00:03'", Parser.replaceProcessing("{T '20:00:03'}", true, false));
- Assert.assertEquals("TIMESTAMP '1999-01-09 20:11:11.123455'", Parser.replaceProcessing("{ts '1999-01-09 20:11:11.123455'}", true, false));
- Assert.assertEquals("TIMESTAMP '1999-01-09 20:11:11.123455'", Parser.replaceProcessing("{Ts '1999-01-09 20:11:11.123455'}", true, false));
-
- Assert.assertEquals("user", Parser.replaceProcessing("{fn user()}", true, false));
- Assert.assertEquals("cos(1)", Parser.replaceProcessing("{fn cos(1)}", true, false));
- Assert.assertEquals("extract(week from DATE '2005-01-24')", Parser.replaceProcessing("{fn week({d '2005-01-24'})}", true, false));
-
- Assert.assertEquals("\"T1\" LEFT OUTER JOIN t2 ON \"T1\".id = t2.id",
+ assertEquals("DATE '1999-01-09'", Parser.replaceProcessing("{d '1999-01-09'}", true, false));
+ assertEquals("DATE '1999-01-09'", Parser.replaceProcessing("{D '1999-01-09'}", true, false));
+ assertEquals("TIME '20:00:03'", Parser.replaceProcessing("{t '20:00:03'}", true, false));
+ assertEquals("TIME '20:00:03'", Parser.replaceProcessing("{T '20:00:03'}", true, false));
+ assertEquals("TIMESTAMP '1999-01-09 20:11:11.123455'", Parser.replaceProcessing("{ts '1999-01-09 20:11:11.123455'}", true, false));
+ assertEquals("TIMESTAMP '1999-01-09 20:11:11.123455'", Parser.replaceProcessing("{Ts '1999-01-09 20:11:11.123455'}", true, false));
+
+ assertEquals("user", Parser.replaceProcessing("{fn user()}", true, false));
+ assertEquals("cos(1)", Parser.replaceProcessing("{fn cos(1)}", true, false));
+ assertEquals("extract(week from DATE '2005-01-24')", Parser.replaceProcessing("{fn week({d '2005-01-24'})}", true, false));
+
+ assertEquals("\"T1\" LEFT OUTER JOIN t2 ON \"T1\".id = t2.id",
Parser.replaceProcessing("{oj \"T1\" LEFT OUTER JOIN t2 ON \"T1\".id = t2.id}", true, false));
- Assert.assertEquals("ESCAPE '_'", Parser.replaceProcessing("{escape '_'}", true, false));
+ assertEquals("ESCAPE '_'", Parser.replaceProcessing("{escape '_'}", true, false));
// nothing should be changed in that case, no valid escape code
- Assert.assertEquals("{obj : 1}", Parser.replaceProcessing("{obj : 1}", true, false));
+ assertEquals("{obj : 1}", Parser.replaceProcessing("{obj : 1}", true, false));
}
+ @Test
public void testUnterminatedEscape() throws Exception {
- Assert.assertEquals("{oj ", Parser.replaceProcessing("{oj ", true, false));
+ assertEquals("{oj ", Parser.replaceProcessing("{oj ", true, false));
+ }
+
+ @Test
+ @Ignore(value = "returning in the select clause is hard to distinguish from insert ... returning *")
+ public void insertSelectFakeReturning() throws SQLException {
+ String query =
+ "insert test(id, name) select 1, 'value' as RETURNING from test2";
+ List<NativeQuery> qry =
+ Parser.parseJdbcSql(
+ query, true, true, true, true);
+ boolean returningKeywordPresent = qry.get(0).command.isReturningKeywordPresent();
+ Assert.assertFalse("Query does not have returning clause " + query, returningKeywordPresent);
+ }
+
+ @Test
+ public void insertSelectReturning() throws SQLException {
+ String query =
+ "insert test(id, name) select 1, 'value' from test2 RETURNING id";
+ List<NativeQuery> qry =
+ Parser.parseJdbcSql(
+ query, true, true, true, true);
+ boolean returningKeywordPresent = qry.get(0).command.isReturningKeywordPresent();
+ Assert.assertTrue("Query has a returning clause " + query, returningKeywordPresent);
+ }
+
+ @Test
+ public void insertReturningInWith() throws SQLException {
+ String query =
+ "with x as (insert into mytab(x) values(1) returning x) insert test(id, name) select 1, 'value' from test2";
+ List<NativeQuery> qry =
+ Parser.parseJdbcSql(
+ query, true, true, true, true);
+ boolean returningKeywordPresent = qry.get(0).command.isReturningKeywordPresent();
+ Assert.assertFalse("There's no top-level <<returning>> clause " + query, returningKeywordPresent);
+ }
+
+ @Test
+ public void insertBatchedReWriteOnConflict() throws SQLException {
+ String query = "insert into test(id, name) values (:id,:name) ON CONFLICT (id) DO NOTHING";
+ List<NativeQuery> qry = Parser.parseJdbcSql(query, true, true, true, true);
+ SqlCommand command = qry.get(0).getCommand();
+ Assert.assertEquals(34, command.getBatchRewriteValuesBraceOpenPosition());
+ Assert.assertEquals(44, command.getBatchRewriteValuesBraceClosePosition());
+ }
+
+ @Test
+ public void insertBatchedReWriteOnConflictUpdateBind() throws SQLException {
+ String query = "insert into test(id, name) values (?,?) ON CONFLICT (id) UPDATE SET name=?";
+ List<NativeQuery> qry = Parser.parseJdbcSql(query, true, true, true, true);
+ SqlCommand command = qry.get(0).getCommand();
+ Assert.assertFalse("update set name=? is NOT compatible with insert rewrite", command.isBatchedReWriteCompatible());
+ }
+
+ @Test
+ public void insertBatchedReWriteOnConflictUpdateConstant() throws SQLException {
+ String query = "insert into test(id, name) values (?,?) ON CONFLICT (id) UPDATE SET name='default'";
+ List<NativeQuery> qry = Parser.parseJdbcSql(query, true, true, true, true);
+ SqlCommand command = qry.get(0).getCommand();
+ Assert.assertTrue("update set name='default' is compatible with insert rewrite", command.isBatchedReWriteCompatible());
+ }
+
+ @Test
+ public void insertMultiInsert() throws SQLException {
+ String query =
+ "insert into test(id, name) values (:id,:name),(:id,:name) ON CONFLICT (id) DO NOTHING";
+ List<NativeQuery> qry = Parser.parseJdbcSql(query, true, true, true, true);
+ SqlCommand command = qry.get(0).getCommand();
+ Assert.assertEquals(34, command.getBatchRewriteValuesBraceOpenPosition());
+ Assert.assertEquals(56, command.getBatchRewriteValuesBraceClosePosition());
}
}
diff --git a/pgjdbc/src/test/java/org/postgresql/core/ReturningParserTest.java b/pgjdbc/src/test/java/org/postgresql/core/ReturningParserTest.java
new file mode 100644
index 0000000..6aef08b
--- /dev/null
+++ b/pgjdbc/src/test/java/org/postgresql/core/ReturningParserTest.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright (c) 2003, PostgreSQL Global Development Group
+ * See the LICENSE file in the project root for more information.
+ */
+
+package org.postgresql.core;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+ at RunWith(Parameterized.class)
+public class ReturningParserTest {
+ private final String columnName;
+ private final String returning;
+ private final String prefix;
+ private final String suffix;
+
+ public ReturningParserTest(String columnName, String returning, String prefix, String suffix) {
+ this.columnName = columnName;
+ this.returning = returning;
+ this.prefix = prefix;
+ this.suffix = suffix;
+ }
+
+
+ @Parameterized.Parameters(name = "columnName={2} {0} {3}, returning={2} {1} {3}")
+ public static Iterable<Object[]> data() {
+ Collection<Object[]> ids = new ArrayList<Object[]>();
+
+ String[] delimiters = {"", "_", "3", "*", " "};
+
+ for (String columnName : new String[]{"returning", "returningreturning"}) {
+ for (String prefix : delimiters) {
+ for (String suffix : delimiters) {
+ for (String returning : new String[]{"returning", "returningreturning"}) {
+ ids.add(new Object[]{columnName, returning, prefix, suffix});
+ }
+ }
+ }
+ }
+ return ids;
+ }
+
+ @Test
+ public void test() throws SQLException {
+ String query =
+ "insert into\"prep\"(a, " + prefix + columnName + suffix + ")values(1,2)" + prefix
+ + returning + suffix;
+ List<NativeQuery> qry = Parser.parseJdbcSql(query, true, true, true, true);
+ boolean returningKeywordPresent = qry.get(0).command.isReturningKeywordPresent();
+
+ boolean expectedReturning = this.returning.equalsIgnoreCase("returning")
+ && (prefix.isEmpty() || !Character.isJavaIdentifierStart(prefix.charAt(0)))
+ && (suffix.isEmpty() || !Character.isJavaIdentifierPart(suffix.charAt(0)));
+ if (expectedReturning != returningKeywordPresent) {
+ Assert.assertEquals("Wrong <returning_clause> detected in SQL " + query,
+ expectedReturning,
+ returningKeywordPresent);
+ }
+ }
+
+}
diff --git a/pgjdbc/src/test/java/org/postgresql/core/v3/V3ParameterListTests.java b/pgjdbc/src/test/java/org/postgresql/core/v3/V3ParameterListTests.java
index b00d33d..82116e4 100644
--- a/pgjdbc/src/test/java/org/postgresql/core/v3/V3ParameterListTests.java
+++ b/pgjdbc/src/test/java/org/postgresql/core/v3/V3ParameterListTests.java
@@ -5,9 +5,10 @@
package org.postgresql.core.v3;
-import org.postgresql.test.jdbc2.BaseTest;
+import static org.junit.Assert.assertEquals;
import org.junit.Before;
+import org.junit.Test;
import java.sql.SQLException;
@@ -17,7 +18,23 @@ import java.sql.SQLException;
* @author Jeremy Whiting jwhiting at redhat.com
*
*/
-public class V3ParameterListTests extends BaseTest {
+public class V3ParameterListTests {
+ private TypeTransferModeRegistry transferModeRegistry;
+
+ @Before
+ public void setUp() throws Exception {
+ transferModeRegistry = new TypeTransferModeRegistry() {
+ @Override
+ public boolean useBinaryForSend(int oid) {
+ return false;
+ }
+
+ @Override
+ public boolean useBinaryForReceive(int oid) {
+ return false;
+ }
+ };
+ }
/**
* Test to check the merging of two collections of parameters. All elements
@@ -26,6 +43,7 @@ public class V3ParameterListTests extends BaseTest {
* @throws SQLException
* raised exception if setting parameter fails.
*/
+ @Test
public void testMergeOfParameterLists() throws SQLException {
SimpleParameterList s1SPL = new SimpleParameterList(8, transferModeRegistry);
s1SPL.setIntParameter(1, 1);
@@ -44,27 +62,4 @@ public class V3ParameterListTests extends BaseTest {
"Expected string representation of values does not match outcome.",
"<[1 ,2 ,3 ,4 ,5 ,6 ,7 ,8]>", s1SPL.toString());
}
-
- public V3ParameterListTests(String test) {
- super(test);
- }
-
- private TypeTransferModeRegistry transferModeRegistry;
-
- @Override
- @Before
- protected void setUp() throws Exception {
- transferModeRegistry =
- new TypeTransferModeRegistry() {
- @Override
- public boolean useBinaryForSend(int oid) {
- return false;
- }
-
- @Override
- public boolean useBinaryForReceive(int oid) {
- return false;
- }
- };
- }
}
diff --git a/pgjdbc/src/test/java/org/postgresql/jdbc/DeepBatchedInsertStatementTest.java b/pgjdbc/src/test/java/org/postgresql/jdbc/DeepBatchedInsertStatementTest.java
index 83f62e6..0ee43ed 100644
--- a/pgjdbc/src/test/java/org/postgresql/jdbc/DeepBatchedInsertStatementTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/jdbc/DeepBatchedInsertStatementTest.java
@@ -5,14 +5,18 @@
package org.postgresql.jdbc;
+import static org.junit.Assert.assertEquals;
+
import org.postgresql.PGProperty;
import org.postgresql.core.ParameterList;
import org.postgresql.core.Query;
import org.postgresql.core.v3.BatchedQuery;
import org.postgresql.test.TestUtil;
-import org.postgresql.test.jdbc2.BaseTest;
+import org.postgresql.test.jdbc2.BaseTest4;
import org.postgresql.test.jdbc2.BatchExecuteTest;
+import org.junit.Test;
+
import java.lang.reflect.Method;
import java.sql.Date;
import java.sql.SQLException;
@@ -25,16 +29,14 @@ import java.util.Properties;
* execution. Rather than rely on testing at the jdbc api layer.
* on.
*/
-public class DeepBatchedInsertStatementTest extends BaseTest {
- public DeepBatchedInsertStatementTest(String name) {
- super(name);
- }
+public class DeepBatchedInsertStatementTest extends BaseTest4 {
/*
* Set up the fixture for this testcase: a connection to a database with a
* table for this test.
*/
- protected void setUp() throws Exception {
+ @Override
+ public void setUp() throws Exception {
super.setUp();
Statement stmt = con.createStatement();
@@ -56,7 +58,8 @@ public class DeepBatchedInsertStatementTest extends BaseTest {
}
// Tear down the fixture for this test case.
- protected void tearDown() throws SQLException {
+ @Override
+ public void tearDown() throws SQLException {
TestUtil.dropTable(con, "testbatch");
TestUtil.dropTable(con, "testunspecified");
super.tearDown();
@@ -68,6 +71,7 @@ public class DeepBatchedInsertStatementTest extends BaseTest {
forceBinary(props);
}
+ @Test
public void testDeepInternalsBatchedQueryDecorator() throws Exception {
PgPreparedStatement pstmt = null;
try {
@@ -200,6 +204,7 @@ public class DeepBatchedInsertStatementTest extends BaseTest {
/**
*
*/
+ @Test
public void testUnspecifiedParameterType() throws Exception {
PgPreparedStatement pstmt = null;
try {
@@ -233,6 +238,7 @@ public class DeepBatchedInsertStatementTest extends BaseTest {
* Test to check the statement can provide the necessary number of prepared
* type fields. This is after running with a batch size of 1.
*/
+ @Test
public void testVaryingTypeCounts() throws SQLException {
PgPreparedStatement pstmt = null;
try {
diff --git a/pgjdbc/src/test/java/org/postgresql/jdbc/PrimitiveArraySupportTest.java b/pgjdbc/src/test/java/org/postgresql/jdbc/PrimitiveArraySupportTest.java
new file mode 100644
index 0000000..83b028b
--- /dev/null
+++ b/pgjdbc/src/test/java/org/postgresql/jdbc/PrimitiveArraySupportTest.java
@@ -0,0 +1,253 @@
+/*
+ * Copyright (c) 2003, PostgreSQL Global Development Group
+ * See the LICENSE file in the project root for more information.
+ */
+
+package org.postgresql.jdbc;
+
+import static org.hamcrest.CoreMatchers.instanceOf;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.fail;
+
+import org.postgresql.core.Oid;
+
+import org.junit.Test;
+
+import java.sql.SQLFeatureNotSupportedException;
+
+public class PrimitiveArraySupportTest {
+
+ public PrimitiveArraySupport<long[]> longArrays = PrimitiveArraySupport.getArraySupport(new long[] {});
+ public PrimitiveArraySupport<int[]> intArrays = PrimitiveArraySupport.getArraySupport(new int[] {});
+ public PrimitiveArraySupport<short[]> shortArrays = PrimitiveArraySupport.getArraySupport(new short[] {});
+ public PrimitiveArraySupport<double[]> doubleArrays = PrimitiveArraySupport.getArraySupport(new double[] {});
+ public PrimitiveArraySupport<float[]> floatArrays = PrimitiveArraySupport.getArraySupport(new float[] {});
+ public PrimitiveArraySupport<boolean[]> booleanArrays = PrimitiveArraySupport.getArraySupport(new boolean[] {});
+
+ @Test
+ public void testLongBinary() throws Exception {
+ final long[] longs = new long[84];
+ for (int i = 0; i < 84; ++i) {
+ longs[i] = i - 3;
+ }
+
+ final PgArray pgArray = new PgArray(null, Oid.INT8_ARRAY, longArrays.toBinaryRepresentation(null, longs));
+
+ Object arrayObj = pgArray.getArray();
+
+ assertThat(arrayObj, instanceOf(Long[].class));
+
+ final Long[] actual = (Long[]) arrayObj;
+
+ assertEquals(longs.length, actual.length);
+
+ for (int i = 0; i < longs.length; ++i) {
+ assertEquals(Long.valueOf(longs[i]), actual[i]);
+ }
+ }
+
+ @Test
+ public void testLongToString() throws Exception {
+ final long[] longs = new long[] { 12367890987L, 987664198234L, -2982470923874L };
+
+ final String arrayString = longArrays.toArrayString(',', longs);
+
+ assertEquals("{12367890987,987664198234,-2982470923874}", arrayString);
+
+ final String altArrayString = longArrays.toArrayString(';', longs);
+
+ assertEquals("{12367890987;987664198234;-2982470923874}", altArrayString);
+ }
+
+ @Test
+ public void testIntBinary() throws Exception {
+ final int[] ints = new int[13];
+ for (int i = 0; i < 13; ++i) {
+ ints[i] = i - 3;
+ }
+
+ final PgArray pgArray = new PgArray(null, Oid.INT4_ARRAY, intArrays.toBinaryRepresentation(null, ints));
+
+ Object arrayObj = pgArray.getArray();
+
+ assertThat(arrayObj, instanceOf(Integer[].class));
+
+ final Integer[] actual = (Integer[]) arrayObj;
+
+ assertEquals(ints.length, actual.length);
+
+ for (int i = 0; i < ints.length; ++i) {
+ assertEquals(Integer.valueOf(ints[i]), actual[i]);
+ }
+ }
+
+ @Test
+ public void testIntToString() throws Exception {
+ final int[] ints = new int[] { 12367890, 987664198, -298247092 };
+
+ final String arrayString = intArrays.toArrayString(',', ints);
+
+ assertEquals("{12367890,987664198,-298247092}", arrayString);
+
+ final String altArrayString = intArrays.toArrayString(';', ints);
+
+ assertEquals("{12367890;987664198;-298247092}", altArrayString);
+
+ }
+
+ @Test
+ public void testShortToBinary() throws Exception {
+ final short[] shorts = new short[13];
+ for (int i = 0; i < 13; ++i) {
+ shorts[i] = (short) (i - 3);
+ }
+
+ final PgArray pgArray = new PgArray(null, Oid.INT4_ARRAY, shortArrays.toBinaryRepresentation(null, shorts));
+
+ Object arrayObj = pgArray.getArray();
+
+ assertThat(arrayObj, instanceOf(Short[].class));
+
+ final Short[] actual = (Short[]) arrayObj;
+
+ assertEquals(shorts.length, actual.length);
+
+ for (int i = 0; i < shorts.length; ++i) {
+ assertEquals(Short.valueOf(shorts[i]), actual[i]);
+ }
+ }
+
+ @Test
+ public void testShortToString() throws Exception {
+ final short[] shorts = new short[] { 123, 34, -57 };
+
+ final String arrayString = shortArrays.toArrayString(',', shorts);
+
+ assertEquals("{123,34,-57}", arrayString);
+
+ final String altArrayString = shortArrays.toArrayString(';', shorts);
+
+ assertEquals("{123;34;-57}", altArrayString);
+
+ }
+
+ @Test
+ public void testDoubleBinary() throws Exception {
+ final double[] doubles = new double[13];
+ for (int i = 0; i < 13; ++i) {
+ doubles[i] = i - 3.1;
+ }
+
+ final PgArray pgArray = new PgArray(null, Oid.FLOAT8_ARRAY, doubleArrays.toBinaryRepresentation(null, doubles));
+
+ Object arrayObj = pgArray.getArray();
+
+ assertThat(arrayObj, instanceOf(Double[].class));
+
+ final Double[] actual = (Double[]) arrayObj;
+
+ assertEquals(doubles.length, actual.length);
+
+ for (int i = 0; i < doubles.length; ++i) {
+ assertEquals(Double.valueOf(doubles[i]), actual[i]);
+ }
+ }
+
+ @Test
+ public void testdoubleToString() throws Exception {
+ final double[] doubles = new double[] { 122353.345, 923487.235987, -23.239486 };
+
+ final String arrayString = doubleArrays.toArrayString(',', doubles);
+
+ assertEquals("{\"122353.345\",\"923487.235987\",\"-23.239486\"}", arrayString);
+
+ final String altArrayString = doubleArrays.toArrayString(';', doubles);
+
+ assertEquals("{\"122353.345\";\"923487.235987\";\"-23.239486\"}", altArrayString);
+
+ }
+
+ @Test
+ public void testFloatBinary() throws Exception {
+ final float[] floats = new float[13];
+ for (int i = 0; i < 13; ++i) {
+ floats[i] = (float) (i - 3.1);
+ }
+
+ final PgArray pgArray = new PgArray(null, Oid.FLOAT4_ARRAY, floatArrays.toBinaryRepresentation(null, floats));
+
+ Object arrayObj = pgArray.getArray();
+
+ assertThat(arrayObj, instanceOf(Float[].class));
+
+ final Float[] actual = (Float[]) arrayObj;
+
+ assertEquals(floats.length, actual.length);
+
+ for (int i = 0; i < floats.length; ++i) {
+ assertEquals(Float.valueOf(floats[i]), actual[i]);
+ }
+ }
+
+ @Test
+ public void testfloatToString() throws Exception {
+ final float[] floats = new float[] { 122353.34f, 923487.25f, -23.2394f };
+
+ final String arrayString = floatArrays.toArrayString(',', floats);
+
+ assertEquals("{\"122353.34\",\"923487.25\",\"-23.2394\"}", arrayString);
+
+ final String altArrayString = floatArrays.toArrayString(';', floats);
+
+ assertEquals("{\"122353.34\";\"923487.25\";\"-23.2394\"}", altArrayString);
+
+ }
+
+ @Test
+ public void testBooleanBinary() throws Exception {
+ final boolean[] bools = new boolean[] { true, true, false };
+
+ final PgArray pgArray = new PgArray(null, Oid.BIT, booleanArrays.toBinaryRepresentation(null, bools));
+
+ Object arrayObj = pgArray.getArray();
+
+ assertThat(arrayObj, instanceOf(Boolean[].class));
+
+ final Boolean[] actual = (Boolean[]) arrayObj;
+
+ assertEquals(bools.length, actual.length);
+
+ for (int i = 0; i < bools.length; ++i) {
+ assertEquals(Boolean.valueOf(bools[i]), actual[i]);
+ }
+ }
+
+ @Test
+ public void testBooleanToString() throws Exception {
+ final boolean[] bools = new boolean[] { true, true, false };
+
+ final String arrayString = booleanArrays.toArrayString(',', bools);
+
+ assertEquals("{1,1,0}", arrayString);
+
+ final String altArrayString = booleanArrays.toArrayString(';', bools);
+
+ assertEquals("{1;1;0}", altArrayString);
+ }
+
+ @Test
+ public void testStringNotSupportBinary() {
+ PrimitiveArraySupport<String[]> stringArrays = PrimitiveArraySupport.getArraySupport(new String[] {});
+ assertNotNull(stringArrays);
+ assertFalse(stringArrays.supportBinaryRepresentation());
+ try {
+ stringArrays.toBinaryRepresentation(null, new String[] { "1.2" });
+ fail("no sql exception thrown");
+ } catch (SQLFeatureNotSupportedException e) {
+
+ }
+ }
+}
diff --git a/pgjdbc/src/test/java/org/postgresql/replication/LogSequenceNumberTest.java b/pgjdbc/src/test/java/org/postgresql/replication/LogSequenceNumberTest.java
new file mode 100644
index 0000000..98bce82
--- /dev/null
+++ b/pgjdbc/src/test/java/org/postgresql/replication/LogSequenceNumberTest.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright (c) 2016, PostgreSQL Global Development Group
+ * See the LICENSE file in the project root for more information.
+ */
+
+package org.postgresql.replication;
+
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.hamcrest.CoreMatchers.not;
+import static org.hamcrest.CoreMatchers.notNullValue;
+import static org.junit.Assert.assertThat;
+
+import org.junit.Test;
+
+
+public class LogSequenceNumberTest {
+ @Test
+ public void testNotNullWhenCreateFromStr() throws Exception {
+ LogSequenceNumber result = LogSequenceNumber.valueOf("0/15D68C50");
+ assertThat(result, notNullValue());
+ }
+
+ @Test
+ public void testParseNotValidLSNStr() throws Exception {
+ LogSequenceNumber result = LogSequenceNumber.valueOf("15D68C55");
+ assertThat(result, equalTo(LogSequenceNumber.INVALID_LSN));
+ }
+
+ @Test
+ public void testParseLSNFromStringAndConvertToLong() throws Exception {
+ LogSequenceNumber result = LogSequenceNumber.valueOf("16/3002D50");
+ assertThat("64-bit number use in replication protocol, "
+ + "that why we should can convert string represent LSN to long",
+ result.asLong(), equalTo(94539623760L)
+ );
+ }
+
+ @Test
+ public void testConvertNumericLSNToString() throws Exception {
+ LogSequenceNumber result = LogSequenceNumber.valueOf(94539623760L);
+
+ assertThat("64-bit number use in replication protocol, "
+ + "but more readable standard format use in logs where each 8-bit print in hex form via slash",
+ result.asString(), equalTo("16/3002D50")
+ );
+ }
+
+ @Test
+ public void testConvertNumericLSNToString_2() throws Exception {
+ LogSequenceNumber result = LogSequenceNumber.valueOf(366383352L);
+
+ assertThat("64-bit number use in replication protocol, "
+ + "but more readable standard format use in logs where each 8-bit print in hex form via slash",
+ result.asString(), equalTo("0/15D690F8")
+ );
+ }
+
+ @Test
+ public void testEqualLSN() throws Exception {
+ LogSequenceNumber first = LogSequenceNumber.valueOf("0/15D690F8");
+ LogSequenceNumber second = LogSequenceNumber.valueOf("0/15D690F8");
+
+ assertThat(first, equalTo(second));
+ }
+
+ @Test
+ public void testEqualLSNCreateByDifferentWay() throws Exception {
+ LogSequenceNumber first = LogSequenceNumber.valueOf("0/15D690F8");
+ LogSequenceNumber second = LogSequenceNumber.valueOf(366383352L);
+
+ assertThat("LSN creates as 64-bit number and as string where each 8-bit print in hex form "
+ + "via slash represent same position in WAL should be equals",
+ first, equalTo(second)
+ );
+ }
+
+ @Test
+ public void testNotEqualLSN() throws Exception {
+ LogSequenceNumber first = LogSequenceNumber.valueOf("0/15D690F8");
+ LogSequenceNumber second = LogSequenceNumber.valueOf("0/15D68C50");
+
+ assertThat(first, not(equalTo(second)));
+ }
+
+ @Test
+ public void testDifferentLSNHaveDifferentHash() throws Exception {
+ LogSequenceNumber first = LogSequenceNumber.valueOf("0/15D690F8");
+ LogSequenceNumber second = LogSequenceNumber.valueOf("0/15D68C50");
+
+ assertThat(first.hashCode(), not(equalTo(second.hashCode())));
+ }
+
+ @Test
+ public void testSameLSNHaveSameHash() throws Exception {
+ LogSequenceNumber first = LogSequenceNumber.valueOf("0/15D690F8");
+ LogSequenceNumber second = LogSequenceNumber.valueOf("0/15D690F8");
+
+ assertThat(first.hashCode(), equalTo(second.hashCode()));
+ }
+}
diff --git a/pgjdbc/src/test/java/org/postgresql/replication/LogicalReplicationStatusTest.java b/pgjdbc/src/test/java/org/postgresql/replication/LogicalReplicationStatusTest.java
new file mode 100644
index 0000000..0f62210
--- /dev/null
+++ b/pgjdbc/src/test/java/org/postgresql/replication/LogicalReplicationStatusTest.java
@@ -0,0 +1,535 @@
+/*
+ * Copyright (c) 2016, PostgreSQL Global Development Group
+ * See the LICENSE file in the project root for more information.
+ */
+
+package org.postgresql.replication;
+
+import static org.hamcrest.CoreMatchers.not;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.core.IsEqual.equalTo;
+
+import org.postgresql.PGConnection;
+import org.postgresql.PGProperty;
+import org.postgresql.core.BaseConnection;
+import org.postgresql.core.ServerVersion;
+import org.postgresql.test.TestUtil;
+import org.postgresql.test.util.rules.ServerVersionRule;
+import org.postgresql.test.util.rules.annotation.HaveMinimalServerVersion;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+
+import java.nio.ByteBuffer;
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Properties;
+import java.util.concurrent.TimeUnit;
+
+ at HaveMinimalServerVersion("9.4")
+public class LogicalReplicationStatusTest {
+ private static final String SLOT_NAME = "pgjdbc_logical_replication_slot";
+
+ @Rule
+ public ServerVersionRule versionRule = new ServerVersionRule();
+
+ private Connection replicationConnection;
+ private Connection sqlConnection;
+
+ @Before
+ public void setUp() throws Exception {
+ //statistic available only for privileged user
+ sqlConnection = TestUtil.openPrivilegedDB();
+ //DriverManager.setLogWriter(new PrintWriter(System.out));
+ replicationConnection = openReplicationConnection();
+ TestUtil.createTable(sqlConnection, "test_logic_table",
+ "pk serial primary key, name varchar(100)");
+
+ TestUtil.recreateLogicalReplicationSlot(sqlConnection, SLOT_NAME, "test_decoding");
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ replicationConnection.close();
+ TestUtil.dropTable(sqlConnection, "test_logic_table");
+ TestUtil.dropReplicationSlot(sqlConnection, SLOT_NAME);
+ sqlConnection.close();
+ }
+
+ @Test()
+ public void testSentLocationEqualToLastReceiveLSN() throws Exception {
+ PGConnection pgConnection = (PGConnection) replicationConnection;
+
+ LogSequenceNumber startLSN = getCurrentLSN();
+
+ Statement st = sqlConnection.createStatement();
+ st.execute("insert into test_logic_table(name) values('previous changes')");
+ st.close();
+
+ PGReplicationStream stream =
+ pgConnection
+ .getReplicationAPI()
+ .replicationStream()
+ .logical()
+ .withSlotName(SLOT_NAME)
+ .withStartPosition(startLSN)
+ .start();
+
+ final int countMessage = 3;
+
+ List<String> received = receiveMessageWithoutBlock(stream, countMessage);
+ LogSequenceNumber lastReceivedLSN = stream.getLastReceiveLSN();
+ stream.forceUpdateStatus();
+
+ LogSequenceNumber sentByServer = getSentLocationOnView();
+
+ assertThat("When changes absent on server last receive by stream LSN "
+ + "should be equal to last sent by server LSN",
+ sentByServer, equalTo(lastReceivedLSN)
+ );
+ }
+
+ /**
+ * Test fail on PG version 9.4.5 because postgresql have bug
+ */
+ @Test
+ @HaveMinimalServerVersion("9.4.8")
+ public void testReceivedLSNDependentOnProcessMessage() throws Exception {
+ PGConnection pgConnection = (PGConnection) replicationConnection;
+
+ LogSequenceNumber startLSN = getCurrentLSN();
+
+ Statement st = sqlConnection.createStatement();
+ st.execute("insert into test_logic_table(name) values('previous changes')");
+ st.close();
+
+ PGReplicationStream stream =
+ pgConnection
+ .getReplicationAPI()
+ .replicationStream()
+ .logical()
+ .withSlotName(SLOT_NAME)
+ .withStartPosition(startLSN)
+ .start();
+
+ receiveMessageWithoutBlock(stream, 1);
+ LogSequenceNumber firstLSN = stream.getLastReceiveLSN();
+
+ receiveMessageWithoutBlock(stream, 1);
+ LogSequenceNumber secondLSN = stream.getLastReceiveLSN();
+
+ assertThat("After receive each new message current LSN updates in stream",
+ firstLSN, not(equalTo(secondLSN))
+ );
+ }
+
+ @Test
+ public void testLastReceiveLSNCorrectOnView() throws Exception {
+ PGConnection pgConnection = (PGConnection) replicationConnection;
+
+ LogSequenceNumber startLSN = getCurrentLSN();
+
+ Statement st = sqlConnection.createStatement();
+ st.execute("insert into test_logic_table(name) values('previous changes')");
+ st.close();
+
+ PGReplicationStream stream =
+ pgConnection
+ .getReplicationAPI()
+ .replicationStream()
+ .logical()
+ .withSlotName(SLOT_NAME)
+ .withStartPosition(startLSN)
+ .start();
+
+ receiveMessageWithoutBlock(stream, 2);
+ LogSequenceNumber lastReceivedLSN = stream.getLastReceiveLSN();
+ stream.forceUpdateStatus();
+
+ assertThat(
+ "Replication stream by execute forceUpdateStatus should send to view actual received position "
+ + "that allow monitoring lag",
+ lastReceivedLSN, equalTo(getWriteLocationOnView())
+ );
+ }
+
+ @Test
+ public void testWriteLocationCanBeLessThanSendLocation() throws Exception {
+ PGConnection pgConnection = (PGConnection) replicationConnection;
+
+ LogSequenceNumber startLSN = getCurrentLSN();
+
+ Statement st = sqlConnection.createStatement();
+ st.execute("insert into test_logic_table(name) values('previous changes')");
+ st.close();
+
+ PGReplicationStream stream =
+ pgConnection
+ .getReplicationAPI()
+ .replicationStream()
+ .logical()
+ .withSlotName(SLOT_NAME)
+ .withStartPosition(startLSN)
+ .start();
+
+ receiveMessageWithoutBlock(stream, 2);
+ stream.forceUpdateStatus();
+
+ LogSequenceNumber writeLocation = getWriteLocationOnView();
+ LogSequenceNumber sentLocation = getSentLocationOnView();
+
+ assertThat(
+ "In view pg_stat_replication column write_location define which position consume client "
+ + "but sent_location define which position was sent to client, so in current test we have 1 pending message, "
+ + "so write and sent can't be equals",
+ writeLocation, not(equalTo(sentLocation))
+ );
+ }
+
+ @Test
+ public void testFlushLocationEqualToSetLocation() throws Exception {
+ PGConnection pgConnection = (PGConnection) replicationConnection;
+
+ LogSequenceNumber startLSN = getCurrentLSN();
+
+ Statement st = sqlConnection.createStatement();
+ st.execute("insert into test_logic_table(name) values('previous changes')");
+ st.close();
+
+ PGReplicationStream stream =
+ pgConnection
+ .getReplicationAPI()
+ .replicationStream()
+ .logical()
+ .withSlotName(SLOT_NAME)
+ .withStartPosition(startLSN)
+ .start();
+
+ receiveMessageWithoutBlock(stream, 1);
+
+ LogSequenceNumber flushLSN = stream.getLastReceiveLSN();
+ stream.setFlushedLSN(flushLSN);
+
+ //consume another messages
+ receiveMessageWithoutBlock(stream, 2);
+
+ stream.forceUpdateStatus();
+
+ LogSequenceNumber result = getFlushLocationOnView();
+
+ assertThat("Flush LSN use for define which wal can be recycled and it parameter should be "
+ + "specify manually on replication stream, because only client "
+ + "of replication stream now which wal not necessary. We wait that it status correct "
+ + "send to backend and available via view, because if status will "
+ + "not send it lead to problem when WALs never recycled",
+ result, equalTo(flushLSN)
+ );
+ }
+
+ @Test
+ public void testFlushLocationDoNotChangeDuringReceiveMessage() throws Exception {
+ PGConnection pgConnection = (PGConnection) replicationConnection;
+
+ LogSequenceNumber startLSN = getCurrentLSN();
+
+ Statement st = sqlConnection.createStatement();
+ st.execute("insert into test_logic_table(name) values('previous changes')");
+ st.close();
+
+ PGReplicationStream stream =
+ pgConnection
+ .getReplicationAPI()
+ .replicationStream()
+ .logical()
+ .withSlotName(SLOT_NAME)
+ .withStartPosition(startLSN)
+ .start();
+
+ receiveMessageWithoutBlock(stream, 1);
+ final LogSequenceNumber flushLSN = stream.getLastReceiveLSN();
+ stream.setFlushedLSN(flushLSN);
+ receiveMessageWithoutBlock(stream, 2);
+
+ assertThat(
+ "Flush LSN it parameter that specify manually on stream and they can not automatically "
+ + "change during receive another messages, "
+ + "because auto update can lead to problem when WAL recycled on postgres "
+ + "because we send feedback that current position successfully flush, but in real they not flush yet",
+ stream.getLastFlushedLSN(), equalTo(flushLSN)
+ );
+ }
+
+ @Test
+ public void testApplyLocationEqualToSetLocation() throws Exception {
+ PGConnection pgConnection = (PGConnection) replicationConnection;
+
+ LogSequenceNumber startLSN = getCurrentLSN();
+
+ Statement st = sqlConnection.createStatement();
+ st.execute("insert into test_logic_table(name) values('previous changes')");
+ st.close();
+
+ PGReplicationStream stream =
+ pgConnection
+ .getReplicationAPI()
+ .replicationStream()
+ .logical()
+ .withSlotName(SLOT_NAME)
+ .withStartPosition(startLSN)
+ .start();
+
+ receiveMessageWithoutBlock(stream, 1);
+ final LogSequenceNumber applyLSN = stream.getLastReceiveLSN();
+
+ stream.setAppliedLSN(applyLSN);
+ stream.setFlushedLSN(applyLSN);
+
+ receiveMessageWithoutBlock(stream, 2);
+ stream.forceUpdateStatus();
+
+ LogSequenceNumber result = getReplayLocationOnView();
+
+ assertThat(
+ "During receive message from replication stream all feedback parameter "
+ + "that we set to stream should be sent to backend"
+ + "because it allow monitoring replication status and also recycle old WALs",
+ result, equalTo(applyLSN)
+ );
+ }
+
+ /**
+ * Test fail on PG version 9.4.5 because postgresql have bug
+ */
+ @Test
+ @HaveMinimalServerVersion("9.4.8")
+ public void testApplyLocationDoNotDependOnFlushLocation() throws Exception {
+ PGConnection pgConnection = (PGConnection) replicationConnection;
+
+ LogSequenceNumber startLSN = getCurrentLSN();
+
+ Statement st = sqlConnection.createStatement();
+ st.execute("insert into test_logic_table(name) values('previous changes')");
+ st.close();
+
+ PGReplicationStream stream =
+ pgConnection
+ .getReplicationAPI()
+ .replicationStream()
+ .logical()
+ .withSlotName(SLOT_NAME)
+ .withStartPosition(startLSN)
+ .start();
+
+ receiveMessageWithoutBlock(stream, 1);
+ stream.setAppliedLSN(stream.getLastReceiveLSN());
+ stream.setFlushedLSN(stream.getLastReceiveLSN());
+
+ receiveMessageWithoutBlock(stream, 1);
+ stream.setFlushedLSN(stream.getLastReceiveLSN());
+
+ receiveMessageWithoutBlock(stream, 1);
+ stream.forceUpdateStatus();
+
+
+ LogSequenceNumber flushed = getFlushLocationOnView();
+ LogSequenceNumber applied = getReplayLocationOnView();
+
+ assertThat(
+ "Last applied LSN and last flushed LSN it two not depends parameters and they can be not equal between",
+ applied, not(equalTo(flushed))
+ );
+ }
+
+ @Test
+ public void testApplyLocationDoNotChangeDuringReceiveMessage() throws Exception {
+ PGConnection pgConnection = (PGConnection) replicationConnection;
+
+ LogSequenceNumber startLSN = getCurrentLSN();
+
+ Statement st = sqlConnection.createStatement();
+ st.execute("insert into test_logic_table(name) values('previous changes')");
+ st.close();
+
+ PGReplicationStream stream =
+ pgConnection
+ .getReplicationAPI()
+ .replicationStream()
+ .logical()
+ .withSlotName(SLOT_NAME)
+ .withStartPosition(startLSN)
+ .start();
+
+ receiveMessageWithoutBlock(stream, 1);
+ final LogSequenceNumber applyLSN = stream.getLastReceiveLSN();
+ stream.setAppliedLSN(applyLSN);
+ receiveMessageWithoutBlock(stream, 2);
+
+ assertThat(
+ "Apply LSN it parameter that specify manually on stream and they can not automatically "
+ + "change during receive another messages, "
+ + "because auto update can lead to problem when WAL recycled on postgres "
+ + "because we send feedback that current position successfully flush, but in real they not flush yet",
+ stream.getLastAppliedLSN(), equalTo(applyLSN)
+ );
+ }
+
+ @Test
+ public void testStatusCanBeSentToBackendAsynchronously() throws Exception {
+ PGConnection pgConnection = (PGConnection) replicationConnection;
+
+ final int intervalTime = 100;
+ final TimeUnit timeFormat = TimeUnit.MILLISECONDS;
+
+ LogSequenceNumber startLSN = getCurrentLSN();
+
+ Statement st = sqlConnection.createStatement();
+ st.execute("insert into test_logic_table(name) values('previous changes')");
+ st.close();
+
+ PGReplicationStream stream =
+ pgConnection
+ .getReplicationAPI()
+ .replicationStream()
+ .logical()
+ .withSlotName(SLOT_NAME)
+ .withStartPosition(startLSN)
+ .withStatusInterval(intervalTime, timeFormat)
+ .start();
+
+ receiveMessageWithoutBlock(stream, 3);
+
+ LogSequenceNumber waitLSN = stream.getLastReceiveLSN();
+
+ stream.setAppliedLSN(waitLSN);
+ stream.setFlushedLSN(waitLSN);
+
+ timeFormat.sleep(intervalTime + 1);
+
+ //get pending message and trigger update status by timeout
+ stream.readPending();
+
+ LogSequenceNumber flushLSN = getFlushLocationOnView();
+
+ assertThat("Status can be sent to backend by some time interval, "
+ + "by default it parameter equals to 10 second, but in current test we change it on few millisecond "
+ + "and wait that set status on stream will be auto send to backend",
+ flushLSN, equalTo(waitLSN)
+ );
+ }
+
+ private LogSequenceNumber getSentLocationOnView() throws Exception {
+ return getLSNFromView((((BaseConnection) sqlConnection).haveMinimumServerVersion(ServerVersion.v10)
+ ? "sent_lsn" : "sent_location"));
+ }
+
+ private LogSequenceNumber getWriteLocationOnView() throws Exception {
+ return getLSNFromView((((BaseConnection) sqlConnection).haveMinimumServerVersion(ServerVersion.v10)
+ ? "write_lsn" : "write_location"));
+ }
+
+ private LogSequenceNumber getFlushLocationOnView() throws Exception {
+ return getLSNFromView((((BaseConnection) sqlConnection).haveMinimumServerVersion(ServerVersion.v10)
+ ? "flush_lsn" : "flush_location"));
+ }
+
+ private LogSequenceNumber getReplayLocationOnView() throws Exception {
+ return getLSNFromView((((BaseConnection) sqlConnection).haveMinimumServerVersion(ServerVersion.v10)
+ ? "replay_lsn" : "replay_location"));
+ }
+
+ private List<String> receiveMessageWithoutBlock(PGReplicationStream stream, int count)
+ throws Exception {
+ List<String> result = new ArrayList<String>(3);
+ for (int index = 0; index < count; index++) {
+ ByteBuffer message;
+ do {
+ message = stream.readPending();
+
+ if (message == null) {
+ TimeUnit.MILLISECONDS.sleep(2);
+ }
+ } while (message == null);
+
+ result.add(toString(message));
+ }
+
+ return result;
+ }
+
+ private String toString(ByteBuffer buffer) {
+ int offset = buffer.arrayOffset();
+ byte[] source = buffer.array();
+ int length = source.length - offset;
+
+ return new String(source, offset, length);
+ }
+
+ private LogSequenceNumber getLSNFromView(String columnName) throws Exception {
+ int pid = ((PGConnection) replicationConnection).getBackendPID();
+
+ int repeatCount = 0;
+ while (true) {
+ Statement st = sqlConnection.createStatement();
+ ResultSet rs = null;
+ try {
+ rs = st.executeQuery("select * from pg_stat_replication where pid = " + pid);
+
+ String result = null;
+ if (rs.next()) {
+ result = rs.getString(columnName);
+ }
+
+ if (result == null || result.isEmpty()) {
+ //replication monitoring view updates with some delay, wait some time and try again
+ TimeUnit.MILLISECONDS.sleep(100L);
+ repeatCount++;
+ if (repeatCount == 10) {
+ return null;
+ }
+ } else {
+ return LogSequenceNumber.valueOf(result);
+ }
+ } finally {
+ if (rs != null) {
+ rs.close();
+ }
+ st.close();
+ }
+ }
+ }
+
+ private LogSequenceNumber getCurrentLSN() throws SQLException {
+ Statement st = sqlConnection.createStatement();
+ ResultSet rs = null;
+ try {
+ rs = st.executeQuery("select "
+ + (((BaseConnection) sqlConnection).haveMinimumServerVersion(ServerVersion.v10)
+ ? "pg_current_wal_lsn()" : "pg_current_xlog_location()"));
+
+ if (rs.next()) {
+ String lsn = rs.getString(1);
+ return LogSequenceNumber.valueOf(lsn);
+ } else {
+ return LogSequenceNumber.INVALID_LSN;
+ }
+ } finally {
+ if (rs != null) {
+ rs.close();
+ }
+ st.close();
+ }
+ }
+
+ private Connection openReplicationConnection() throws Exception {
+ Properties properties = new Properties();
+ PGProperty.ASSUME_MIN_SERVER_VERSION.set(properties, "9.4");
+ PGProperty.REPLICATION.set(properties, "database");
+ return TestUtil.openDB(properties);
+ }
+}
diff --git a/pgjdbc/src/test/java/org/postgresql/replication/LogicalReplicationTest.java b/pgjdbc/src/test/java/org/postgresql/replication/LogicalReplicationTest.java
new file mode 100644
index 0000000..f644191
--- /dev/null
+++ b/pgjdbc/src/test/java/org/postgresql/replication/LogicalReplicationTest.java
@@ -0,0 +1,957 @@
+/*
+ * Copyright (c) 2016, PostgreSQL Global Development Group
+ * See the LICENSE file in the project root for more information.
+ */
+
+package org.postgresql.replication;
+
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.fail;
+import static org.junit.Assume.assumeThat;
+
+import org.postgresql.PGConnection;
+import org.postgresql.PGProperty;
+import org.postgresql.core.BaseConnection;
+import org.postgresql.core.ServerVersion;
+import org.postgresql.test.TestUtil;
+import org.postgresql.test.util.rules.ServerVersionRule;
+import org.postgresql.test.util.rules.annotation.HaveMinimalServerVersion;
+import org.postgresql.util.PSQLException;
+import org.postgresql.util.PSQLState;
+
+import org.hamcrest.CoreMatchers;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+
+import java.nio.ByteBuffer;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Properties;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+
+ at HaveMinimalServerVersion("9.4")
+public class LogicalReplicationTest {
+ private static final String SLOT_NAME = "pgjdbc_logical_replication_slot";
+
+ @Rule
+ public ServerVersionRule versionRule = new ServerVersionRule();
+ @Rule
+ public ExpectedException exception = ExpectedException.none();
+
+ private Connection replConnection;
+ private Connection sqlConnection;
+
+ private static String toString(ByteBuffer buffer) {
+ int offset = buffer.arrayOffset();
+ byte[] source = buffer.array();
+ int length = source.length - offset;
+
+ return new String(source, offset, length);
+ }
+
+ @Before
+ public void setUp() throws Exception {
+ sqlConnection = TestUtil.openDB();
+ //DriverManager.setLogWriter(new PrintWriter(System.out));
+ replConnection = openReplicationConnection();
+ TestUtil.createTable(sqlConnection, "test_logic_table",
+ "pk serial primary key, name varchar(100)");
+
+ TestUtil.recreateLogicalReplicationSlot(sqlConnection, SLOT_NAME, "test_decoding");
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ replConnection.close();
+ TestUtil.dropTable(sqlConnection, "test_logic_table");
+ TestUtil.dropReplicationSlot(sqlConnection, SLOT_NAME);
+ sqlConnection.close();
+ }
+
+ @Test(timeout = 1000)
+ public void testNotAvailableStartNotExistReplicationSlot() throws Exception {
+ PGConnection pgConnection = (PGConnection) replConnection;
+
+ LogSequenceNumber lsn = getCurrentLSN();
+
+ try {
+ PGReplicationStream stream =
+ pgConnection
+ .getReplicationAPI()
+ .replicationStream()
+ .logical()
+ .withSlotName("notExistSlotName")
+ .withStartPosition(lsn)
+ .start();
+
+ fail("For logical decoding replication slot name it required parameter "
+ + "that should be create on server before start replication");
+
+ } catch (PSQLException e) {
+ String state = e.getSQLState();
+
+ assertThat("When replication slot doesn't exists, server can't start replication "
+ + "and should throw exception about it",
+ state, equalTo(PSQLState.UNDEFINED_OBJECT.getState())
+ );
+ }
+ }
+
+ @Test(timeout = 1000)
+ public void testReceiveChangesOccursBeforStartReplication() throws Exception {
+ PGConnection pgConnection = (PGConnection) replConnection;
+
+ LogSequenceNumber lsn = getCurrentLSN();
+
+ Statement st = sqlConnection.createStatement();
+ st.execute("insert into test_logic_table(name) values('previous value')");
+ st.close();
+
+ PGReplicationStream stream =
+ pgConnection
+ .getReplicationAPI()
+ .replicationStream()
+ .logical()
+ .withSlotName(SLOT_NAME)
+ .withStartPosition(lsn)
+ .withSlotOption("include-xids", false)
+ .start();
+
+ String result = group(receiveMessage(stream, 3));
+
+ String wait = group(
+ Arrays.asList(
+ "BEGIN",
+ "table public.test_logic_table: INSERT: pk[integer]:1 name[character varying]:'previous value'",
+ "COMMIT"
+ )
+ );
+
+ assertThat("Logical replication can be start from some LSN position and all changes that "
+ + "occurs between last server LSN and specified LSN position should be available to read "
+ + "via stream in correct order",
+ result, equalTo(wait)
+ );
+ }
+
+ @Test(timeout = 1000)
+ public void testReceiveChangesAfterStartReplication() throws Exception {
+ PGConnection pgConnection = (PGConnection) replConnection;
+
+ LogSequenceNumber lsn = getCurrentLSN();
+
+ PGReplicationStream stream =
+ pgConnection
+ .getReplicationAPI()
+ .replicationStream()
+ .logical()
+ .withSlotName(SLOT_NAME)
+ .withStartPosition(lsn)
+ .withSlotOption("include-xids", false)
+ .withSlotOption("skip-empty-xacts", true)
+ .start();
+
+
+ List<String> result = new ArrayList<String>();
+
+ Statement st = sqlConnection.createStatement();
+ st.execute(
+ "insert into test_logic_table(name) values('first message after start replication')");
+ st.close();
+
+ result.addAll(receiveMessage(stream, 3));
+
+ st = sqlConnection.createStatement();
+ st.execute(
+ "insert into test_logic_table(name) values('second message after start replication')");
+ st.close();
+
+ result.addAll(receiveMessage(stream, 3));
+
+ String groupedResult = group(result);
+
+ String wait = group(Arrays.asList(
+ "BEGIN",
+ "table public.test_logic_table: INSERT: pk[integer]:1 name[character varying]:'first message after start replication'",
+ "COMMIT",
+ "BEGIN",
+ "table public.test_logic_table: INSERT: pk[integer]:2 name[character varying]:'second message after start replication'",
+ "COMMIT"
+ ));
+
+ assertThat(
+ "After starting replication, from stream should be available also new changes that occurs after start replication",
+ groupedResult, equalTo(wait)
+ );
+ }
+
+ @Test(timeout = 1000)
+ public void testStartFromCurrentServerLSNWithoutSpecifyLSNExplicitly() throws Exception {
+ PGConnection pgConnection = (PGConnection) replConnection;
+
+ PGReplicationStream stream =
+ pgConnection
+ .getReplicationAPI()
+ .replicationStream()
+ .logical()
+ .withSlotName(SLOT_NAME)
+ .withSlotOption("include-xids", false)
+ .withSlotOption("skip-empty-xacts", true)
+ .start();
+
+ Statement st = sqlConnection.createStatement();
+ st.execute("insert into test_logic_table(name) values('last server message')");
+ st.close();
+
+ String result = group(receiveMessage(stream, 3));
+
+ String wait = group(Arrays.asList(
+ "BEGIN",
+ "table public.test_logic_table: INSERT: pk[integer]:1 name[character varying]:'last server message'",
+ "COMMIT"
+ ));
+
+ assertThat(
+ "When start LSN position not specify explicitly, wal should be stream from actual server position",
+ result, equalTo(wait));
+ }
+
+ @Test(timeout = 1000)
+ public void testAfterStartStreamingDBSlotStatusActive() throws Exception {
+ PGConnection pgConnection = (PGConnection) replConnection;
+
+ PGReplicationStream stream =
+ pgConnection
+ .getReplicationAPI()
+ .replicationStream()
+ .logical()
+ .withSlotName(SLOT_NAME)
+ .withSlotOption("include-xids", false)
+ .withSlotOption("skip-empty-xacts", true)
+ .start();
+
+ boolean isActive = isActiveOnView();
+
+ assertThat(
+ "After start streaming, database status should be update on view pg_replication_slots to active",
+ isActive, equalTo(true)
+ );
+ }
+
+ /**
+ * <p>Bug in postgreSQL that should be fixed in 10 version after code review patch <a
+ * href="http://www.postgresql.org/message-id/CAFgjRd3hdYOa33m69TbeOfNNer2BZbwa8FFjt2V5VFzTBvUU3w@mail.gmail.com">
+ * Stopping logical replication protocol</a>.
+ *
+ * <p>If you try to run it test on version before 10 they fail with time out, because postgresql
+ * wait new changes and until waiting messages from client ignores.
+ */
+ @Test(timeout = 1000)
+ @HaveMinimalServerVersion("11.1")
+ public void testAfterCloseReplicationStreamDBSlotStatusNotActive() throws Exception {
+ PGConnection pgConnection = (PGConnection) replConnection;
+
+ PGReplicationStream stream =
+ pgConnection
+ .getReplicationAPI()
+ .replicationStream()
+ .logical()
+ .withSlotName(SLOT_NAME)
+ .withSlotOption("include-xids", false)
+ .withSlotOption("skip-empty-xacts", true)
+ .start();
+
+ boolean isActive = isActiveOnView();
+ assumeThat(isActive, equalTo(true));
+
+ stream.close();
+
+ isActive = isActiveOnView();
+ assertThat("Execute close method on PGREplicationStream should lead to stop replication, "
+ + "as result we wait that on view pg_replication_slots status for slot will change to no active",
+ isActive, equalTo(false)
+ );
+ }
+
+ @Test(timeout = 1000)
+ public void testAfterCloseConnectionDBSLotStatusNotActive() throws Exception {
+ PGConnection pgConnection = (PGConnection) replConnection;
+
+ LogSequenceNumber lsn = getCurrentLSN();
+
+ PGReplicationStream stream =
+ pgConnection
+ .getReplicationAPI()
+ .replicationStream()
+ .logical()
+ .withSlotName(SLOT_NAME)
+ .withStartPosition(lsn)
+ .withSlotOption("include-xids", false)
+ .withSlotOption("skip-empty-xacts", true)
+ .start();
+
+ boolean isActive = isActiveOnView();
+ assumeThat(isActive, equalTo(true));
+
+ replConnection.close();
+
+ isActive = isActiveOnView();
+ //we doesn't wait replay from server about stop connection that why some delay exists on update view and should wait some time before check view
+ if (isActive) {
+ TimeUnit.MILLISECONDS.sleep(200L);
+ isActive = isActiveOnView();
+ }
+
+ assertThat(
+ "Execute close method on Connection should lead to stop replication as fast as possible, "
+ + "as result we wait that on view pg_replication_slots status for slot will change to no active",
+ isActive, equalTo(false)
+ );
+ }
+
+ /**
+ * <p>Bug in postgreSQL that should be fixed in 10 version after code review patch <a
+ * href="http://www.postgresql.org/message-id/CAFgjRd3hdYOa33m69TbeOfNNer2BZbwa8FFjt2V5VFzTBvUU3w@mail.gmail.com">
+ * Stopping logical replication protocol</a>.
+ *
+ * <p>If you try to run it test on version before 10 they fail with time out, because postgresql
+ * wait new changes and until waiting messages from client ignores.
+ */
+ @Test(timeout = 10000)
+ @HaveMinimalServerVersion("11.1")
+ public void testDuringSendBigTransactionConnectionCloseSlotStatusNotActive() throws Exception {
+ PGConnection pgConnection = (PGConnection) replConnection;
+
+ LogSequenceNumber lsn = getCurrentLSN();
+
+ Statement st = sqlConnection.createStatement();
+ st.execute("insert into test_logic_table\n"
+ + " select id, md5(random()::text) as name from generate_series(1, 200000) as id;");
+ st.close();
+
+ PGReplicationStream stream =
+ pgConnection
+ .getReplicationAPI()
+ .replicationStream()
+ .logical()
+ .withStartPosition(lsn)
+ .withSlotName(SLOT_NAME)
+ .withSlotOption("include-xids", false)
+ .withSlotOption("skip-empty-xacts", true)
+ .start();
+
+ //wait first message
+ stream.read();
+
+ replConnection.close();
+
+ boolean isActive = isActiveOnView();
+ //we doesn't wait replay from server about stop connection that why some delay exists on update view and should wait some time before check view
+ if (!isActive) {
+ TimeUnit.SECONDS.sleep(2L);
+ isActive = isActiveOnView();
+ }
+
+ assertThat(
+ "Execute close method on Connection should lead to stop replication as fast as possible, "
+ + "as result we wait that on view pg_replication_slots status for slot will change to no active",
+ isActive, equalTo(false)
+ );
+ }
+
+ /**
+ * <p>Bug in postgreSQL that should be fixed in 10 version after code review patch <a
+ * href="http://www.postgresql.org/message-id/CAFgjRd3hdYOa33m69TbeOfNNer2BZbwa8FFjt2V5VFzTBvUU3w@mail.gmail.com">
+ * Stopping logical replication protocol</a>.
+ *
+ * <p>If you try to run it test on version before 10 they fail with time out, because postgresql
+ * wait new changes and until waiting messages from client ignores.
+ */
+ @Test(timeout = 60000)
+ @HaveMinimalServerVersion("11.1")
+ public void testDuringSendBigTransactionReplicationStreamCloseNotActive() throws Exception {
+ PGConnection pgConnection = (PGConnection) replConnection;
+
+ LogSequenceNumber lsn = getCurrentLSN();
+
+ Statement st = sqlConnection.createStatement();
+ st.execute("insert into test_logic_table\n"
+ + " select id, md5(random()::text) as name from generate_series(1, 200000) as id;");
+ st.close();
+
+ PGReplicationStream stream =
+ pgConnection
+ .getReplicationAPI()
+ .replicationStream()
+ .logical()
+ .withStartPosition(lsn)
+ .withSlotName(SLOT_NAME)
+ .withSlotOption("include-xids", false)
+ .withSlotOption("skip-empty-xacts", true)
+ .start();
+
+ //wait first message
+ stream.read();
+
+ stream.close();
+ //after replay from server that replication stream stopped, view already should be updated
+ boolean isActive = isActiveOnView();
+ assertThat("Execute close method on PGREplicationStream should lead to stop replication, "
+ + "as result we wait that on view pg_replication_slots status for slot will change to no active",
+ isActive, equalTo(false)
+ );
+ }
+
+ @Test(timeout = 5000)
+ //todo fix, fail because backend for logical decoding not reply with CommandComplate & ReadyForQuery
+ public void testRepeatWalPositionTwice() throws Exception {
+ PGConnection pgConnection = (PGConnection) replConnection;
+
+ LogSequenceNumber startLSN = getCurrentLSN();
+
+ Statement st = sqlConnection.createStatement();
+ st.execute("insert into test_logic_table(name) values('message to repeat')");
+ st.close();
+
+ PGReplicationStream stream =
+ pgConnection
+ .getReplicationAPI()
+ .replicationStream()
+ .logical()
+ .withSlotName(SLOT_NAME)
+ .withStartPosition(startLSN)
+ .withSlotOption("include-xids", false)
+ .withSlotOption("skip-empty-xacts", true)
+ .start();
+
+ List<String> result = new ArrayList<String>();
+ result.addAll(receiveMessage(stream, 3));
+
+ replConnection.close();
+ waitStopReplicationSlot();
+
+ replConnection = openReplicationConnection();
+ pgConnection = (PGConnection) replConnection;
+
+ stream =
+ pgConnection
+ .getReplicationAPI()
+ .replicationStream()
+ .logical()
+ .withSlotName(SLOT_NAME)
+ .withStartPosition(startLSN)
+ .withSlotOption("include-xids", false)
+ .withSlotOption("skip-empty-xacts", true)
+ .start();
+
+ result.addAll(receiveMessage(stream, 3));
+
+ String groupedResult = group(result);
+ String wait = group(Arrays.asList(
+ "BEGIN",
+ "table public.test_logic_table: INSERT: pk[integer]:1 name[character varying]:'message to repeat'",
+ "COMMIT",
+ "BEGIN",
+ "table public.test_logic_table: INSERT: pk[integer]:1 name[character varying]:'message to repeat'",
+ "COMMIT"
+ ));
+
+ assertThat("Logical replication stream after start streaming can be close and "
+ + "reopen on previous LSN, that allow reply wal logs, if they was not recycled yet",
+ groupedResult, equalTo(wait)
+ );
+ }
+
+ @Test(timeout = 3000)
+ public void testDoesNotHavePendingMessageWhenStartFromLastLSN() throws Exception {
+ PGConnection pgConnection = (PGConnection) replConnection;
+
+ PGReplicationStream stream =
+ pgConnection
+ .getReplicationAPI()
+ .replicationStream()
+ .logical()
+ .withSlotName(SLOT_NAME)
+ .withStartPosition(getCurrentLSN())
+ .start();
+
+ ByteBuffer result = stream.readPending();
+
+ assertThat("Read pending message allow without lock on socket read message, "
+ + "and if message absent return null. In current test we start replication from last LSN on server, "
+ + "so changes absent on server and readPending message will always lead to null ByteBuffer",
+ result, equalTo(null)
+ );
+ }
+
+ @Test(timeout = 3000)
+ public void testReadPreviousChangesWithoutBlock() throws Exception {
+ PGConnection pgConnection = (PGConnection) replConnection;
+
+ LogSequenceNumber startLSN = getCurrentLSN();
+
+ Statement st = sqlConnection.createStatement();
+ st.execute("insert into test_logic_table(name) values('previous changes')");
+ st.close();
+
+ PGReplicationStream stream =
+ pgConnection
+ .getReplicationAPI()
+ .replicationStream()
+ .logical()
+ .withSlotName(SLOT_NAME)
+ .withStartPosition(startLSN)
+ .withSlotOption("include-xids", false)
+ .withSlotOption("skip-empty-xacts", true)
+ .start();
+
+ String received = group(receiveMessageWithoutBlock(stream, 3));
+
+ String wait = group(Arrays.asList(
+ "BEGIN",
+ "table public.test_logic_table: INSERT: pk[integer]:1 name[character varying]:'previous changes'",
+ "COMMIT"
+ ));
+
+ assertThat(
+ "Messages from stream can be read by readPending method for avoid long block on Socket, "
+ + "in current test we wait that behavior will be same as for read message with block",
+ received, equalTo(wait)
+ );
+ }
+
+ @Test(timeout = 3000)
+ public void testReadActualChangesWithoutBlock() throws Exception {
+ PGConnection pgConnection = (PGConnection) replConnection;
+
+ PGReplicationStream stream =
+ pgConnection
+ .getReplicationAPI()
+ .replicationStream()
+ .logical()
+ .withSlotName(SLOT_NAME)
+ .withStartPosition(getCurrentLSN())
+ .withSlotOption("include-xids", false)
+ .withSlotOption("skip-empty-xacts", true)
+ .start();
+
+ Statement st = sqlConnection.createStatement();
+ st.execute("insert into test_logic_table(name) values('actual changes')");
+ st.close();
+
+ String received = group(receiveMessageWithoutBlock(stream, 3));
+
+ String wait = group(Arrays.asList(
+ "BEGIN",
+ "table public.test_logic_table: INSERT: pk[integer]:1 name[character varying]:'actual changes'",
+ "COMMIT"
+ ));
+
+ assertThat(
+ "Messages from stream can be read by readPending method for avoid long block on Socket, "
+ + "in current test we wait that behavior will be same as for read message with block",
+ received, equalTo(wait)
+ );
+ }
+
+ @Test(timeout = 10000 /* default client keep alive 10s*/)
+ public void testAvoidTimeoutDisconnectWithDefaultStatusInterval() throws Exception {
+ final int statusInterval = getKeepAliveTimeout();
+
+ ExecutorService executor = Executors.newSingleThreadExecutor();
+ Future future = null;
+ boolean done;
+ try {
+ future =
+ executor.submit(new Callable<Object>() {
+ @Override
+ public Object call() throws Exception {
+ PGConnection pgConnection = (PGConnection) replConnection;
+
+ PGReplicationStream stream =
+ pgConnection
+ .getReplicationAPI()
+ .replicationStream()
+ .logical()
+ .withSlotName(SLOT_NAME)
+ .withStartPosition(getCurrentLSN())
+ .withStatusInterval(Math.round(statusInterval / 3), TimeUnit.MILLISECONDS)
+ .start();
+
+ while (!Thread.interrupted()) {
+ stream.read();
+ }
+
+ return null;
+ }
+ });
+
+ future.get(5, TimeUnit.SECONDS);
+ done = future.isDone();
+ } catch (TimeoutException timeout) {
+ done = future.isDone();
+ } finally {
+ executor.shutdownNow();
+ }
+
+ assertThat(
+ "ReplicationStream should periodically send keep alive message to postgresql to avoid disconnect from server",
+ done, CoreMatchers.equalTo(false)
+ );
+ }
+
+ @Test
+ public void testRestartReplicationFromRestartSlotLSNWhenFeedbackAbsent() throws Exception {
+ PGConnection pgConnection = (PGConnection) replConnection;
+
+ LogSequenceNumber startLSN = getCurrentLSN();
+
+ PGReplicationStream stream =
+ pgConnection
+ .getReplicationAPI()
+ .replicationStream()
+ .logical()
+ .withSlotName(SLOT_NAME)
+ .withStartPosition(startLSN)
+ .withSlotOption("include-xids", false)
+ .withSlotOption("skip-empty-xacts", true)
+ .start();
+
+ Statement st = sqlConnection.createStatement();
+ st.execute("insert into test_logic_table(name) values('first tx changes')");
+ st.close();
+
+ st = sqlConnection.createStatement();
+ st.execute("insert into test_logic_table(name) values('second tx change')");
+ st.close();
+
+ List<String> consumedData = new ArrayList<String>();
+ consumedData.addAll(receiveMessageWithoutBlock(stream, 3));
+
+ //emulate replication break
+ replConnection.close();
+ waitStopReplicationSlot();
+
+ replConnection = openReplicationConnection();
+ pgConnection = (PGConnection) replConnection;
+ stream =
+ pgConnection
+ .getReplicationAPI()
+ .replicationStream()
+ .logical()
+ .withSlotName(SLOT_NAME)
+ .withStartPosition(LogSequenceNumber.INVALID_LSN) /* Invalid LSN indicate for start from restart lsn */
+ .withSlotOption("include-xids", false)
+ .withSlotOption("skip-empty-xacts", true)
+ .start();
+
+ consumedData.addAll(receiveMessageWithoutBlock(stream, 3));
+ String result = group(consumedData);
+
+ String wait = group(Arrays.asList(
+ "BEGIN",
+ "table public.test_logic_table: INSERT: pk[integer]:1 name[character varying]:'first tx changes'",
+ "COMMIT",
+ "BEGIN",
+ "table public.test_logic_table: INSERT: pk[integer]:1 name[character varying]:'first tx changes'",
+ "COMMIT"
+ ));
+
+ assertThat(
+ "If was consume message via logical replication stream but wasn't send feedback about apply and flush "
+ + "consumed LSN, if replication crash, server should restart from last success apllyed lsn, "
+ + "in this case it lsn of start replication slot, so we should consume first 3 message twice",
+ result, equalTo(wait)
+ );
+ }
+
+ @Test
+ public void testReplicationRestartFromLastFeedbackPosition() throws Exception {
+ PGConnection pgConnection = (PGConnection) replConnection;
+
+ LogSequenceNumber startLSN = getCurrentLSN();
+
+ PGReplicationStream stream =
+ pgConnection
+ .getReplicationAPI()
+ .replicationStream()
+ .logical()
+ .withSlotName(SLOT_NAME)
+ .withStartPosition(startLSN)
+ .withSlotOption("include-xids", false)
+ .withSlotOption("skip-empty-xacts", true)
+ .start();
+
+ Statement st = sqlConnection.createStatement();
+ st.execute("insert into test_logic_table(name) values('first tx changes')");
+ st.close();
+
+ st = sqlConnection.createStatement();
+ st.execute("insert into test_logic_table(name) values('second tx change')");
+ st.close();
+
+ List<String> consumedData = new ArrayList<String>();
+ consumedData.addAll(receiveMessageWithoutBlock(stream, 3));
+ stream.setFlushedLSN(stream.getLastReceiveLSN());
+ stream.setAppliedLSN(stream.getLastReceiveLSN());
+ stream.forceUpdateStatus();
+
+ //emulate replication break
+ replConnection.close();
+ waitStopReplicationSlot();
+
+ replConnection = openReplicationConnection();
+ pgConnection = (PGConnection) replConnection;
+ stream =
+ pgConnection
+ .getReplicationAPI()
+ .replicationStream()
+ .logical()
+ .withSlotName(SLOT_NAME)
+ .withStartPosition(LogSequenceNumber.INVALID_LSN) /* Invalid LSN indicate for start from restart lsn */
+ .withSlotOption("include-xids", false)
+ .withSlotOption("skip-empty-xacts", true)
+ .start();
+
+ consumedData.addAll(receiveMessageWithoutBlock(stream, 3));
+ String result = group(consumedData);
+
+
+ String wait = group(Arrays.asList(
+ "BEGIN",
+ "table public.test_logic_table: INSERT: pk[integer]:1 name[character varying]:'first tx changes'",
+ "COMMIT",
+ "BEGIN",
+ "table public.test_logic_table: INSERT: pk[integer]:2 name[character varying]:'second tx change'",
+ "COMMIT"
+ ));
+
+ assertThat(
+ "When we add feedback about applied lsn to replication stream(in this case it's force update status)"
+ + "after restart consume changes via this slot should be started from last success lsn that "
+ + "we send before via force status update, that why we wait consume both transaction without duplicates",
+ result, equalTo(wait));
+ }
+
+ @Test
+ public void testReplicationRestartFromLastFeedbackPositionParallelTransaction() throws Exception {
+ PGConnection pgConnection = (PGConnection) replConnection;
+
+ LogSequenceNumber startLSN = getCurrentLSN();
+
+ PGReplicationStream stream =
+ pgConnection
+ .getReplicationAPI()
+ .replicationStream()
+ .logical()
+ .withSlotName(SLOT_NAME)
+ .withStartPosition(startLSN)
+ .withSlotOption("include-xids", false)
+ .withSlotOption("skip-empty-xacts", true)
+ .start();
+
+ Connection tx1Connection = TestUtil.openDB();
+ tx1Connection.setAutoCommit(false);
+
+ Connection tx2Connection = TestUtil.openDB();
+ tx2Connection.setAutoCommit(false);
+
+ Statement stTx1 = tx1Connection.createStatement();
+ Statement stTx2 = tx2Connection.createStatement();
+
+ stTx1.execute("BEGIN");
+ stTx2.execute("BEGIN");
+
+ stTx1.execute("insert into test_logic_table(name) values('first tx changes')");
+ stTx2.execute("insert into test_logic_table(name) values('second tx changes')");
+
+ tx1Connection.commit();
+ tx2Connection.commit();
+
+ tx1Connection.close();
+ tx2Connection.close();
+
+ List<String> consumedData = new ArrayList<String>();
+ consumedData.addAll(receiveMessageWithoutBlock(stream, 3));
+ stream.setFlushedLSN(stream.getLastReceiveLSN());
+ stream.setAppliedLSN(stream.getLastReceiveLSN());
+
+ stream.forceUpdateStatus();
+
+ //emulate replication break
+ replConnection.close();
+ waitStopReplicationSlot();
+
+ replConnection = openReplicationConnection();
+ pgConnection = (PGConnection) replConnection;
+ stream =
+ pgConnection
+ .getReplicationAPI()
+ .replicationStream()
+ .logical()
+ .withSlotName(SLOT_NAME)
+ .withStartPosition(LogSequenceNumber.INVALID_LSN) /* Invalid LSN indicate for start from restart lsn */
+ .withSlotOption("include-xids", false)
+ .withSlotOption("skip-empty-xacts", true)
+ .start();
+
+ Statement st = sqlConnection.createStatement();
+ st.execute("insert into test_logic_table(name) values('third tx changes')");
+ st.close();
+
+ consumedData.addAll(receiveMessageWithoutBlock(stream, 3));
+ String result = group(consumedData);
+
+ String wait = group(Arrays.asList(
+ "BEGIN",
+ "table public.test_logic_table: INSERT: pk[integer]:1 name[character varying]:'first tx changes'",
+ "COMMIT",
+ "BEGIN",
+ "table public.test_logic_table: INSERT: pk[integer]:2 name[character varying]:'second tx changes'",
+ "COMMIT"
+ ));
+
+ assertThat(
+ "When we add feedback about applied lsn to replication stream(in this case it's force update status)"
+ + "after restart consume changes via this slot should be started from last success lsn that "
+ + "we send before via force status update, that why we wait consume both transaction without duplicates",
+ result, equalTo(wait));
+ }
+
+ private void waitStopReplicationSlot() throws SQLException, InterruptedException {
+ while (true) {
+ PreparedStatement statement =
+ sqlConnection.prepareStatement(
+ "select 1 from pg_replication_slots where slot_name = ? and active = true"
+ );
+ statement.setString(1, SLOT_NAME);
+ ResultSet rs = statement.executeQuery();
+ boolean active = rs.next();
+ rs.close();
+ statement.close();
+
+ if (!active) {
+ return;
+ }
+
+ TimeUnit.MILLISECONDS.sleep(10);
+ }
+ }
+
+ private int getKeepAliveTimeout() throws SQLException {
+ Statement statement = sqlConnection.createStatement();
+ ResultSet resultSet = statement.executeQuery(
+ "select setting, unit from pg_settings where name = 'wal_sender_timeout'");
+ int result = 0;
+ if (resultSet.next()) {
+ result = resultSet.getInt(1);
+ String unit = resultSet.getString(2);
+ if ("sec".equals(unit)) {
+ result = (int) TimeUnit.SECONDS.toMillis(result);
+ }
+ }
+
+ return result;
+ }
+
+ private boolean isActiveOnView() throws SQLException {
+ boolean result = false;
+ Statement st = sqlConnection.createStatement();
+ ResultSet rs =
+ st.executeQuery("select * from pg_replication_slots where slot_name = '" + SLOT_NAME + "'");
+ if (rs.next()) {
+ result = rs.getBoolean("active");
+ }
+ rs.close();
+ st.close();
+ return result;
+ }
+
+ private String group(List<String> messages) {
+ StringBuilder builder = new StringBuilder();
+ boolean isFirst = true;
+ for (String str : messages) {
+ if (isFirst) {
+ isFirst = false;
+ } else {
+ builder.append("\n");
+ }
+
+ builder.append(str);
+ }
+
+ return builder.toString();
+ }
+
+ private List<String> receiveMessage(PGReplicationStream stream, int count) throws SQLException {
+ List<String> result = new ArrayList<String>(count);
+ for (int index = 0; index < count; index++) {
+ result.add(toString(stream.read()));
+ }
+
+ return result;
+ }
+
+ private List<String> receiveMessageWithoutBlock(PGReplicationStream stream, int count)
+ throws Exception {
+ List<String> result = new ArrayList<String>(3);
+ for (int index = 0; index < count; index++) {
+ ByteBuffer message;
+ do {
+ message = stream.readPending();
+
+ if (message == null) {
+ TimeUnit.MILLISECONDS.sleep(2);
+ }
+ } while (message == null);
+
+ result.add(toString(message));
+ }
+
+ return result;
+ }
+
+ private LogSequenceNumber getCurrentLSN() throws SQLException {
+ Statement st = sqlConnection.createStatement();
+ ResultSet rs = null;
+ try {
+ rs = st.executeQuery("select "
+ + (((BaseConnection) sqlConnection).haveMinimumServerVersion(ServerVersion.v10)
+ ? "pg_current_wal_lsn()" : "pg_current_xlog_location()"));
+
+ if (rs.next()) {
+ String lsn = rs.getString(1);
+ return LogSequenceNumber.valueOf(lsn);
+ } else {
+ return LogSequenceNumber.INVALID_LSN;
+ }
+ } finally {
+ if (rs != null) {
+ rs.close();
+ }
+ st.close();
+ }
+ }
+
+ private Connection openReplicationConnection() throws Exception {
+ Properties properties = new Properties();
+ PGProperty.ASSUME_MIN_SERVER_VERSION.set(properties, "9.4");
+ PGProperty.REPLICATION.set(properties, "database");
+ return TestUtil.openDB(properties);
+ }
+}
diff --git a/pgjdbc/src/test/java/org/postgresql/replication/PhysicalReplicationTest.java b/pgjdbc/src/test/java/org/postgresql/replication/PhysicalReplicationTest.java
new file mode 100644
index 0000000..e6664de
--- /dev/null
+++ b/pgjdbc/src/test/java/org/postgresql/replication/PhysicalReplicationTest.java
@@ -0,0 +1,304 @@
+/*
+ * Copyright (c) 2016, PostgreSQL Global Development Group
+ * See the LICENSE file in the project root for more information.
+ */
+
+package org.postgresql.replication;
+
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.Assume.assumeThat;
+
+import org.postgresql.PGConnection;
+import org.postgresql.PGProperty;
+import org.postgresql.core.BaseConnection;
+import org.postgresql.core.ServerVersion;
+import org.postgresql.test.TestUtil;
+import org.postgresql.test.util.rules.ServerVersionRule;
+import org.postgresql.test.util.rules.annotation.HaveMinimalServerVersion;
+
+import org.hamcrest.CoreMatchers;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+
+import java.nio.ByteBuffer;
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.Arrays;
+import java.util.Properties;
+
+ at HaveMinimalServerVersion("9.4")
+public class PhysicalReplicationTest {
+
+ private static final String SLOT_NAME = "pgjdbc_physical_replication_slot";
+
+ @Rule
+ public ServerVersionRule versionRule = new ServerVersionRule();
+
+ private Connection replConnection;
+ private Connection sqlConnection;
+
+ @Before
+ public void setUp() throws Exception {
+ sqlConnection = TestUtil.openDB();
+ //DriverManager.setLogWriter(new PrintWriter(System.out));
+ replConnection = openReplicationConnection();
+ TestUtil.createTable(sqlConnection, "test_physic_table",
+ "pk serial primary key, name varchar(100)");
+ TestUtil.recreatePhysicalReplicationSlot(sqlConnection, SLOT_NAME);
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ replConnection.close();
+ TestUtil.dropTable(sqlConnection, "test_physic_table");
+ TestUtil.dropReplicationSlot(sqlConnection, SLOT_NAME);
+ sqlConnection.close();
+ }
+
+ @Test
+ public void testReceiveChangesWithoutReplicationSlot() throws Exception {
+ PGConnection pgConnection = (PGConnection) replConnection;
+
+ LogSequenceNumber lsn = getCurrentLSN();
+
+ Statement st = sqlConnection.createStatement();
+ st.execute("insert into test_physic_table(name) values('previous value')");
+ st.close();
+
+ PGReplicationStream stream =
+ pgConnection
+ .getReplicationAPI()
+ .replicationStream()
+ .physical()
+ .withStartPosition(lsn)
+ .start();
+
+ ByteBuffer read = stream.read();
+
+ assertThat("Physical replication can be start without replication slot",
+ read, CoreMatchers.notNullValue()
+ );
+ }
+
+ @Test
+ public void testReceiveChangesWithReplicationSlot() throws Exception {
+ PGConnection pgConnection = (PGConnection) replConnection;
+
+ LogSequenceNumber lsn = getCurrentLSN();
+
+ Statement st = sqlConnection.createStatement();
+ st.execute("insert into test_physic_table(name) values('previous value')");
+ st.close();
+
+ PGReplicationStream stream =
+ pgConnection
+ .getReplicationAPI()
+ .replicationStream()
+ .physical()
+ .withSlotName(SLOT_NAME)
+ .withStartPosition(lsn)
+ .start();
+
+ ByteBuffer read = stream.read();
+
+ assertThat(read, CoreMatchers.notNullValue());
+ }
+
+ @Test
+ public void testAfterStartStreamingDBSlotStatusActive() throws Exception {
+ PGConnection pgConnection = (PGConnection) replConnection;
+
+ LogSequenceNumber lsn = getCurrentLSN();
+
+ PGReplicationStream stream =
+ pgConnection
+ .getReplicationAPI()
+ .replicationStream()
+ .physical()
+ .withSlotName(SLOT_NAME)
+ .withStartPosition(lsn)
+ .start();
+
+ boolean isActive = isActiveOnView();
+ stream.close();
+
+ Assert.assertThat(
+ "After start streaming, database status should be update on view pg_replication_slots to active",
+ isActive, equalTo(true)
+ );
+ }
+
+ @Test
+ public void testAfterCloseReplicationStreamDBSlotStatusNotActive() throws Exception {
+ PGConnection pgConnection = (PGConnection) replConnection;
+
+ LogSequenceNumber lsn = getCurrentLSN();
+
+ PGReplicationStream stream =
+ pgConnection
+ .getReplicationAPI()
+ .replicationStream()
+ .physical()
+ .withSlotName(SLOT_NAME)
+ .withStartPosition(lsn)
+ .start();
+
+ boolean isActive = isActiveOnView();
+ assumeThat(isActive, equalTo(true));
+
+ stream.close();
+
+ isActive = isActiveOnView();
+ Assert.assertThat(
+ "Execute close method on PGREplicationStream should lead to stop replication, "
+ + "as result we wait that on view pg_replication_slots status for slot will change to no active",
+ isActive, equalTo(false)
+ );
+ }
+
+ @Test
+ public void testWalRecordCanBeRepeatBeRestartReplication() throws Exception {
+ PGConnection pgConnection = (PGConnection) replConnection;
+
+ LogSequenceNumber lsn = getCurrentLSN();
+
+ Statement st = sqlConnection.createStatement();
+ st.execute("insert into test_physic_table(name) values('previous value')");
+ st.close();
+
+ PGReplicationStream stream =
+ pgConnection
+ .getReplicationAPI()
+ .replicationStream()
+ .physical()
+ .withSlotName(SLOT_NAME)
+ .withStartPosition(lsn)
+ .start();
+
+ byte[] first = toByteArray(stream.read());
+ stream.close();
+
+ //reopen stream
+ stream =
+ pgConnection
+ .getReplicationAPI()
+ .replicationStream()
+ .physical()
+ .withSlotName(SLOT_NAME)
+ .withStartPosition(lsn)
+ .start();
+
+ byte[] second = toByteArray(stream.read());
+ stream.close();
+
+ boolean arrayEquals = Arrays.equals(first, second);
+ assertThat("On same replication connection we can restart replication from already "
+ + "received LSN if they not recycled yet on backend",
+ arrayEquals, CoreMatchers.equalTo(true)
+ );
+ }
+
+ @Test
+ public void restartPhysicalReplicationWithoutRepeatMessage() throws Exception {
+ PGConnection pgConnection = (PGConnection) replConnection;
+
+ LogSequenceNumber lsn = getCurrentLSN();
+
+ Statement st = sqlConnection.createStatement();
+ st.execute("insert into test_physic_table(name) values('first value')");
+ st.close();
+
+ PGReplicationStream stream =
+ pgConnection
+ .getReplicationAPI()
+ .replicationStream()
+ .physical()
+ .withSlotName(SLOT_NAME)
+ .withStartPosition(lsn)
+ .start();
+
+ byte[] streamOneFirstPart = toByteArray(stream.read());
+ LogSequenceNumber restartLSN = stream.getLastReceiveLSN();
+
+ st = sqlConnection.createStatement();
+ st.execute("insert into test_physic_table(name) values('second value')");
+ st.close();
+
+ byte[] streamOneSecondPart = toByteArray(stream.read());
+ stream.close();
+
+ //reopen stream
+ stream =
+ pgConnection
+ .getReplicationAPI()
+ .replicationStream()
+ .physical()
+ .withSlotName(SLOT_NAME)
+ .withStartPosition(restartLSN)
+ .start();
+
+ byte[] streamTwoFirstPart = toByteArray(stream.read());
+ stream.close();
+
+ boolean arrayEquals = Arrays.equals(streamOneSecondPart, streamTwoFirstPart);
+ assertThat("Interrupt physical replication and restart from lastReceiveLSN should not "
+ + "lead to repeat messages skip part of them",
+ arrayEquals, CoreMatchers.equalTo(true)
+ );
+ }
+
+ private boolean isActiveOnView() throws SQLException {
+ boolean result = false;
+ Statement st = sqlConnection.createStatement();
+ ResultSet
+ rs =
+ st.executeQuery("select * from pg_replication_slots where slot_name = '" + SLOT_NAME + "'");
+ if (rs.next()) {
+ result = rs.getBoolean("active");
+ }
+ rs.close();
+ st.close();
+ return result;
+ }
+
+ private byte[] toByteArray(ByteBuffer buffer) {
+ int offset = buffer.arrayOffset();
+ byte[] source = buffer.array();
+ return Arrays.copyOfRange(source, offset, source.length);
+ }
+
+ private LogSequenceNumber getCurrentLSN() throws SQLException {
+ Statement st = sqlConnection.createStatement();
+ ResultSet rs = null;
+ try {
+ rs = st.executeQuery("select "
+ + (((BaseConnection) sqlConnection).haveMinimumServerVersion(ServerVersion.v10)
+ ? "pg_current_wal_lsn()" : "pg_current_xlog_location()"));
+
+ if (rs.next()) {
+ String lsn = rs.getString(1);
+ return LogSequenceNumber.valueOf(lsn);
+ } else {
+ return LogSequenceNumber.INVALID_LSN;
+ }
+ } finally {
+ if (rs != null) {
+ rs.close();
+ }
+ st.close();
+ }
+ }
+
+ private Connection openReplicationConnection() throws Exception {
+ Properties properties = new Properties();
+ PGProperty.ASSUME_MIN_SERVER_VERSION.set(properties, "9.4");
+ PGProperty.REPLICATION.set(properties, "database");
+ return TestUtil.openDB(properties);
+ }
+}
diff --git a/pgjdbc/src/test/java/org/postgresql/replication/ReplicationConnectionTest.java b/pgjdbc/src/test/java/org/postgresql/replication/ReplicationConnectionTest.java
new file mode 100644
index 0000000..6a35298
--- /dev/null
+++ b/pgjdbc/src/test/java/org/postgresql/replication/ReplicationConnectionTest.java
@@ -0,0 +1,121 @@
+/*
+ * Copyright (c) 2016, PostgreSQL Global Development Group
+ * See the LICENSE file in the project root for more information.
+ */
+
+package org.postgresql.replication;
+
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+import org.postgresql.PGConnection;
+import org.postgresql.PGProperty;
+import org.postgresql.test.TestUtil;
+import org.postgresql.test.util.rules.annotation.HaveMinimalServerVersion;
+
+import org.hamcrest.CoreMatchers;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.Statement;
+import java.util.Properties;
+
+ at HaveMinimalServerVersion("9.4")
+public class ReplicationConnectionTest {
+
+ private Connection replConnection;
+
+ @Before
+ public void setUp() throws Exception {
+ replConnection = openReplicationConnection();
+ //DriverManager.setLogWriter(new PrintWriter(System.out));
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ replConnection.close();
+ }
+
+ @Test
+ public void testIsValid() throws Exception {
+ boolean result = replConnection.isValid(3);
+
+ PGConnection connection = (PGConnection) replConnection;
+ connection.getBackendPID();
+
+ assertThat("Replication connection as Simple connection can be check on valid",
+ result, equalTo(true)
+ );
+ }
+
+ @Test
+ public void testConnectionNotValidWhenSessionTerminated() throws Exception {
+ int backendId = ((PGConnection) replConnection).getBackendPID();
+
+ Connection sqlConnection = TestUtil.openDB();
+
+ Statement terminateStatement = sqlConnection.createStatement();
+ terminateStatement.execute("SELECT pg_terminate_backend(" + backendId + ")");
+ terminateStatement.close();
+ sqlConnection.close();
+
+ boolean result = replConnection.isValid(3);
+
+ assertThat("When postgresql terminate session with replication connection, "
+ + "isValid methos should return false, because next query on this connection will fail",
+ result, equalTo(false)
+ );
+ }
+
+ @Test
+ public void testReplicationCommandResultSetAccessByIndex() throws Exception {
+ Statement statement = replConnection.createStatement();
+ ResultSet resultSet = statement.executeQuery("IDENTIFY_SYSTEM");
+
+ String xlogpos = null;
+ if (resultSet.next()) {
+ xlogpos = resultSet.getString(3);
+ }
+
+ resultSet.close();
+ statement.close();
+
+ assertThat("Replication protocol supports a limited number of commands, "
+ + "and it command can be execute via Statement(simple query protocol), "
+ + "and result fetch via ResultSet",
+ xlogpos, CoreMatchers.notNullValue()
+ );
+ }
+
+ @Test
+ public void testReplicationCommandResultSetAccessByName() throws Exception {
+ Statement statement = replConnection.createStatement();
+ ResultSet resultSet = statement.executeQuery("IDENTIFY_SYSTEM");
+
+ String xlogpos = null;
+ if (resultSet.next()) {
+ xlogpos = resultSet.getString("xlogpos");
+ }
+
+ resultSet.close();
+ statement.close();
+
+ assertThat("Replication protocol supports a limited number of commands, "
+ + "and it command can be execute via Statement(simple query protocol), "
+ + "and result fetch via ResultSet",
+ xlogpos, CoreMatchers.notNullValue()
+ );
+ }
+
+ private Connection openReplicationConnection() throws Exception {
+ Properties properties = new Properties();
+ PGProperty.ASSUME_MIN_SERVER_VERSION.set(properties, "9.4");
+ PGProperty.REPLICATION.set(properties, "database");
+ //Only symple query protocol available for replication connection
+ PGProperty.PREFER_QUERY_MODE.set(properties, "simple");
+ return TestUtil.openDB(properties);
+ }
+}
diff --git a/pgjdbc/src/test/java/org/postgresql/replication/ReplicationSlotTest.java b/pgjdbc/src/test/java/org/postgresql/replication/ReplicationSlotTest.java
new file mode 100644
index 0000000..2e9b1d7
--- /dev/null
+++ b/pgjdbc/src/test/java/org/postgresql/replication/ReplicationSlotTest.java
@@ -0,0 +1,223 @@
+/*
+ * Copyright (c) 2016, PostgreSQL Global Development Group
+ * See the LICENSE file in the project root for more information.
+ */
+
+package org.postgresql.replication;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.Assert.fail;
+
+import org.postgresql.PGConnection;
+import org.postgresql.PGProperty;
+import org.postgresql.test.TestUtil;
+import org.postgresql.test.util.rules.ServerVersionRule;
+import org.postgresql.test.util.rules.annotation.HaveMinimalServerVersion;
+
+import org.hamcrest.CoreMatchers;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.Properties;
+
+ at HaveMinimalServerVersion("9.4")
+public class ReplicationSlotTest {
+ @Rule
+ public ServerVersionRule versionRule = new ServerVersionRule();
+
+ private Connection sqlConnection;
+ private Connection replConnection;
+
+ private String slotName;
+
+ @Before
+ public void setUp() throws Exception {
+ sqlConnection = TestUtil.openDB();
+ replConnection = openReplicationConnection();
+ //DriverManager.setLogWriter(new PrintWriter(System.out));
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ replConnection.close();
+ dropReplicationSlot();
+ slotName = null;
+ sqlConnection.close();
+ }
+
+
+ @Test(expected = IllegalArgumentException.class)
+ public void testNotAvailableCreatePhysicalSlotWithoutSlotName() throws Exception {
+ PGConnection pgConnection = (PGConnection) replConnection;
+
+ pgConnection
+ .getReplicationAPI()
+ .createReplicationSlot()
+ .physical()
+ .make();
+
+ fail("Replication slot name it required parameter and can't be null");
+ }
+
+ @Test
+ public void testCreatePhysicalSlot() throws Exception {
+ PGConnection pgConnection = (PGConnection) replConnection;
+
+ slotName = "pgjdbc_test_create_physical_replication_slot";
+
+ pgConnection
+ .getReplicationAPI()
+ .createReplicationSlot()
+ .physical()
+ .withSlotName(slotName)
+ .make();
+
+ boolean result = isPhysicalSlotExists(slotName);
+
+ assertThat(result, CoreMatchers.equalTo(true));
+ }
+
+ @Test
+ public void testDropPhysicalSlot() throws Exception {
+ PGConnection pgConnection = (PGConnection) replConnection;
+
+ slotName = "pgjdbc_test_create_physical_replication_slot";
+
+ pgConnection
+ .getReplicationAPI()
+ .createReplicationSlot()
+ .physical()
+ .withSlotName(slotName)
+ .make();
+
+ pgConnection
+ .getReplicationAPI()
+ .dropReplicationSlot(slotName);
+
+ boolean result = isPhysicalSlotExists(slotName);
+
+ slotName = null;
+
+ assertThat(result, CoreMatchers.equalTo(false));
+ }
+
+ @Test(expected = IllegalArgumentException.class)
+ public void testNotAvailableCreateLogicalSlotWithoutSlotName() throws Exception {
+ PGConnection pgConnection = (PGConnection) replConnection;
+
+ pgConnection
+ .getReplicationAPI()
+ .createReplicationSlot()
+ .logical()
+ .withOutputPlugin("test_decoding")
+ .make();
+
+ fail("Replication slot name it required parameter and can't be null");
+ }
+
+ @Test(expected = IllegalArgumentException.class)
+ public void testNotAvailableCreateLogicalSlotWithoutOutputPlugin() throws Exception {
+ PGConnection pgConnection = (PGConnection) replConnection;
+
+ pgConnection
+ .getReplicationAPI()
+ .createReplicationSlot()
+ .logical()
+ .withSlotName("pgjdbc_test_create_logical_replication_slot")
+ .make();
+
+ fail("output plugin required parameter for logical replication slot and can't be null");
+ }
+
+ @Test
+ public void testCreateLogicalSlot() throws Exception {
+ PGConnection pgConnection = (PGConnection) replConnection;
+
+ slotName = "pgjdbc_test_create_logical_replication_slot";
+
+ pgConnection
+ .getReplicationAPI()
+ .createReplicationSlot()
+ .logical()
+ .withSlotName(slotName)
+ .withOutputPlugin("test_decoding")
+ .make();
+
+ boolean result = isLogicalSlotExists(slotName);
+
+ assertThat(result, CoreMatchers.equalTo(true));
+ }
+
+ @Test
+ public void testDropLogicalSlot() throws Exception {
+ PGConnection pgConnection = (PGConnection) replConnection;
+
+ slotName = "pgjdbc_test_create_logical_replication_slot";
+
+ pgConnection
+ .getReplicationAPI()
+ .createReplicationSlot()
+ .logical()
+ .withSlotName(slotName)
+ .withOutputPlugin("test_decoding")
+ .make();
+
+ pgConnection
+ .getReplicationAPI()
+ .dropReplicationSlot(slotName);
+
+ boolean result = isLogicalSlotExists(slotName);
+
+ slotName = null;
+
+ assertThat(result, CoreMatchers.equalTo(false));
+ }
+
+ private boolean isPhysicalSlotExists(String slotName) throws SQLException {
+ boolean result;
+
+ Statement st = sqlConnection.createStatement();
+ ResultSet resultSet = st.executeQuery(
+ "select * from pg_replication_slots where slot_name = '" + slotName
+ + "' and slot_type = 'physical'");
+ result = resultSet.next();
+ resultSet.close();
+ st.close();
+ return result;
+ }
+
+ private boolean isLogicalSlotExists(String slotName) throws SQLException {
+ boolean result;
+
+ Statement st = sqlConnection.createStatement();
+ ResultSet resultSet = st.executeQuery(
+ "select 1 from pg_replication_slots where slot_name = '" + slotName
+ + "' and slot_type = 'logical'");
+ result = resultSet.next();
+ resultSet.close();
+ st.close();
+ return result;
+ }
+
+ private void dropReplicationSlot() throws Exception {
+ if (slotName != null) {
+ TestUtil.dropReplicationSlot(sqlConnection, slotName);
+ }
+ }
+
+
+ private Connection openReplicationConnection() throws Exception {
+ Properties properties = new Properties();
+ PGProperty.ASSUME_MIN_SERVER_VERSION.set(properties, "9.4");
+ PGProperty.REPLICATION.set(properties, "database");
+ //Only symple query protocol available for replication connection
+ PGProperty.PREFER_QUERY_MODE.set(properties, "simple");
+ return TestUtil.openDB(properties);
+ }
+}
diff --git a/pgjdbc/src/test/java/org/postgresql/replication/ReplicationTestSuite.java b/pgjdbc/src/test/java/org/postgresql/replication/ReplicationTestSuite.java
new file mode 100644
index 0000000..27bbb0a
--- /dev/null
+++ b/pgjdbc/src/test/java/org/postgresql/replication/ReplicationTestSuite.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright (c) 2016, PostgreSQL Global Development Group
+ * See the LICENSE file in the project root for more information.
+ */
+
+package org.postgresql.replication;
+
+import org.postgresql.core.ServerVersion;
+import org.postgresql.test.TestUtil;
+import org.postgresql.test.jdbc2.CopyBothResponseTest;
+
+import org.junit.AssumptionViolatedException;
+import org.junit.BeforeClass;
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+
+ at RunWith(Suite.class)
+ at Suite.SuiteClasses({
+ CopyBothResponseTest.class,
+ LogicalReplicationTest.class,
+ LogSequenceNumberTest.class,
+ PhysicalReplicationTest.class,
+ LogicalReplicationStatusTest.class,
+ ReplicationConnectionTest.class,
+ ReplicationSlotTest.class})
+public class ReplicationTestSuite {
+
+ @BeforeClass
+ public static void setUp() throws Exception {
+ Connection connection = TestUtil.openDB();
+ try {
+ if (TestUtil.haveMinimumServerVersion(connection, ServerVersion.v9_0)) {
+ assumeWalSenderEnabled(connection);
+ assumeReplicationRole(connection);
+ } else {
+ throw new AssumptionViolatedException(
+ "Skip replication test because current database version "
+ + "too old and don't contain replication API"
+ );
+ }
+ } finally {
+ connection.close();
+ }
+ }
+
+ private static void assumeWalSenderEnabled(Connection connection) throws SQLException {
+ Statement stmt = connection.createStatement();
+ ResultSet rs = stmt.executeQuery("SHOW max_wal_senders");
+ rs.next();
+ int maxWalSenders = rs.getInt(1);
+ rs.close();
+ stmt.close();
+
+ if (maxWalSenders == 0) {
+ throw new AssumptionViolatedException(
+ "Skip replication test because max_wal_senders = 0");
+ }
+ }
+
+ private static void assumeReplicationRole(Connection connection) throws SQLException {
+ Statement stmt = connection.createStatement();
+ ResultSet rs =
+ stmt.executeQuery("SELECT usename, userepl FROM pg_user WHERE usename = current_user");
+ rs.next();
+ String userName = rs.getString(1);
+ boolean replicationGrant = rs.getBoolean(2);
+ rs.close();
+ stmt.close();
+
+ if (!replicationGrant) {
+ throw new AssumptionViolatedException(
+ "Skip replication test because user '" + userName + "' doesn't have replication role");
+ }
+ }
+}
diff --git a/pgjdbc/src/test/java/org/postgresql/test/CursorFetchBinaryTest.java b/pgjdbc/src/test/java/org/postgresql/test/CursorFetchBinaryTest.java
deleted file mode 100644
index cead0e7..0000000
--- a/pgjdbc/src/test/java/org/postgresql/test/CursorFetchBinaryTest.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Copyright (c) 2003, PostgreSQL Global Development Group
- * See the LICENSE file in the project root for more information.
- */
-
-package org.postgresql.test;
-
-import org.postgresql.test.jdbc2.CursorFetchTest;
-
-import java.util.Properties;
-
-public class CursorFetchBinaryTest extends CursorFetchTest {
- public CursorFetchBinaryTest(String name) {
- super(name);
- }
-
- @Override
- protected void updateProperties(Properties props) {
- forceBinary(props);
- }
-}
diff --git a/pgjdbc/src/test/java/org/postgresql/test/README.md b/pgjdbc/src/test/java/org/postgresql/test/README.md
index 8d86dec..adb8210 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/README.md
+++ b/pgjdbc/src/test/java/org/postgresql/test/README.md
@@ -104,12 +104,11 @@ In your test method you can use the fixture that is setup for it
by the test case.
If you decide to add a new test case, you should do two things:
-1) Add a class that extends junit.framework.TestCase. It should
+1) Add a test class. It should
contain setUp() and tearDown() methods that create and destroy
the fixture respectively.
2) Edit $JDBC_SRC/org/postgresql/test/jdbc2/Jdbc2TestSuite.java or
-$JDBC_SRC/org/postgresql/test/jdbc3/Jdbc3TestSuite.java and add a
-suite.addTestSuite() call for your class. This will make the test case
+$JDBC_SRC/org/postgresql/test/jdbc3/Jdbc3TestSuite.java and add your class. This will make the test case
part of the test suite.
6 Guidelines for developing new tests
@@ -123,20 +122,16 @@ The recommended pattern for creating and dropping tables can be
found in the example in section 7 below.
Please note that JUnit provides several convenience methods to
-check for conditions. See the TestCase class in the Javadoc
+check for conditions. See the Assert class in the Javadoc
documentation of JUnit, which is installed on your system. For
example, you can compare two integers using
-TestCase.assertEquals(int expected, int actual). This method
+Assert.assertEquals(int expected, int actual). This method
will print both values in case of a failure.
-To simply report a failure use TestCase.fail().
+To simply report a failure use Assert.fail().
The JUnit FAQ explains how to test for a thrown exception.
-Avoid the use of the deprecated TestCase.assert(), since it
-collides with the new assert keyword in the Java 2 platform
-version 1.4.
-
As a rule, the test suite should succeed. Any errors or failures
- which may be caused by bugs in the JDBC driver, the backend or
the test suite - should be fixed ASAP. Don't let a test fail
@@ -155,23 +150,26 @@ behaviour or the intended implementation of a feature?
----------------------
package org.postgresql.test.jdbc2;
+import static org.junit.Assert.assertNotNull;
+
import org.postgresql.test.TestUtil;
-import junit.framework.TestCase;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
import java.sql.*;
/*
* Test case for ...
*/
-public class FooTest extends TestCase {
+public class FooTest {
private Connection con;
private Statement stmt;
- public FooTest(String name) {
- super(name);
- }
-
- protected void setUp() throws Exception {
+ @Before
+ public void setUp() throws Exception {
con = TestUtil.openDB();
stmt = con.createStatement();
@@ -194,7 +192,8 @@ public class FooTest extends TestCase {
// the use of transactions.
}
- protected void tearDown() throws Exception {
+ @After
+ public void tearDown() throws Exception {
con.setAutoCommit(true);
if (stmt != null) {
stmt.executeUpdate("DROP TABLE testfoo");
@@ -205,8 +204,9 @@ public class FooTest extends TestCase {
}
}
+ @Test
public void testFoo() {
- // Use the assert methods in junit.framework.TestCase
+ // Use the assert methods in import org.junit.Assert
// for the actual tests
// Just some silly examples
@@ -216,12 +216,21 @@ public class FooTest extends TestCase {
}
}
+ @Test
public void testBar() {
// Another test.
}
}
-8. Running the JDBC 2 test suite from Sun against PostgreSQL
+8 ssltests
+----------------
+- requires ssl to be turned on in the database 'postgresql.conf ssl=true'
+- pg_hba.conf requires entries for hostssl, and hostnossl
+- contrib module sslinfo needs to be installed in the databases
+- databases certdb, hostdb, hostnossldb, hostssldb, and hostsslcertdb need to be created
+
+
+9 Running the JDBC 2 test suite from Sun against PostgreSQL
------------------------------------------------------------
Download the test suite from
http://java.sun.com/products/jdbc/jdbctestsuite-1_2_1.html
@@ -294,7 +303,7 @@ This is the JDBC 2 test suite that includes J2EE requirements.
At the time of writing of this document, a great number of tests
in this test suite fail.
-9 Credits, feedback
+10 Credits, feedback
-------------------
The parts of this document describing the PostgreSQL test suite
were originally written by Rene Pijlman. Liam Stewart contributed
diff --git a/pgjdbc/src/test/java/org/postgresql/test/TestUtil.java b/pgjdbc/src/test/java/org/postgresql/test/TestUtil.java
index c733a2a..6ee44b1 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/TestUtil.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/TestUtil.java
@@ -23,6 +23,8 @@ import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
/**
* Utility class for JDBC tests
@@ -36,6 +38,16 @@ public class TestUtil {
}
public static String getURL(String server, int port) {
+ String logLevel = "";
+ if (getLogLevel() != null && !getLogLevel().equals("")) {
+ logLevel = "&loggerLevel=" + getLogLevel();
+ }
+
+ String logFile = "";
+ if (getLogFile() != null && !getLogFile().equals("")) {
+ logFile = "&loggerFile=" + getLogFile();
+ }
+
String protocolVersion = "";
if (getProtocolVersion() != 0) {
protocolVersion = "&protocolVersion=" + getProtocolVersion();
@@ -65,7 +77,9 @@ public class TestUtil {
+ server + ":"
+ port + "/"
+ getDatabase()
- + "?loglevel=" + getLogLevel()
+ + "?ApplicationName=Driver Tests"
+ + logLevel
+ + logFile
+ protocolVersion
+ binaryTransfer
+ receiveBufferSize
@@ -140,8 +154,15 @@ public class TestUtil {
/*
* Returns the log level to use
*/
- public static int getLogLevel() {
- return Integer.parseInt(System.getProperty("loglevel", "0"));
+ public static String getLogLevel() {
+ return System.getProperty("loggerLevel");
+ }
+
+ /*
+ * Returns the log file to use
+ */
+ public static String getLogFile() {
+ return System.getProperty("loggerFile");
}
/*
@@ -209,14 +230,6 @@ public class TestUtil {
p.putAll(System.getProperties());
System.getProperties().putAll(p);
- if (getLogLevel() > 0) {
- // Ant's junit task likes to buffer stdout/stderr and tends to run out of memory.
- // So we put debugging output to a file instead.
- java.io.Writer output = new java.io.FileWriter("postgresql-jdbc-tests.debug.txt", true);
- java.sql.DriverManager.setLogWriter(new java.io.PrintWriter(output, true));
- }
-
- org.postgresql.Driver.setLogLevel(getLogLevel()); // Also loads and registers driver.
initialized = true;
}
}
@@ -246,8 +259,7 @@ public class TestUtil {
* @return connection using a priviliged user mostly for tests that the ability to load C
* functions now as of 4/14
*/
- public static java.sql.Connection openPrivilegedDB() throws Exception {
-
+ public static Connection openPrivilegedDB() throws Exception {
initDriver();
Properties properties = new Properties();
properties.setProperty("user", getPrivilegedUser());
@@ -261,7 +273,7 @@ public class TestUtil {
*
* @return connection
*/
- public static java.sql.Connection openDB() throws Exception {
+ public static Connection openDB() throws Exception {
return openDB(new Properties());
}
@@ -269,7 +281,7 @@ public class TestUtil {
* Helper - opens a connection with the allowance for passing additional parameters, like
* "compatible".
*/
- public static java.sql.Connection openDB(Properties props) throws Exception {
+ public static Connection openDB(Properties props) throws Exception {
initDriver();
// Allow properties to override the user name.
@@ -333,10 +345,8 @@ public class TestUtil {
public static void dropSchema(Connection con, String schema) throws SQLException {
Statement stmt = con.createStatement();
try {
- String sql = "DROP SCHEMA " + schema;
- if (haveMinimumServerVersion(con, ServerVersion.v7_3)) {
- sql += " CASCADE ";
- }
+ String sql = "DROP SCHEMA " + schema + " CASCADE ";
+
stmt.executeUpdate(sql);
} catch (SQLException ex) {
// Since every create schema issues a drop schema
@@ -368,13 +378,12 @@ public class TestUtil {
dropTable(con, table);
// Now create the table
- String sql = "CREATE TABLE " + table + " (" + columns + ") ";
+ String sql = "CREATE TABLE " + table + " (" + columns + ")";
- // Starting with 8.0 oids may be turned off by default.
- // Some tests need them, so they flag that here.
- if (withOids && haveMinimumServerVersion(con, ServerVersion.v8_0)) {
+ if (withOids) {
sql += " WITH OIDS";
}
+
st.executeUpdate(sql);
} finally {
closeQuietly(st);
@@ -507,10 +516,7 @@ public class TestUtil {
public static void dropTable(Connection con, String table) throws SQLException {
Statement stmt = con.createStatement();
try {
- String sql = "DROP TABLE " + table;
- if (haveMinimumServerVersion(con, ServerVersion.v7_3)) {
- sql += " CASCADE ";
- }
+ String sql = "DROP TABLE " + table + " CASCADE ";
stmt.executeUpdate(sql);
} catch (SQLException ex) {
// Since every create table issues a drop table
@@ -607,6 +613,9 @@ public class TestUtil {
}
public static String escapeString(Connection con, String value) throws SQLException {
+ if (con == null) {
+ throw new NullPointerException("Connection is null");
+ }
if (con instanceof PgConnection) {
return ((PgConnection) con).escapeString(value);
}
@@ -614,6 +623,9 @@ public class TestUtil {
}
public static boolean getStandardConformingStrings(Connection con) {
+ if (con == null) {
+ throw new NullPointerException("Connection is null");
+ }
if (con instanceof PgConnection) {
return ((PgConnection) con).getStandardConformingStrings();
}
@@ -625,15 +637,10 @@ public class TestUtil {
* version. This is convenient because we are working with a java.sql.Connection, not an Postgres
* connection.
*/
- public static boolean haveMinimumServerVersion(Connection con, String version)
- throws SQLException {
- if (con instanceof PgConnection) {
- return ((PgConnection) con).haveMinimumServerVersion(version);
- }
- return false;
- }
-
public static boolean haveMinimumServerVersion(Connection con, int version) throws SQLException {
+ if (con == null) {
+ throw new NullPointerException("Connection is null");
+ }
if (con instanceof PgConnection) {
return ((PgConnection) con).haveMinimumServerVersion(version);
}
@@ -642,6 +649,9 @@ public class TestUtil {
public static boolean haveMinimumServerVersion(Connection con, Version version)
throws SQLException {
+ if (con == null) {
+ throw new NullPointerException("Connection is null");
+ }
if (con instanceof PgConnection) {
return ((PgConnection) con).haveMinimumServerVersion(version);
}
@@ -653,10 +663,12 @@ public class TestUtil {
return (jvm.compareTo(version) >= 0);
}
- public static boolean isProtocolVersion(Connection con, int version) {
+ public static boolean haveIntegerDateTimes(Connection con) {
+ if (con == null) {
+ throw new NullPointerException("Connection is null");
+ }
if (con instanceof PgConnection) {
- return (version == ((PgConnection) con).getProtocolVersion());
-
+ return ((PgConnection) con).getQueryExecutor().getIntegerDateTimes();
}
return false;
}
@@ -737,4 +749,100 @@ public class TestUtil {
}
}
}
+
+ public static void recreateLogicalReplicationSlot(Connection connection, String slotName, String outputPlugin)
+ throws SQLException, InterruptedException, TimeoutException {
+ //drop previos slot
+ dropReplicationSlot(connection, slotName);
+
+ PreparedStatement stm = null;
+ try {
+ stm = connection.prepareStatement("SELECT * FROM pg_create_logical_replication_slot(?, ?)");
+ stm.setString(1, slotName);
+ stm.setString(2, outputPlugin);
+ stm.execute();
+ } finally {
+ closeQuietly(stm);
+ }
+ }
+
+ public static void recreatePhysicalReplicationSlot(Connection connection, String slotName)
+ throws SQLException, InterruptedException, TimeoutException {
+ //drop previos slot
+ dropReplicationSlot(connection, slotName);
+
+ PreparedStatement stm = null;
+ try {
+ stm = connection.prepareStatement("SELECT * FROM pg_create_physical_replication_slot(?)");
+ stm.setString(1, slotName);
+ stm.execute();
+ } finally {
+ closeQuietly(stm);
+ }
+ }
+
+ public static void dropReplicationSlot(Connection connection, String slotName)
+ throws SQLException, InterruptedException, TimeoutException {
+ if (haveMinimumServerVersion(connection, ServerVersion.v9_5)) {
+ PreparedStatement stm = null;
+ try {
+ stm = connection.prepareStatement(
+ "select pg_terminate_backend(active_pid) from pg_replication_slots "
+ + "where active = true and slot_name = ?");
+ stm.setString(1, slotName);
+ stm.execute();
+ } finally {
+ closeQuietly(stm);
+ }
+ }
+
+ waitStopReplicationSlot(connection, slotName);
+
+ PreparedStatement stm = null;
+ try {
+ stm = connection.prepareStatement(
+ "select pg_drop_replication_slot(slot_name) "
+ + "from pg_replication_slots where slot_name = ?");
+ stm.setString(1, slotName);
+ stm.execute();
+ } finally {
+ closeQuietly(stm);
+ }
+ }
+
+ public static boolean isReplicationSlotActive(Connection connection, String slotName)
+ throws SQLException {
+ PreparedStatement stm = null;
+ ResultSet rs = null;
+
+ try {
+ stm =
+ connection.prepareStatement("select active from pg_replication_slots where slot_name = ?");
+ stm.setString(1, slotName);
+ rs = stm.executeQuery();
+ return rs.next() && rs.getBoolean(1);
+ } finally {
+ closeQuietly(rs);
+ closeQuietly(stm);
+ }
+ }
+
+ private static void waitStopReplicationSlot(Connection connection, String slotName)
+ throws InterruptedException, TimeoutException, SQLException {
+ long startWaitTime = System.currentTimeMillis();
+ boolean stillActive;
+ long timeInWait = 0;
+
+ do {
+ stillActive = isReplicationSlotActive(connection, slotName);
+ if (stillActive) {
+ TimeUnit.MILLISECONDS.sleep(100L);
+ timeInWait = System.currentTimeMillis() - startWaitTime;
+ }
+ } while (stillActive && timeInWait <= 30000);
+
+ if (stillActive) {
+ throw new TimeoutException("Wait stop replication slot " + timeInWait + " timeout occurs");
+ }
+ }
}
diff --git a/pgjdbc/src/test/java/org/postgresql/test/core/JavaVersionTest.java b/pgjdbc/src/test/java/org/postgresql/test/core/JavaVersionTest.java
new file mode 100644
index 0000000..ebac017
--- /dev/null
+++ b/pgjdbc/src/test/java/org/postgresql/test/core/JavaVersionTest.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (c) 2017, PostgreSQL Global Development Group
+ * See the LICENSE file in the project root for more information.
+ */
+
+package org.postgresql.test.core;
+
+import org.postgresql.core.JavaVersion;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class JavaVersionTest {
+ @Test
+ public void testGetRuntimeVersion() {
+ String currentVersion = System.getProperty("java.version");
+ String msg = "java.version = " + currentVersion + ", JavaVersion.getRuntimeVersion() = "
+ + JavaVersion.getRuntimeVersion();
+ System.out.println(msg);
+ if (currentVersion.startsWith("1.8")) {
+ Assert.assertEquals(msg, JavaVersion.v1_8, JavaVersion.getRuntimeVersion());
+ }
+ }
+}
diff --git a/pgjdbc/src/test/java/org/postgresql/test/extensions/ExtensionsTestSuite.java b/pgjdbc/src/test/java/org/postgresql/test/extensions/ExtensionsTestSuite.java
index 0579911..f0c5aed 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/extensions/ExtensionsTestSuite.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/extensions/ExtensionsTestSuite.java
@@ -5,54 +5,14 @@
package org.postgresql.test.extensions;
-import org.postgresql.test.TestUtil;
-
-import junit.framework.JUnit4TestAdapter;
-import junit.framework.TestSuite;
-
-import java.sql.Connection;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Statement;
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
/*
* Executes all known tests for PostgreSQL extensions supported by JDBC driver
*/
-public class ExtensionsTestSuite extends TestSuite {
-
- /*
- * The main entry point for JUnit
- */
- public static TestSuite suite() throws Exception {
- Class.forName("org.postgresql.Driver");
- TestSuite suite = new TestSuite();
-
- Connection connection = TestUtil.openDB();
- try {
- if (isHStoreEnabled(connection)) {
- suite.addTest(new JUnit4TestAdapter(HStoreTest.class));
- }
- } finally {
- connection.close();
- }
-
- return suite;
- }
-
- /**
- * Not all servers have hstore extensions installed.
- */
- private static boolean isHStoreEnabled(Connection conn) {
- try {
- Statement stmt = conn.createStatement();
- ResultSet rs = stmt.executeQuery("SELECT 'a=>1'::hstore::text");
- rs.close();
- stmt.close();
- return true;
- } catch (SQLException sqle) {
- return false;
- }
- }
-
+ at RunWith(Suite.class)
+ at Suite.SuiteClasses(HStoreTest.class)
+public class ExtensionsTestSuite {
}
diff --git a/pgjdbc/src/test/java/org/postgresql/test/extensions/HStoreTest.java b/pgjdbc/src/test/java/org/postgresql/test/extensions/HStoreTest.java
index 5d4135d..ace6dce 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/extensions/HStoreTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/extensions/HStoreTest.java
@@ -9,8 +9,8 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
+import org.postgresql.core.ServerVersion;
import org.postgresql.jdbc.PreferQueryMode;
-import org.postgresql.test.TestUtil;
import org.postgresql.test.jdbc2.BaseTest4;
import org.junit.Assume;
@@ -20,6 +20,7 @@ import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
+import java.sql.Statement;
import java.sql.Types;
import java.util.Collections;
import java.util.HashMap;
@@ -30,24 +31,30 @@ import java.util.Map;
public class HStoreTest extends BaseTest4 {
- private Connection _conn;
-
@Override
public void setUp() throws Exception {
super.setUp();
- _conn = con;
+ Assume.assumeTrue("server has installed hstore", isHStoreEnabled(con));
Assume.assumeFalse("hstore is not supported in simple protocol only mode",
preferQueryMode == PreferQueryMode.SIMPLE);
+ assumeMinimumServerVersion("hstore requires PostgreSQL 8.3+", ServerVersion.v8_3);
}
- @Override
- public void tearDown() throws SQLException {
- TestUtil.closeDB(_conn);
+ private static boolean isHStoreEnabled(Connection conn) {
+ try {
+ Statement stmt = conn.createStatement();
+ ResultSet rs = stmt.executeQuery("SELECT 'a=>1'::hstore::text");
+ rs.close();
+ stmt.close();
+ return true;
+ } catch (SQLException sqle) {
+ return false;
+ }
}
@Test
public void testHStoreSelect() throws SQLException {
- PreparedStatement pstmt = _conn.prepareStatement("SELECT 'a=>1,b=>2'::hstore");
+ PreparedStatement pstmt = con.prepareStatement("SELECT 'a=>1,b=>2'::hstore");
ResultSet rs = pstmt.executeQuery();
assertEquals(Map.class.getName(), rs.getMetaData().getColumnClassName(1));
assertTrue(rs.next());
@@ -63,7 +70,7 @@ public class HStoreTest extends BaseTest4 {
@Test
public void testHStoreSelectNullValue() throws SQLException {
- PreparedStatement pstmt = _conn.prepareStatement("SELECT 'a=>NULL'::hstore");
+ PreparedStatement pstmt = con.prepareStatement("SELECT 'a=>NULL'::hstore");
ResultSet rs = pstmt.executeQuery();
assertEquals(Map.class.getName(), rs.getMetaData().getColumnClassName(1));
assertTrue(rs.next());
@@ -75,7 +82,7 @@ public class HStoreTest extends BaseTest4 {
@Test
public void testHStoreSend() throws SQLException {
Map<String, Integer> correct = Collections.singletonMap("a", 1);
- PreparedStatement pstmt = _conn.prepareStatement("SELECT ?::text");
+ PreparedStatement pstmt = con.prepareStatement("SELECT ?::text");
pstmt.setObject(1, correct);
ResultSet rs = pstmt.executeQuery();
assertEquals(String.class.getName(), rs.getMetaData().getColumnClassName(1));
@@ -86,7 +93,7 @@ public class HStoreTest extends BaseTest4 {
@Test
public void testHStoreUsingPSSetObject4() throws SQLException {
Map<String, Integer> correct = Collections.singletonMap("a", 1);
- PreparedStatement pstmt = _conn.prepareStatement("SELECT ?::text");
+ PreparedStatement pstmt = con.prepareStatement("SELECT ?::text");
pstmt.setObject(1, correct, Types.OTHER, -1);
ResultSet rs = pstmt.executeQuery();
assertEquals(String.class.getName(), rs.getMetaData().getColumnClassName(1));
@@ -97,7 +104,7 @@ public class HStoreTest extends BaseTest4 {
@Test
public void testHStoreSendEscaped() throws SQLException {
Map<String, String> correct = Collections.singletonMap("a", "t'e\ns\"t");
- PreparedStatement pstmt = _conn.prepareStatement("SELECT ?");
+ PreparedStatement pstmt = con.prepareStatement("SELECT ?");
pstmt.setObject(1, correct);
ResultSet rs = pstmt.executeQuery();
assertEquals(Map.class.getName(), rs.getMetaData().getColumnClassName(1));
diff --git a/pgjdbc/src/test/java/org/postgresql/test/hostchooser/MultiHostTestSuite.java b/pgjdbc/src/test/java/org/postgresql/test/hostchooser/MultiHostTestSuite.java
index 4cf4c87..2486a65 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/hostchooser/MultiHostTestSuite.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/hostchooser/MultiHostTestSuite.java
@@ -20,7 +20,7 @@ import java.util.Properties;
*/
public class MultiHostTestSuite extends TestSuite {
- public static java.sql.Connection openSlaveDB() throws Exception {
+ public static java.sql.Connection openSecondaryDB() throws Exception {
TestUtil.initDriver();
Properties props = new Properties();
@@ -28,33 +28,61 @@ public class MultiHostTestSuite extends TestSuite {
props.setProperty("user", TestUtil.getUser());
props.setProperty("password", TestUtil.getPassword());
- return DriverManager.getConnection(TestUtil.getURL(getSlaveServer(), getSlavePort()), props);
+ return DriverManager.getConnection(TestUtil.getURL(getSecondaryServer(), getSecondaryPort()), props);
+ }
+
+ public static java.sql.Connection openSecondaryDB2() throws Exception {
+ TestUtil.initDriver();
+
+ Properties props = new Properties();
+
+ props.setProperty("user", TestUtil.getUser());
+ props.setProperty("password", TestUtil.getPassword());
+
+ return DriverManager.getConnection(TestUtil.getURL(getSecondaryServer2(), getSecondaryPort2()), props);
+ }
+
+ /*
+ * Returns the Test server
+ */
+ public static String getSecondaryServer() {
+ return System.getProperty("secondaryServer", TestUtil.getServer());
+ }
+
+ /*
+ * Returns the Test port
+ */
+ public static int getSecondaryPort() {
+ return Integer
+ .parseInt(System.getProperty("secondaryPort", String.valueOf(TestUtil.getPort() + 1)));
}
/*
* Returns the Test server
*/
- public static String getSlaveServer() {
- return System.getProperty("slaveServer", TestUtil.getServer());
+ public static String getSecondaryServer2() {
+ return System.getProperty("secondaryServer2", TestUtil.getServer());
}
/*
* Returns the Test port
*/
- public static int getSlavePort() {
+ public static int getSecondaryPort2() {
return Integer
- .parseInt(System.getProperty("slavePort", String.valueOf(TestUtil.getPort() + 1)));
+ .parseInt(System.getProperty("secondaryPort2", String.valueOf(TestUtil.getPort() + 2)));
}
/*
* The main entry point for JUnit
*/
public static TestSuite suite() throws Exception {
- Class.forName("org.postgresql.Driver");
TestSuite suite = new TestSuite();
try {
- Connection connection = openSlaveDB();
+ Connection connection = openSecondaryDB();
+ TestUtil.closeDB(connection);
+
+ connection = openSecondaryDB2();
TestUtil.closeDB(connection);
} catch (PSQLException ex) {
// replication instance is not available, but suite must have at lest one test case
diff --git a/pgjdbc/src/test/java/org/postgresql/test/hostchooser/MultiHostsConnectionTest.java b/pgjdbc/src/test/java/org/postgresql/test/hostchooser/MultiHostsConnectionTest.java
index 6d9d794..f945ab6 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/hostchooser/MultiHostsConnectionTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/hostchooser/MultiHostsConnectionTest.java
@@ -10,10 +10,10 @@ import static java.util.Arrays.asList;
import static java.util.concurrent.TimeUnit.SECONDS;
import static org.postgresql.hostchooser.HostRequirement.any;
import static org.postgresql.hostchooser.HostRequirement.master;
-import static org.postgresql.hostchooser.HostRequirement.preferSlave;
-import static org.postgresql.hostchooser.HostRequirement.slave;
-import static org.postgresql.hostchooser.HostStatus.ConnectFail;
-import static org.postgresql.hostchooser.HostStatus.Slave;
+import static org.postgresql.hostchooser.HostRequirement.preferSecondary;
+import static org.postgresql.hostchooser.HostRequirement.secondary;
+import static org.postgresql.hostchooser.HostStatus.Master;
+import static org.postgresql.hostchooser.HostStatus.Secondary;
import static org.postgresql.test.TestUtil.closeDB;
import org.postgresql.hostchooser.GlobalHostStatusTracker;
@@ -39,11 +39,14 @@ public class MultiHostsConnectionTest extends TestCase {
static final String user = TestUtil.getUser();
static final String password = TestUtil.getPassword();
static final String master1 = TestUtil.getServer() + ":" + TestUtil.getPort();
- static final String slave1 =
- MultiHostTestSuite.getSlaveServer() + ":" + MultiHostTestSuite.getSlavePort();
+ static final String secondary1 =
+ MultiHostTestSuite.getSecondaryServer() + ":" + MultiHostTestSuite.getSecondaryPort();
+ static final String secondary2 =
+ MultiHostTestSuite.getSecondaryServer2() + ":" + MultiHostTestSuite.getSecondaryPort2();
static final String fake1 = "127.127.217.217:1";
static String masterIp;
- static String slaveIp;
+ static String secondaryIP;
+ static String secondaryIP2;
static String fakeIp = fake1;
static Connection con;
@@ -59,8 +62,12 @@ public class MultiHostsConnectionTest extends TestCase {
masterIp = getRemoteHostSpec();
closeDB(con);
- con = MultiHostTestSuite.openSlaveDB();
- slaveIp = getRemoteHostSpec();
+ con = MultiHostTestSuite.openSecondaryDB();
+ secondaryIP = getRemoteHostSpec();
+ closeDB(con);
+
+ con = MultiHostTestSuite.openSecondaryDB2();
+ secondaryIP2 = getRemoteHostSpec();
closeDB(con);
} catch (Exception e) {
@@ -106,7 +113,8 @@ public class MultiHostsConnectionTest extends TestCase {
sb.append(target).append(',');
}
sb.setLength(sb.length() - 1);
- sb.append("/test");
+ sb.append("/");
+ sb.append(TestUtil.getDatabase());
return con = DriverManager.getConnection(sb.toString(), props);
}
@@ -147,9 +155,9 @@ public class MultiHostsConnectionTest extends TestCase {
assertGlobalState(master1, "ConnectOK");
assertGlobalState(fake1, "ConnectFail");
- getConnection(any, fake1, slave1);
- assertRemote(slaveIp);
- assertGlobalState(slave1, "ConnectOK");
+ getConnection(any, fake1, secondary1);
+ assertRemote(secondaryIP);
+ assertGlobalState(secondary1, "ConnectOK");
getConnection(any, fake1, master1);
assertRemote(masterIp);
@@ -158,50 +166,50 @@ public class MultiHostsConnectionTest extends TestCase {
}
public static void testConnectToMaster() throws SQLException {
- getConnection(master, true, fake1, master1, slave1);
+ getConnection(master, true, fake1, master1, secondary1);
assertRemote(masterIp);
assertGlobalState(fake1, "ConnectFail");
assertGlobalState(master1, "Master");
- assertGlobalState(slave1, null);
+ assertGlobalState(secondary1, null);
- getConnection(master, false, fake1, slave1, master1);
+ getConnection(master, false, fake1, secondary1, master1);
assertRemote(masterIp);
- assertGlobalState(fake1, "ConnectFail");
- assertGlobalState(master1, "Master");
- assertGlobalState(slave1, "Slave");
+ assertGlobalState(fake1, "ConnectFail"); // cached
+ assertGlobalState(master1, "Master"); // connected to master
+ assertGlobalState(secondary1, "Secondary"); // was unknown, so tried to connect in order
}
public static void testConnectToSlave() throws SQLException {
- getConnection(slave, true, fake1, slave1, master1);
- assertRemote(slaveIp);
+ getConnection(secondary, true, fake1, secondary1, master1);
+ assertRemote(secondaryIP);
assertGlobalState(fake1, "ConnectFail");
- assertGlobalState(slave1, "Slave");
+ assertGlobalState(secondary1, "Secondary");
assertGlobalState(master1, null);
- getConnection(slave, false, fake1, master1, slave1);
- assertRemote(slaveIp);
- assertGlobalState(fake1, "ConnectFail");
- assertGlobalState(slave1, "Slave");
- assertGlobalState(master1, "Master");
+ getConnection(secondary, false, fake1, master1, secondary1);
+ assertRemote(secondaryIP);
+ assertGlobalState(fake1, "ConnectFail"); // cached
+ assertGlobalState(secondary1, "Secondary"); // connected
+ assertGlobalState(master1, "Master"); // tried as it was unknown
}
public static void testConnectToSlaveFirst() throws SQLException {
- getConnection(preferSlave, true, fake1, slave1, master1);
- assertRemote(slaveIp);
+ getConnection(preferSecondary, true, fake1, secondary1, master1);
+ assertRemote(secondaryIP);
assertGlobalState(fake1, "ConnectFail");
- assertGlobalState(slave1, "Slave");
+ assertGlobalState(secondary1, "Secondary");
assertGlobalState(master1, null);
- getConnection(preferSlave, false, fake1, master1, slave1);
- assertRemote(masterIp);
+ getConnection(secondary, false, fake1, master1, secondary1);
+ assertRemote(secondaryIP);
assertGlobalState(fake1, "ConnectFail");
- assertGlobalState(slave1, "Slave");
- assertGlobalState(master1, "Master");
+ assertGlobalState(secondary1, "Secondary");
+ assertGlobalState(master1, "Master"); // tried as it was unknown
- getConnection(preferSlave, false, fake1, master1, slave1);
- assertRemote(slaveIp);
+ getConnection(preferSecondary, true, fake1, master1, secondary1);
+ assertRemote(secondaryIP);
assertGlobalState(fake1, "ConnectFail");
- assertGlobalState(slave1, "Slave");
+ assertGlobalState(secondary1, "Secondary");
assertGlobalState(master1, "Master");
}
@@ -217,45 +225,114 @@ public class MultiHostsConnectionTest extends TestCase {
Set<String> connectedHosts = new HashSet<String>();
boolean fake1FoundTried = false;
for (int i = 0; i < 20; ++i) {
- getConnection(any, true, true, fake1, master1, slave1);
+ getConnection(any, true, true, fake1, master1, secondary1);
connectedHosts.add(getRemoteHostSpec());
fake1FoundTried |= hostStatusMap.containsKey(hostSpec(fake1));
if (connectedHosts.size() == 2 && fake1FoundTried) {
break;
}
}
- assertEquals("Never connected to all hosts", new HashSet<String>(asList(masterIp, slaveIp)),
+ assertEquals("Never connected to all hosts", new HashSet<String>(asList(masterIp, secondaryIP)),
connectedHosts);
assertTrue("Never tried to connect to fake node", fake1FoundTried);
}
- public static void testHostRechecks() throws SQLException, InterruptedException {
- getConnection(master, true, fake1, master1, slave1);
+ public static void testLoadBalancing_preferSecondary() throws SQLException {
+ Set<String> connectedHosts = new HashSet<String>();
+ Set<HostSpec> tryConnectedHosts = new HashSet<HostSpec>();
+ for (int i = 0; i < 20; ++i) {
+ getConnection(preferSecondary, true, true, fake1, master1, secondary1, secondary2);
+ connectedHosts.add(getRemoteHostSpec());
+ tryConnectedHosts.addAll(hostStatusMap.keySet());
+ if (tryConnectedHosts.size() == 4) {
+ break;
+ }
+ }
+ assertEquals("Never connected to all secondary hosts", new HashSet<String>(asList(secondaryIP,
+ secondaryIP2)),
+ connectedHosts);
+ assertEquals("Never tried to connect to fake node",4, tryConnectedHosts.size());
+
+ getConnection(preferSecondary, false, true, fake1, master1, secondary1);
+ assertRemote(secondaryIP);
+ connectedHosts.clear();
+ for (int i = 0; i < 20; ++i) {
+ getConnection(preferSecondary, false, true, fake1, master1, secondary1, secondary2);
+ connectedHosts.add(getRemoteHostSpec());
+ if (connectedHosts.size() == 2) {
+ break;
+ }
+ }
+ assertEquals("Never connected to all secondary hosts", new HashSet<String>(asList(secondaryIP,
+ secondaryIP2)),
+ connectedHosts);
+
+ // connect to master when there's no secondary
+ getConnection(preferSecondary, true, true, fake1, master1);
assertRemote(masterIp);
- assertGlobalState(fake1, "ConnectFail");
- assertGlobalState(slave1, null);
- GlobalHostStatusTracker.reportHostStatus(hostSpec(master1), ConnectFail);
- assertGlobalState(master1, "ConnectFail");
+ getConnection(preferSecondary, false, true, fake1, master1);
+ assertRemote(masterIp);
+ }
+
+ public static void testLoadBalancing_slave() throws SQLException {
+ Set<String> connectedHosts = new HashSet<String>();
+ Set<HostSpec> tryConnectedHosts = new HashSet<HostSpec>();
+ for (int i = 0; i < 20; ++i) {
+ getConnection(secondary, true, true, fake1, master1, secondary1, secondary2);
+ connectedHosts.add(getRemoteHostSpec());
+ tryConnectedHosts.addAll(hostStatusMap.keySet());
+ if (tryConnectedHosts.size() == 4) {
+ break;
+ }
+ }
+ assertEquals("Did not connect to all secondary hosts", new HashSet<String>(asList(secondaryIP,
+ secondaryIP2)),
+ connectedHosts);
+ assertEquals("Did not attempt to connect to master and fake node", 4, tryConnectedHosts.size());
+
+ getConnection(preferSecondary, false, true, fake1, master1, secondary1);
+ assertRemote(secondaryIP);
+ connectedHosts.clear();
+ for (int i = 0; i < 20; ++i) {
+ getConnection(secondary, false, true, fake1, master1, secondary1, secondary2);
+ connectedHosts.add(getRemoteHostSpec());
+ if (connectedHosts.size() == 2) {
+ break;
+ }
+ }
+ assertEquals("Did not connect to all secondary hosts", new HashSet<String>(asList(secondaryIP,
+ secondaryIP2)),
+ connectedHosts);
+ }
+
+ public static void testHostRechecks() throws SQLException, InterruptedException {
+ GlobalHostStatusTracker.reportHostStatus(hostSpec(master1), Secondary);
+ GlobalHostStatusTracker.reportHostStatus(hostSpec(secondary1), Master);
+ GlobalHostStatusTracker.reportHostStatus(hostSpec(fake1), Secondary);
try {
- getConnection(master, false, fake1, slave1, master1);
+ getConnection(master, false, fake1, secondary1, master1);
fail();
} catch (SQLException ex) {
}
+ GlobalHostStatusTracker.reportHostStatus(hostSpec(master1), Secondary);
+ GlobalHostStatusTracker.reportHostStatus(hostSpec(secondary1), Master);
+ GlobalHostStatusTracker.reportHostStatus(hostSpec(fake1), Secondary);
+
SECONDS.sleep(3);
- getConnection(master, false, slave1, fake1, master1);
+ getConnection(master, false, secondary1, fake1, master1);
assertRemote(masterIp);
}
public static void testNoGoodHostsRechecksEverything() throws SQLException, InterruptedException {
- GlobalHostStatusTracker.reportHostStatus(hostSpec(master1), Slave);
- GlobalHostStatusTracker.reportHostStatus(hostSpec(slave1), Slave);
- GlobalHostStatusTracker.reportHostStatus(hostSpec(fake1), Slave);
+ GlobalHostStatusTracker.reportHostStatus(hostSpec(master1), Secondary);
+ GlobalHostStatusTracker.reportHostStatus(hostSpec(secondary1), Secondary);
+ GlobalHostStatusTracker.reportHostStatus(hostSpec(fake1), Secondary);
- getConnection(master, false, slave1, fake1, master1);
+ getConnection(master, false, secondary1, fake1, master1);
assertRemote(masterIp);
}
}
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/ANTTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/ANTTest.java
index 8ec5955..8702bca 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/ANTTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/ANTTest.java
@@ -5,16 +5,17 @@
package org.postgresql.test.jdbc2;
-import junit.framework.TestCase;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
-public class ANTTest extends TestCase {
- public ANTTest(String name) {
- super(name);
- }
+import org.junit.Test;
+
+public class ANTTest {
/*
* This tests the acceptsURL() method with a couple of good and badly formed jdbc urls
*/
+ @Test
public void testANT() {
String url = System.getProperty("database");
String usr = System.getProperty("username");
@@ -24,7 +25,7 @@ public class ANTTest extends TestCase {
assertNotNull(usr);
assertNotNull(psw);
- assertTrue(!url.equals(""));
- assertTrue(!usr.equals(""));
+ assertFalse(url.isEmpty());
+ assertFalse(usr.isEmpty());
}
}
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/ArrayTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/ArrayTest.java
index 5f8aa77..8e1874c 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/ArrayTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/ArrayTest.java
@@ -5,12 +5,17 @@
package org.postgresql.test.jdbc2;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
+import org.postgresql.PGConnection;
import org.postgresql.core.BaseConnection;
import org.postgresql.geometric.PGbox;
import org.postgresql.geometric.PGpoint;
import org.postgresql.jdbc.PgArray;
import org.postgresql.jdbc.PreferQueryMode;
import org.postgresql.test.TestUtil;
+import org.postgresql.util.PSQLException;
import org.junit.Assert;
import org.junit.Test;
@@ -46,12 +51,14 @@ public class ArrayTest extends BaseTest4 {
return ids;
}
+ @Override
public void setUp() throws Exception {
super.setUp();
conn = con;
TestUtil.createTable(conn, "arrtest", "intarr int[], decarr decimal(2,1)[], strarr text[]");
}
+ @Override
public void tearDown() throws SQLException {
TestUtil.dropTable(conn, "arrtest");
super.tearDown();
@@ -79,6 +86,122 @@ public class ArrayTest extends BaseTest4 {
}
@Test
+ public void testSetPrimitiveObjects() throws SQLException {
+ PreparedStatement pstmt = conn.prepareStatement("INSERT INTO arrtest VALUES (?,?,?)");
+ pstmt.setObject(1, new int[]{1,2,3}, Types.ARRAY);
+ pstmt.setObject(2, new double[]{3.1d, 1.4d}, Types.ARRAY);
+ pstmt.setObject(3, new String[]{"abc", "f'a", "fa\"b"}, Types.ARRAY);
+ pstmt.executeUpdate();
+ pstmt.close();
+
+ Statement stmt = conn.createStatement();
+ ResultSet rs = stmt.executeQuery("SELECT intarr, decarr, strarr FROM arrtest");
+ Assert.assertTrue(rs.next());
+
+ Array arr = rs.getArray(1);
+ Assert.assertEquals(Types.INTEGER, arr.getBaseType());
+ Integer[] intarr = (Integer[]) arr.getArray();
+ assertEquals(3, intarr.length);
+ assertEquals(1, intarr[0].intValue());
+ assertEquals(2, intarr[1].intValue());
+ assertEquals(3, intarr[2].intValue());
+
+ arr = rs.getArray(2);
+ assertEquals(Types.NUMERIC, arr.getBaseType());
+ BigDecimal[] decarr = (BigDecimal[]) arr.getArray();
+ assertEquals(2, decarr.length);
+ assertEquals(new BigDecimal("3.1"), decarr[0]);
+ assertEquals(new BigDecimal("1.4"), decarr[1]);
+
+ arr = rs.getArray(3);
+ assertEquals(Types.VARCHAR, arr.getBaseType());
+ String[] strarr = (String[]) arr.getArray(2, 2);
+ assertEquals(2, strarr.length);
+ assertEquals("f'a", strarr[0]);
+ assertEquals("fa\"b", strarr[1]);
+
+ rs.close();
+ }
+
+ @Test
+ public void testSetPrimitiveArraysObjects() throws SQLException {
+ PreparedStatement pstmt = conn.prepareStatement("INSERT INTO arrtest VALUES (?,?,?)");
+
+ final PGConnection arraySupport = conn.unwrap(PGConnection.class);
+
+ pstmt.setArray(1, arraySupport.createArrayOf("int4", new int[] { 1, 2, 3 }));
+ pstmt.setObject(2, arraySupport.createArrayOf("float8", new double[] { 3.1d, 1.4d }));
+ pstmt.setObject(3, arraySupport.createArrayOf("varchar", new String[] { "abc", "f'a", "fa\"b" }));
+
+ pstmt.executeUpdate();
+ pstmt.close();
+
+ Statement stmt = conn.createStatement();
+ ResultSet rs = stmt.executeQuery("SELECT intarr, decarr, strarr FROM arrtest");
+ Assert.assertTrue(rs.next());
+
+ Array arr = rs.getArray(1);
+ Assert.assertEquals(Types.INTEGER, arr.getBaseType());
+ Integer[] intarr = (Integer[]) arr.getArray();
+ Assert.assertEquals(3, intarr.length);
+ Assert.assertEquals(1, intarr[0].intValue());
+ Assert.assertEquals(2, intarr[1].intValue());
+ Assert.assertEquals(3, intarr[2].intValue());
+
+ arr = rs.getArray(2);
+ Assert.assertEquals(Types.NUMERIC, arr.getBaseType());
+ BigDecimal[] decarr = (BigDecimal[]) arr.getArray();
+ Assert.assertEquals(2, decarr.length);
+ Assert.assertEquals(new BigDecimal("3.1"), decarr[0]);
+ Assert.assertEquals(new BigDecimal("1.4"), decarr[1]);
+
+ arr = rs.getArray(3);
+ Assert.assertEquals(Types.VARCHAR, arr.getBaseType());
+ String[] strarr = (String[]) arr.getArray(2, 2);
+ Assert.assertEquals(2, strarr.length);
+ Assert.assertEquals("f'a", strarr[0]);
+ Assert.assertEquals("fa\"b", strarr[1]);
+
+ try {
+ arraySupport.createArrayOf("int4", Integer.valueOf(1));
+ fail("not an array");
+ } catch (PSQLException e) {
+
+ }
+
+ rs.close();
+ }
+
+ @Test
+ public void testSetNullArrays() throws SQLException {
+ PreparedStatement pstmt = conn.prepareStatement("INSERT INTO arrtest VALUES (?,?,?)");
+
+ final PGConnection arraySupport = conn.unwrap(PGConnection.class);
+
+ pstmt.setArray(1, arraySupport.createArrayOf("int4", null));
+ pstmt.setObject(2, conn.createArrayOf("float8", null));
+ pstmt.setObject(3, arraySupport.createArrayOf("varchar", null));
+
+ pstmt.executeUpdate();
+ pstmt.close();
+
+ Statement stmt = conn.createStatement();
+ ResultSet rs = stmt.executeQuery("SELECT intarr, decarr, strarr FROM arrtest");
+ Assert.assertTrue(rs.next());
+
+ Array arr = rs.getArray(1);
+ Assert.assertNull(arr);
+
+ arr = rs.getArray(2);
+ Assert.assertNull(arr);
+
+ arr = rs.getArray(3);
+ Assert.assertNull(arr);
+
+ rs.close();
+ }
+
+ @Test
public void testRetrieveArrays() throws SQLException {
Statement stmt = conn.createStatement();
@@ -91,7 +214,7 @@ public class ArrayTest extends BaseTest4 {
Array arr = rs.getArray(1);
Assert.assertEquals(Types.INTEGER, arr.getBaseType());
- Integer intarr[] = (Integer[]) arr.getArray();
+ Integer[] intarr = (Integer[]) arr.getArray();
Assert.assertEquals(3, intarr.length);
Assert.assertEquals(1, intarr[0].intValue());
Assert.assertEquals(2, intarr[1].intValue());
@@ -99,14 +222,14 @@ public class ArrayTest extends BaseTest4 {
arr = rs.getArray(2);
Assert.assertEquals(Types.NUMERIC, arr.getBaseType());
- BigDecimal decarr[] = (BigDecimal[]) arr.getArray();
+ BigDecimal[] decarr = (BigDecimal[]) arr.getArray();
Assert.assertEquals(2, decarr.length);
Assert.assertEquals(new BigDecimal("3.1"), decarr[0]);
Assert.assertEquals(new BigDecimal("1.4"), decarr[1]);
arr = rs.getArray(3);
Assert.assertEquals(Types.VARCHAR, arr.getBaseType());
- String strarr[] = (String[]) arr.getArray(2, 2);
+ String[] strarr = (String[]) arr.getArray(2, 2);
Assert.assertEquals(2, strarr.length);
Assert.assertEquals("f'a", strarr[0]);
Assert.assertEquals("fa\"b", strarr[1]);
@@ -200,7 +323,7 @@ public class ArrayTest extends BaseTest4 {
Assert.assertEquals(Types.INTEGER, result.getBaseType());
Assert.assertEquals("int4", result.getBaseTypeName());
- Integer intarr[] = (Integer[]) result.getArray();
+ Integer[] intarr = (Integer[]) result.getArray();
Assert.assertEquals(3, intarr.length);
Assert.assertEquals(1, intarr[0].intValue());
Assert.assertEquals(2, intarr[1].intValue());
@@ -223,7 +346,7 @@ public class ArrayTest extends BaseTest4 {
ResultSet rs = stmt.executeQuery("SELECT intarr FROM arrtest");
Assert.assertTrue(rs.next());
Array result = rs.getArray(1);
- Integer intarr[] = (Integer[]) result.getArray();
+ Integer[] intarr = (Integer[]) result.getArray();
Assert.assertEquals(4, intarr.length);
for (int i = 0; i < intarr.length; i++) {
Assert.assertEquals(i, intarr[i].intValue());
@@ -236,13 +359,13 @@ public class ArrayTest extends BaseTest4 {
ResultSet rs = stmt.executeQuery("SELECT '{{1,2},{3,4}}'::int[]");
Assert.assertTrue(rs.next());
Array arr = rs.getArray(1);
- Object oa[] = (Object[]) arr.getArray();
+ Object[] oa = (Object[]) arr.getArray();
Assert.assertEquals(2, oa.length);
- Integer i0[] = (Integer[]) oa[0];
+ Integer[] i0 = (Integer[]) oa[0];
Assert.assertEquals(2, i0.length);
Assert.assertEquals(1, i0[0].intValue());
Assert.assertEquals(2, i0[1].intValue());
- Integer i1[] = (Integer[]) oa[1];
+ Integer[] i1 = (Integer[]) oa[1];
Assert.assertEquals(2, i1.length);
Assert.assertEquals(3, i1[0].intValue());
Assert.assertEquals(4, i1[1].intValue());
@@ -252,15 +375,11 @@ public class ArrayTest extends BaseTest4 {
@Test
public void testNullValues() throws SQLException {
- if (!TestUtil.haveMinimumServerVersion(conn, "8.2")) {
- return;
- }
-
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT ARRAY[1,NULL,3]");
Assert.assertTrue(rs.next());
Array arr = rs.getArray(1);
- Integer i[] = (Integer[]) arr.getArray();
+ Integer[] i = (Integer[]) arr.getArray();
Assert.assertEquals(3, i.length);
Assert.assertEquals(1, i[0].intValue());
Assert.assertNull(i[1]);
@@ -341,23 +460,17 @@ public class ArrayTest extends BaseTest4 {
Assert.assertTrue(rs.next());
Array arr = rs.getArray(1);
- String s[] = (String[]) arr.getArray();
+ String[] s = (String[]) arr.getArray();
Assert.assertEquals(2, s.length);
Assert.assertEquals("a", s[0]);
- if (TestUtil.haveMinimumServerVersion(conn, "8.2")) {
- Assert.assertNull(s[1]);
- } else {
- Assert.assertEquals("NULL", s[1]);
- }
+ Assert.assertNull(s[1]);
}
@Test
public void testEscaping() throws SQLException {
Statement stmt = conn.createStatement();
String sql = "SELECT ";
- if (TestUtil.haveMinimumServerVersion(conn, "8.1")) {
- sql += 'E';
- }
+ sql += 'E';
// Uggg. Three levels of escaping: Java, string literal, array.
sql += "'{{c\\\\\"d, ''}, {\"\\\\\\\\\",\"''\"}}'::text[]";
@@ -365,7 +478,7 @@ public class ArrayTest extends BaseTest4 {
Assert.assertTrue(rs.next());
Array arr = rs.getArray(1);
- String s[][] = (String[][]) arr.getArray();
+ String[][] s = (String[][]) arr.getArray();
Assert.assertEquals("c\"d", s[0][0]);
Assert.assertEquals("'", s[0][1]);
Assert.assertEquals("\\", s[1][0]);
@@ -411,7 +524,7 @@ public class ArrayTest extends BaseTest4 {
Assert.assertTrue(rs.next());
arr = rs.getArray(1);
- Integer i[][] = (Integer[][]) arr.getArray();
+ Integer[][] i = (Integer[][]) arr.getArray();
Assert.assertEquals(1, i[0][0].intValue());
Assert.assertEquals(2, i[0][1].intValue());
Assert.assertEquals(3, i[1][0].intValue());
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/AutoRollbackTestSuite.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/AutoRollbackTestSuite.java
index 93cdbfb..1c2c158 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/AutoRollbackTestSuite.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/AutoRollbackTestSuite.java
@@ -9,6 +9,7 @@ import org.postgresql.PGConnection;
import org.postgresql.PGProperty;
import org.postgresql.core.BaseConnection;
import org.postgresql.core.ResultHandler;
+import org.postgresql.core.ServerVersion;
import org.postgresql.core.TransactionState;
import org.postgresql.jdbc.AutoSave;
import org.postgresql.jdbc.PgConnection;
@@ -17,6 +18,7 @@ import org.postgresql.test.TestUtil;
import org.postgresql.util.PSQLState;
import org.junit.Assert;
+import org.junit.Assume;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
@@ -29,9 +31,11 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.EnumSet;
import java.util.Properties;
+import java.util.concurrent.atomic.AtomicInteger;
@RunWith(Parameterized.class)
public class AutoRollbackTestSuite extends BaseTest4 {
+ private static final AtomicInteger counter = new AtomicInteger();
private enum FailMode {
/**
@@ -64,10 +68,40 @@ public class AutoRollbackTestSuite extends BaseTest4 {
INSERT_BATCH,
}
- private final static EnumSet<FailMode> DEALLOCATES =
+ private enum ReturnColumns {
+ EXACT("a, str"),
+ STAR("*");
+
+ public final String cols;
+
+ ReturnColumns(String cols) {
+ this.cols = cols;
+ }
+ }
+
+ private enum TestStatement {
+ SELECT("select ${cols} from rollbacktest", 0),
+ WITH_INSERT_SELECT(
+ "with x as (insert into rollbacktest(a, str) values(43, 'abc') returning ${cols})"
+ + "select * from x", 1);
+
+ private final String sql;
+ private final int rowsInserted;
+
+ TestStatement(String sql, int rowsInserted) {
+ this.sql = sql;
+ this.rowsInserted = rowsInserted;
+ }
+
+ public String getSql(ReturnColumns cols) {
+ return sql.replace("${cols}", cols.cols);
+ }
+ }
+
+ private static final EnumSet<FailMode> DEALLOCATES =
EnumSet.of(FailMode.DEALLOCATE, FailMode.DISCARD);
- private final static EnumSet<FailMode> TRANS_KILLERS =
+ private static final EnumSet<FailMode> TRANS_KILLERS =
EnumSet.of(FailMode.SELECT, FailMode.INSERT_BATCH);
private enum ContinueMode {
@@ -81,23 +115,40 @@ public class AutoRollbackTestSuite extends BaseTest4 {
private final FailMode failMode;
private final ContinueMode continueMode;
private final boolean flushCacheOnDeallocate;
+ private final boolean trans;
+ private final TestStatement testSql;
+ private final ReturnColumns cols;
public AutoRollbackTestSuite(AutoSave autoSave, AutoCommit autoCommit,
- FailMode failMode, ContinueMode continueMode, boolean flushCacheOnDeallocate) {
+ FailMode failMode, ContinueMode continueMode, boolean flushCacheOnDeallocate,
+ boolean trans, TestStatement testSql, ReturnColumns cols) {
this.autoSave = autoSave;
this.autoCommit = autoCommit;
this.failMode = failMode;
this.continueMode = continueMode;
this.flushCacheOnDeallocate = flushCacheOnDeallocate;
+ this.trans = trans;
+ this.testSql = testSql;
+ this.cols = cols;
}
@Override
public void setUp() throws Exception {
super.setUp();
+ if (testSql == TestStatement.WITH_INSERT_SELECT) {
+ assumeMinimumServerVersion(ServerVersion.v9_1);
+ }
+
TestUtil.createTable(con, "rollbacktest", "a int, str text");
con.setAutoCommit(autoCommit == AutoCommit.YES);
BaseConnection baseConnection = con.unwrap(BaseConnection.class);
baseConnection.setFlushCacheOnDeallocate(flushCacheOnDeallocate);
+ Assume.assumeTrue("DEALLOCATE ALL requires PostgreSQL 8.3+",
+ failMode != FailMode.DEALLOCATE || TestUtil.haveMinimumServerVersion(con, ServerVersion.v8_3));
+ Assume.assumeTrue("DISCARD ALL requires PostgreSQL 8.3+",
+ failMode != FailMode.DISCARD || TestUtil.haveMinimumServerVersion(con, ServerVersion.v8_3));
+ Assume.assumeTrue("Plan invalidation on table redefinition requires PostgreSQL 8.3+",
+ failMode != FailMode.ALTER || TestUtil.haveMinimumServerVersion(con, ServerVersion.v8_3));
}
@Override
@@ -119,7 +170,7 @@ public class AutoRollbackTestSuite extends BaseTest4 {
}
- @Parameterized.Parameters(name = "{index}: autorollback(autoSave={0}, autoCommit={1}, failMode={2}, continueMode={3}, flushOnDeallocate={4})")
+ @Parameterized.Parameters(name = "{index}: autorollback(autoSave={0}, autoCommit={1}, failMode={2}, continueMode={3}, flushOnDeallocate={4}, hastransaction={5}, sql={6}, columns={7})")
public static Iterable<Object[]> data() {
Collection<Object[]> ids = new ArrayList<Object[]>();
boolean[] booleans = new boolean[] {true, false};
@@ -139,7 +190,18 @@ public class AutoRollbackTestSuite extends BaseTest4 {
continue;
}
- ids.add(new Object[]{autoSave, autoCommit, failMode, continueMode, flushCacheOnDeallocate});
+ for (boolean trans : new boolean[]{true, false}) {
+ // continueMode would commit, and autoCommit=YES would commit,
+ // so it does not make sense to test trans=true for those cases
+ if (trans && (continueMode == ContinueMode.COMMIT || autoCommit != AutoCommit.NO)) {
+ continue;
+ }
+ for (TestStatement statement : TestStatement.values()) {
+ for (ReturnColumns columns : ReturnColumns.values()) {
+ ids.add(new Object[]{autoSave, autoCommit, failMode, continueMode, flushCacheOnDeallocate, trans, statement, columns});
+ }
+ }
+ }
}
}
}
@@ -162,10 +224,16 @@ public class AutoRollbackTestSuite extends BaseTest4 {
Statement statement = con.createStatement();
statement.executeUpdate("insert into rollbacktest(a, str) values (0, 'test')");
+ int rowsExpected = 1;
- PreparedStatement ps = con.prepareStatement("select * from rollbacktest");
- // Server-prepare the statement
+ PreparedStatement ps = con.prepareStatement(testSql.getSql(cols));
+ // Server-prepare the testSql
ps.executeQuery().close();
+ rowsExpected += testSql.rowsInserted;
+
+ if (trans) {
+ statement.executeUpdate("update rollbacktest set a=a");
+ }
switch (failMode) {
case SELECT:
@@ -247,6 +315,7 @@ public class AutoRollbackTestSuite extends BaseTest4 {
try {
// Try execute server-prepared statement again
ps.executeQuery().close();
+ rowsExpected += testSql.rowsInserted;
executeSqlSuccess();
} catch (SQLException e) {
if (autoSave != AutoSave.ALWAYS && TRANS_KILLERS.contains(failMode) && autoCommit == AutoCommit.NO) {
@@ -279,7 +348,7 @@ public class AutoRollbackTestSuite extends BaseTest4 {
try {
- assertRows("rollbacktest", 1);
+ assertRows("rollbacktest", rowsExpected);
executeSqlSuccess();
} catch (SQLException e) {
if (autoSave == AutoSave.NEVER && autoCommit == AutoCommit.NO) {
@@ -313,7 +382,8 @@ public class AutoRollbackTestSuite extends BaseTest4 {
}
} else if (failMode == FailMode.ALTER) {
if (autoSave == AutoSave.NEVER
- && con.unwrap(PGConnection.class).getPreferQueryMode() != PreferQueryMode.SIMPLE) {
+ && con.unwrap(PGConnection.class).getPreferQueryMode() != PreferQueryMode.SIMPLE
+ && cols == ReturnColumns.STAR) {
Assert.fail("autosave=NEVER, thus the transaction should be killed");
}
} else {
@@ -335,7 +405,7 @@ public class AutoRollbackTestSuite extends BaseTest4 {
con.setAutoCommit(false);
Statement st = con.createStatement();
st.executeUpdate(
- "insert into rollbacktest(a, str) values (42, '" + System.currentTimeMillis() + "')");
+ "insert into rollbacktest(a, str) values (42, '" + System.currentTimeMillis() + "," + counter.getAndIncrement() + "')");
st.close();
}
con.commit();
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/BaseTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/BaseTest.java
deleted file mode 100644
index 99d7120..0000000
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/BaseTest.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright (c) 2004, PostgreSQL Global Development Group
- * See the LICENSE file in the project root for more information.
- */
-
-package org.postgresql.test.jdbc2;
-
-import org.postgresql.PGConnection;
-import org.postgresql.PGProperty;
-import org.postgresql.jdbc.PreferQueryMode;
-import org.postgresql.test.TestUtil;
-
-import junit.framework.TestCase;
-import org.junit.Assume;
-
-import java.sql.Connection;
-import java.sql.SQLException;
-import java.util.Properties;
-
-public class BaseTest extends TestCase {
- protected Connection con;
- protected PreferQueryMode preferQueryMode;
-
- public BaseTest(String name) {
- super(name);
-
- try {
- new org.postgresql.Driver();
- } catch (Exception ex) {
- /* ignore */
- }
- }
-
- protected void updateProperties(Properties props) {
- }
-
- protected void forceBinary(Properties props) {
- PGProperty.PREPARE_THRESHOLD.set(props, -1);
- }
-
- protected void setUp() throws Exception {
- Properties props = new Properties();
- updateProperties(props);
- con = TestUtil.openDB(props);
- PGConnection pg = con.unwrap(PGConnection.class);
- preferQueryMode = pg == null ? PreferQueryMode.EXTENDED : pg.getPreferQueryMode();
- }
-
- protected void tearDown() throws SQLException {
- TestUtil.closeDB(con);
- }
-
- public void assumeByteaSupported() {
- Assume.assumeTrue("bytea is not supported in simple protocol execution mode",
- preferQueryMode.compareTo(PreferQueryMode.EXTENDED) >= 0);
- }
-}
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/BaseTest4.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/BaseTest4.java
index 47af71d..5f11196 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/BaseTest4.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/BaseTest4.java
@@ -7,6 +7,7 @@ package org.postgresql.test.jdbc2;
import org.postgresql.PGConnection;
import org.postgresql.PGProperty;
+import org.postgresql.core.Version;
import org.postgresql.jdbc.PreferQueryMode;
import org.postgresql.test.TestUtil;
@@ -24,18 +25,34 @@ public class BaseTest4 {
REGULAR, FORCE
}
+ public enum ReWriteBatchedInserts {
+ YES, NO
+ }
+
public enum AutoCommit {
YES, NO
}
+ public enum StringType {
+ UNSPECIFIED, VARCHAR;
+ }
+
protected Connection con;
private BinaryMode binaryMode;
+ private ReWriteBatchedInserts reWriteBatchedInserts;
protected PreferQueryMode preferQueryMode;
+ private StringType stringType;
protected void updateProperties(Properties props) {
if (binaryMode == BinaryMode.FORCE) {
forceBinary(props);
}
+ if (reWriteBatchedInserts == ReWriteBatchedInserts.YES) {
+ PGProperty.REWRITE_BATCHED_INSERTS.set(props, true);
+ }
+ if (stringType != null) {
+ PGProperty.STRING_TYPE.set(props, stringType.name().toLowerCase());
+ }
}
protected void forceBinary(Properties props) {
@@ -46,6 +63,19 @@ public class BaseTest4 {
this.binaryMode = binaryMode;
}
+ public StringType getStringType() {
+ return stringType;
+ }
+
+ public void setStringType(StringType stringType) {
+ this.stringType = stringType;
+ }
+
+ public void setReWriteBatchedInserts(
+ ReWriteBatchedInserts reWriteBatchedInserts) {
+ this.reWriteBatchedInserts = reWriteBatchedInserts;
+ }
+
@Before
public void setUp() throws Exception {
Properties props = new Properties();
@@ -69,4 +99,28 @@ public class BaseTest4 {
Assume.assumeTrue("callable statements are not fully supported in simple protocol execution mode",
preferQueryMode.compareTo(PreferQueryMode.EXTENDED) >= 0);
}
+
+ public void assumeBinaryModeRegular() {
+ Assume.assumeTrue(binaryMode == BinaryMode.REGULAR);
+ }
+
+ public void assumeBinaryModeForce() {
+ Assume.assumeTrue(binaryMode == BinaryMode.FORCE);
+ Assume.assumeTrue(preferQueryMode != PreferQueryMode.SIMPLE);
+ }
+
+ /**
+ * Shorthand for {@code Assume.assumeTrue(TestUtil.haveMinimumServerVersion(conn, version)}
+ */
+ public void assumeMinimumServerVersion(String message, Version version) throws SQLException {
+ Assume.assumeTrue(message, TestUtil.haveMinimumServerVersion(con, version));
+ }
+
+ /**
+ * Shorthand for {@code Assume.assumeTrue(TestUtil.haveMinimumServerVersion(conn, version)}
+ */
+ public void assumeMinimumServerVersion(Version version) throws SQLException {
+ Assume.assumeTrue(TestUtil.haveMinimumServerVersion(con, version));
+ }
+
}
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/BatchExecuteTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/BatchExecuteTest.java
index 95535f9..62ffae7 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/BatchExecuteTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/BatchExecuteTest.java
@@ -6,6 +6,7 @@
package org.postgresql.test.jdbc2;
import org.postgresql.PGProperty;
+import org.postgresql.PGStatement;
import org.postgresql.test.TestUtil;
import org.junit.Assert;
@@ -140,6 +141,34 @@ public class BatchExecuteTest extends BaseTest4 {
}
@Test
+ public void testExecuteEmptyPreparedBatch() throws Exception {
+ PreparedStatement ps = null;
+ try {
+ ps = con.prepareStatement("UPDATE testbatch SET col1 = col1 + 1 WHERE pk = 1");
+ int[] updateCount = ps.executeBatch();
+ Assert.assertEquals("Empty batch should update empty result", 0, updateCount.length);
+ } finally {
+ TestUtil.closeQuietly(ps);
+ }
+ }
+
+ @Test
+ public void testPreparedNoParameters() throws SQLException {
+ PreparedStatement ps = null;
+ try {
+ ps = con.prepareStatement("INSERT INTO prep(a) VALUES (1)");
+ ps.addBatch();
+ ps.addBatch();
+ ps.addBatch();
+ ps.addBatch();
+ int[] actual = ps.executeBatch();
+ assertBatchResult("4 rows inserted via batch", new int[]{1, 1, 1, 1}, actual);
+ } finally {
+ TestUtil.closeQuietly(ps);
+ }
+ }
+
+ @Test
public void testClearBatch() throws Exception {
Statement stmt = con.createStatement();
@@ -160,6 +189,31 @@ public class BatchExecuteTest extends BaseTest4 {
}
@Test
+ public void testClearPreparedNoArgBatch() throws Exception {
+ PreparedStatement ps = null;
+ try {
+ ps = con.prepareStatement("INSERT INTO prep(a) VALUES (1)");
+ ps.addBatch();
+ ps.clearBatch();
+ int[] updateCount = ps.executeBatch();
+ Assert.assertEquals("Empty batch should update empty result", 0, updateCount.length);
+ } finally {
+ TestUtil.closeQuietly(ps);
+ }
+ }
+
+ @Test
+ public void testClearPreparedEmptyBatch() throws Exception {
+ PreparedStatement ps = null;
+ try {
+ ps = con.prepareStatement("INSERT INTO prep(a) VALUES (1)");
+ ps.clearBatch();
+ } finally {
+ TestUtil.closeQuietly(ps);
+ }
+ }
+
+ @Test
public void testSelectInBatch() throws Exception {
Statement stmt = con.createStatement();
@@ -1277,4 +1331,50 @@ Server SQLState: 25001)
Arrays.toString(clone),
Arrays.toString(actual));
}
+
+ @Test
+ public void testServerPrepareMultipleRows() throws SQLException {
+ PreparedStatement ps = null;
+ try {
+ ps = con.prepareStatement("INSERT INTO prep(a) VALUES (?)");
+ // 2 is not enough for insertRewrite=true case since it would get executed as a single multi-insert statement
+ for (int i = 0; i < 3; i++) {
+ ps.setInt(1, i);
+ ps.addBatch();
+ }
+ int[] actual = ps.executeBatch();
+ Assert.assertTrue(
+ "More than 1 row is inserted via executeBatch, it should lead to multiple server statements, thus the statements should be server-prepared",
+ ((PGStatement) ps).isUseServerPrepare());
+ assertBatchResult("3 rows inserted via batch", new int[]{1, 1, 1}, actual);
+ } finally {
+ TestUtil.closeQuietly(ps);
+ }
+ }
+
+ @Test
+ public void testNoServerPrepareOneRow() throws SQLException {
+ PreparedStatement ps = null;
+ try {
+ ps = con.prepareStatement("INSERT INTO prep(a) VALUES (?)");
+ ps.setInt(1, 1);
+ ps.addBatch();
+ int[] actual = ps.executeBatch();
+ int prepareThreshold = ((PGStatement) ps).getPrepareThreshold();
+ if (prepareThreshold == 1) {
+ Assert.assertTrue(
+ "prepareThreshold=" + prepareThreshold
+ + " thus the statement should be server-prepared",
+ ((PGStatement) ps).isUseServerPrepare());
+ } else {
+ Assert.assertFalse(
+ "Just one row inserted via executeBatch, prepareThreshold=" + prepareThreshold
+ + " thus the statement should not be server-prepared",
+ ((PGStatement) ps).isUseServerPrepare());
+ }
+ assertBatchResult("1 rows inserted via batch", new int[]{1}, actual);
+ } finally {
+ TestUtil.closeQuietly(ps);
+ }
+ }
}
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/BatchedInsertReWriteEnabledTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/BatchedInsertReWriteEnabledTest.java
index dd72f73..ac38742 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/BatchedInsertReWriteEnabledTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/BatchedInsertReWriteEnabledTest.java
@@ -26,15 +26,19 @@ import java.util.Properties;
public class BatchedInsertReWriteEnabledTest extends BaseTest4 {
private final AutoCommit autoCommit;
- public BatchedInsertReWriteEnabledTest(AutoCommit autoCommit) {
+ public BatchedInsertReWriteEnabledTest(AutoCommit autoCommit,
+ BinaryMode binaryMode) {
this.autoCommit = autoCommit;
+ setBinaryMode(binaryMode);
}
- @Parameterized.Parameters(name = "{index}: autoCommit={0}")
+ @Parameterized.Parameters(name = "{index}: autoCommit={0}, binary={1}")
public static Iterable<Object[]> data() {
Collection<Object[]> ids = new ArrayList<Object[]>();
for (AutoCommit autoCommit : AutoCommit.values()) {
- ids.add(new Object[]{autoCommit});
+ for (BinaryMode binaryMode : BinaryMode.values()) {
+ ids.add(new Object[]{autoCommit, binaryMode});
+ }
}
return ids;
}
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/BlobTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/BlobTest.java
index 696c647..fb1ce7e 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/BlobTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/BlobTest.java
@@ -5,11 +5,19 @@
package org.postgresql.test.jdbc2;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import org.postgresql.core.ServerVersion;
import org.postgresql.largeobject.LargeObject;
import org.postgresql.largeobject.LargeObjectManager;
import org.postgresql.test.TestUtil;
-import junit.framework.TestCase;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
import java.io.InputStream;
import java.io.OutputStream;
@@ -26,24 +34,21 @@ import java.sql.Types;
* Some simple tests based on problems reported by users. Hopefully these will help prevent previous
* problems from re-occurring ;-)
*/
-public class BlobTest extends TestCase {
-
- private Connection con;
-
+public class BlobTest {
private static final int LOOP = 0; // LargeObject API using loop
private static final int NATIVE_STREAM = 1; // LargeObject API using OutputStream
- public BlobTest(String name) {
- super(name);
- }
+ private Connection con;
- protected void setUp() throws Exception {
+ @Before
+ public void setUp() throws Exception {
con = TestUtil.openDB();
TestUtil.createTable(con, "testblob", "id name,lo oid");
con.setAutoCommit(false);
}
- protected void tearDown() throws Exception {
+ @After
+ public void tearDown() throws Exception {
con.setAutoCommit(true);
try {
Statement stmt = con.createStatement();
@@ -61,6 +66,7 @@ public class BlobTest extends TestCase {
}
}
+ @Test
public void testSetNull() throws Exception {
PreparedStatement pstmt = con.prepareStatement("INSERT INTO testblob(lo) VALUES (?)");
@@ -83,6 +89,7 @@ public class BlobTest extends TestCase {
pstmt.executeUpdate();
}
+ @Test
public void testSet() throws SQLException {
Statement stmt = con.createStatement();
stmt.execute("INSERT INTO testblob(id,lo) VALUES ('1', lo_creat(-1))");
@@ -125,6 +132,7 @@ public class BlobTest extends TestCase {
/*
* Tests one method of uploading a blob to the database
*/
+ @Test
public void testUploadBlob_LOOP() throws Exception {
assertTrue(uploadFile("/test-file.xml", LOOP) > 0);
@@ -138,6 +146,7 @@ public class BlobTest extends TestCase {
/*
* Tests one method of uploading a blob to the database
*/
+ @Test
public void testUploadBlob_NATIVE() throws Exception {
assertTrue(uploadFile("/test-file.xml", NATIVE_STREAM) > 0);
@@ -146,6 +155,32 @@ public class BlobTest extends TestCase {
assertTrue(compareBlobs());
}
+ @Test
+ public void testMarkResetStream() throws Exception {
+ assertTrue(uploadFile("/test-file.xml", NATIVE_STREAM) > 0);
+
+ Statement stmt = con.createStatement();
+ ResultSet rs = stmt.executeQuery("SELECT lo FROM testblob");
+ assertTrue(rs.next());
+
+ LargeObjectManager lom = ((org.postgresql.PGConnection) con).getLargeObjectAPI();
+
+ long oid = rs.getLong(1);
+ LargeObject blob = lom.open(oid);
+ InputStream bis = blob.getInputStream();
+
+ assertEquals('<', bis.read());
+ bis.mark(4);
+ assertEquals('?', bis.read());
+ assertEquals('x', bis.read());
+ assertEquals('m', bis.read());
+ assertEquals('l', bis.read());
+ bis.reset();
+ assertEquals('?', bis.read());
+ }
+
+
+ @Test
public void testGetBytesOffset() throws Exception {
assertTrue(uploadFile("/test-file.xml", NATIVE_STREAM) > 0);
@@ -154,7 +189,7 @@ public class BlobTest extends TestCase {
assertTrue(rs.next());
Blob lob = rs.getBlob(1);
- byte data[] = lob.getBytes(2, 4);
+ byte[] data = lob.getBytes(2, 4);
assertEquals(data.length, 4);
assertEquals(data[0], '?');
assertEquals(data[1], 'x');
@@ -162,6 +197,7 @@ public class BlobTest extends TestCase {
assertEquals(data[3], 'l');
}
+ @Test
public void testMultipleStreams() throws Exception {
assertTrue(uploadFile("/test-file.xml", NATIVE_STREAM) > 0);
@@ -170,7 +206,7 @@ public class BlobTest extends TestCase {
assertTrue(rs.next());
Blob lob = rs.getBlob(1);
- byte data[] = new byte[2];
+ byte[] data = new byte[2];
InputStream is = lob.getBinaryStream();
assertEquals(data.length, is.read(data));
@@ -185,6 +221,7 @@ public class BlobTest extends TestCase {
is.close();
}
+ @Test
public void testParallelStreams() throws Exception {
assertTrue(uploadFile("/test-file.xml", NATIVE_STREAM) > 0);
@@ -209,8 +246,9 @@ public class BlobTest extends TestCase {
is2.close();
}
+ @Test
public void testLargeLargeObject() throws Exception {
- if (!TestUtil.haveMinimumServerVersion(con, "9.3")) {
+ if (!TestUtil.haveMinimumServerVersion(con, ServerVersion.v9_3)) {
return;
}
@@ -239,7 +277,7 @@ public class BlobTest extends TestCase {
int s;
int t;
- byte buf[];
+ byte[] buf;
OutputStream os;
switch (method) {
@@ -263,7 +301,7 @@ public class BlobTest extends TestCase {
break;
default:
- assertTrue("Unknown method in uploadFile", false);
+ fail("Unknown method in uploadFile");
}
blob.close();
@@ -311,7 +349,7 @@ public class BlobTest extends TestCase {
result = result && f == -1 && b == -1;
if (!result) {
- assertTrue("Large Object API Blob compare failed at " + c + " of " + blob.size(), false);
+ fail("Large Object API Blob compare failed at " + c + " of " + blob.size());
}
blob.close();
@@ -352,7 +390,7 @@ public class BlobTest extends TestCase {
result = result && f == -1 && b == -1;
if (!result) {
- assertTrue("JDBC API Blob compare failed at " + c + " of " + blob.length(), false);
+ fail("JDBC API Blob compare failed at " + c + " of " + blob.length());
}
bis.close();
@@ -393,7 +431,7 @@ public class BlobTest extends TestCase {
result = result && f == -1 && b == -1;
if (!result) {
- assertTrue("Clob compare failed at " + c + " of " + clob.length(), false);
+ fail("Clob compare failed at " + c + " of " + clob.length());
}
bis.close();
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/BlobTransactionTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/BlobTransactionTest.java
index 13f4133..a009115 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/BlobTransactionTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/BlobTransactionTest.java
@@ -5,9 +5,14 @@
package org.postgresql.test.jdbc2;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
import org.postgresql.test.TestUtil;
-import junit.framework.TestCase;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
@@ -26,16 +31,12 @@ import javax.sql.rowset.serial.SerialBlob;
* Test that oid/lob are accessible in concurrent connection, in presence of the lo_manage trigger
* Require the lo module accessible in $libdir
*/
-public class BlobTransactionTest extends TestCase {
-
+public class BlobTransactionTest {
private Connection con;
private Connection con2;
- public BlobTransactionTest(String name) {
- super(name);
- }
-
- protected void setUp() throws Exception {
+ @Before
+ public void setUp() throws Exception {
con = TestUtil.openDB();
con.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
con2 = TestUtil.openDB();
@@ -73,7 +74,8 @@ public class BlobTransactionTest extends TestCase {
con2.setAutoCommit(false);
}
- protected void tearDown() throws Exception {
+ @After
+ public void tearDown() throws Exception {
TestUtil.closeDB(con2);
con.setAutoCommit(true);
@@ -115,6 +117,7 @@ public class BlobTransactionTest extends TestCase {
return Arrays.copyOf(result, readPos);
}
+ @Test
public void testConcurrentReplace() throws SQLException, IOException {
// Statement stmt = con.createStatement();
// stmt.execute("INSERT INTO testblob(id,lo) VALUES ('1', lo_creat(-1))");
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/CallableStmtTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/CallableStmtTest.java
index 5f28069..1cb9bad 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/CallableStmtTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/CallableStmtTest.java
@@ -35,36 +35,44 @@ public class CallableStmtTest extends BaseTest4 {
super.setUp();
TestUtil.createTable(con, "int_table", "id int");
Statement stmt = con.createStatement();
- stmt.execute("CREATE OR REPLACE FUNCTION testspg__getString (varchar) "
+ stmt.execute(
+ "CREATE OR REPLACE FUNCTION testspg__getString (varchar) "
+ "RETURNS varchar AS ' DECLARE inString alias for $1; begin "
+ "return ''bob''; end; ' LANGUAGE plpgsql;");
- stmt.execute("CREATE OR REPLACE FUNCTION testspg__getDouble (float) "
+ stmt.execute(
+ "CREATE OR REPLACE FUNCTION testspg__getDouble (float) "
+ "RETURNS float AS ' DECLARE inString alias for $1; begin "
+ "return 42.42; end; ' LANGUAGE plpgsql;");
- if (TestUtil.haveMinimumServerVersion(con, "7.3")) {
- stmt.execute("CREATE OR REPLACE FUNCTION testspg__getVoid (float) "
- + "RETURNS void AS ' DECLARE inString alias for $1; begin "
- + " return; end; ' LANGUAGE plpgsql;");
- }
- stmt.execute("CREATE OR REPLACE FUNCTION testspg__getInt (int) RETURNS int "
+ stmt.execute(
+ "CREATE OR REPLACE FUNCTION testspg__getVoid (float) "
+ + "RETURNS void AS ' DECLARE inString alias for $1; begin "
+ + " return; end; ' LANGUAGE plpgsql;");
+ stmt.execute(
+ "CREATE OR REPLACE FUNCTION testspg__getInt (int) RETURNS int "
+ " AS 'DECLARE inString alias for $1; begin "
+ "return 42; end;' LANGUAGE plpgsql;");
- stmt.execute("CREATE OR REPLACE FUNCTION testspg__getShort (int2) RETURNS int2 "
+ stmt.execute(
+ "CREATE OR REPLACE FUNCTION testspg__getShort (int2) RETURNS int2 "
+ " AS 'DECLARE inString alias for $1; begin "
+ "return 42; end;' LANGUAGE plpgsql;");
- stmt.execute("CREATE OR REPLACE FUNCTION testspg__getNumeric (numeric) "
+ stmt.execute(
+ "CREATE OR REPLACE FUNCTION testspg__getNumeric (numeric) "
+ "RETURNS numeric AS ' DECLARE inString alias for $1; "
+ "begin return 42; end; ' LANGUAGE plpgsql;");
- stmt.execute("CREATE OR REPLACE FUNCTION testspg__getNumericWithoutArg() "
+ stmt.execute(
+ "CREATE OR REPLACE FUNCTION testspg__getNumericWithoutArg() "
+ "RETURNS numeric AS ' "
+ "begin return 42; end; ' LANGUAGE plpgsql;");
stmt.execute(
- "CREATE OR REPLACE FUNCTION testspg__getarray() RETURNS int[] as 'SELECT ''{1,2}''::int[];' LANGUAGE sql");
+ "CREATE OR REPLACE FUNCTION testspg__getarray() RETURNS int[] as "
+ + "'SELECT ''{1,2}''::int[];' LANGUAGE sql");
stmt.execute(
- "CREATE OR REPLACE FUNCTION testspg__raisenotice() RETURNS int as 'BEGIN RAISE NOTICE ''hello''; RAISE NOTICE ''goodbye''; RETURN 1; END;' LANGUAGE plpgsql");
+ "CREATE OR REPLACE FUNCTION testspg__raisenotice() RETURNS int as "
+ + "'BEGIN RAISE NOTICE ''hello''; RAISE NOTICE ''goodbye''; RETURN 1; END;' LANGUAGE plpgsql");
stmt.execute(
- "CREATE OR REPLACE FUNCTION testspg__insertInt(int) RETURNS int as 'BEGIN INSERT INTO int_table(id) VALUES ($1); RETURN 1; END;' LANGUAGE plpgsql");
+ "CREATE OR REPLACE FUNCTION testspg__insertInt(int) RETURNS int as "
+ + "'BEGIN INSERT INTO int_table(id) VALUES ($1); RETURN 1; END;' LANGUAGE plpgsql");
stmt.close();
}
@@ -74,9 +82,7 @@ public class CallableStmtTest extends BaseTest4 {
TestUtil.dropTable(con, "int_table");
stmt.execute("drop FUNCTION testspg__getString (varchar);");
stmt.execute("drop FUNCTION testspg__getDouble (float);");
- if (TestUtil.haveMinimumServerVersion(con, "7.3")) {
- stmt.execute("drop FUNCTION testspg__getVoid(float);");
- }
+ stmt.execute("drop FUNCTION testspg__getVoid(float);");
stmt.execute("drop FUNCTION testspg__getInt (int);");
stmt.execute("drop FUNCTION testspg__getShort(int2)");
stmt.execute("drop FUNCTION testspg__getNumeric (numeric);");
@@ -135,11 +141,9 @@ public class CallableStmtTest extends BaseTest4 {
call.setDouble(1, 3.04);
call.execute();
- if (TestUtil.haveMinimumServerVersion(con, "7.3")) {
- call = con.prepareCall("{ call " + pkgName + "getVoid(?) }");
- call.setDouble(1, 3.04);
- call.execute();
- }
+ call = con.prepareCall("{ call " + pkgName + "getVoid(?) }");
+ call.setDouble(1, 3.04);
+ call.execute();
}
@Test
@@ -155,13 +159,11 @@ public class CallableStmtTest extends BaseTest4 {
@Test
public void testGetShort() throws Throwable {
assumeCallableStatementsSupported();
- if (TestUtil.isProtocolVersion(con, 3)) {
- CallableStatement call = con.prepareCall(func + pkgName + "getShort (?) }");
- call.setShort(2, (short) 4);
- call.registerOutParameter(1, Types.SMALLINT);
- call.execute();
- assertEquals(42, call.getShort(1));
- }
+ CallableStatement call = con.prepareCall(func + pkgName + "getShort (?) }");
+ call.setShort(2, (short) 4);
+ call.registerOutParameter(1, Types.SMALLINT);
+ call.execute();
+ assertEquals(42, call.getShort(1));
}
@Test
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/ClientEncodingTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/ClientEncodingTest.java
new file mode 100644
index 0000000..117b399
--- /dev/null
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/ClientEncodingTest.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright (c) 2018, PostgreSQL Global Development Group
+ * See the LICENSE file in the project root for more information.
+ */
+
+package org.postgresql.test.jdbc2;
+
+import org.postgresql.PGProperty;
+import org.postgresql.test.TestUtil;
+import org.postgresql.util.PSQLState;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.Arrays;
+import java.util.Properties;
+
+ at RunWith(Parameterized.class)
+public class ClientEncodingTest extends BaseTest4 {
+
+ @Parameterized.Parameter(0)
+ public boolean allowEncodingChanges;
+
+ @Override
+ protected void updateProperties(Properties props) {
+ super.updateProperties(props);
+ PGProperty.ALLOW_ENCODING_CHANGES.set(props, allowEncodingChanges);
+ }
+
+ @Parameterized.Parameters(name = "allowEncodingChanges={0}")
+ public static Iterable<Object[]> data() {
+ return Arrays.asList(new Object[][]{
+ {true},
+ {false}
+ });
+ }
+
+ @Test
+ public void setEncodingUtf8() throws SQLException {
+ // UTF-8 is a default encoding, so it should always be safe to set encoding to UTF-8
+ setEncoding("UTF-8");
+
+ checkConnectionSanity();
+ }
+
+ @Test
+ public void setEncodingAscii() throws SQLException {
+ try {
+ setEncoding("sql_ascii");
+ if (!allowEncodingChanges) {
+ Assert.fail(
+ "allowEncodingChanges is false, thus set client_encoding=aql_ascii is expected to fail");
+ }
+ } catch (SQLException e) {
+ if (!allowEncodingChanges && !PSQLState.CONNECTION_FAILURE.getState()
+ .equals(e.getSQLState())) {
+ throw e;
+ }
+ Assert.assertTrue("Connection should be closed on client_encoding change", con.isClosed());
+ return;
+ }
+
+ checkConnectionSanity();
+ }
+
+ private void checkConnectionSanity() throws SQLException {
+ Statement st = con.createStatement();
+ ResultSet rs = st.executeQuery("select 'abc' as x");
+ rs.next();
+ Assert.assertEquals("abc", rs.getString(1));
+ TestUtil.closeQuietly(rs);
+ TestUtil.closeQuietly(st);
+ }
+
+ private void setEncoding(String encoding) throws SQLException {
+ Statement st = con.createStatement();
+ st.execute("set client_encoding='" + encoding + "'");
+ TestUtil.closeQuietly(st);
+ }
+}
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/ColumnSanitiserDisabledTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/ColumnSanitiserDisabledTest.java
index 3302089..6bae461 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/ColumnSanitiserDisabledTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/ColumnSanitiserDisabledTest.java
@@ -5,10 +5,15 @@
package org.postgresql.test.jdbc2;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
import org.postgresql.core.BaseConnection;
import org.postgresql.test.TestUtil;
-import junit.framework.TestCase;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
import java.sql.Connection;
import java.sql.PreparedStatement;
@@ -20,14 +25,11 @@ import java.util.Properties;
* This test suite will check the behaviour of the findColumnIndex method. This is testing the
* behaviour when sanitiser is disabled.
*/
-public class ColumnSanitiserDisabledTest extends TestCase {
+public class ColumnSanitiserDisabledTest {
private Connection conn;
- public ColumnSanitiserDisabledTest(String name) {
- super(name);
- }
-
- protected void setUp() throws Exception {
+ @Before
+ public void setUp() throws Exception {
Properties props = new Properties();
props.setProperty("disableColumnSanitiser", Boolean.TRUE.toString());
conn = TestUtil.openDB(props);
@@ -46,7 +48,8 @@ public class ColumnSanitiserDisabledTest extends TestCase {
data.close();
}
- protected void tearDown() throws Exception {
+ @After
+ public void tearDown() throws Exception {
TestUtil.dropTable(conn, "allmixedup");
TestUtil.closeDB(conn);
System.setProperty("disableColumnSanitiser", "false");
@@ -57,45 +60,54 @@ public class ColumnSanitiserDisabledTest extends TestCase {
* application supplied column names.
*/
+ @Test
public void testTableColumnLowerNowFindFindLowerCaseColumn() throws SQLException {
findColumn("id", true);
}
+ @Test
public void testTableColumnLowerNowFindFindUpperCaseColumn() throws SQLException {
findColumn("ID", true);
}
+ @Test
public void testTableColumnLowerNowFindFindMixedCaseColumn() throws SQLException {
findColumn("Id", false);
}
+ @Test
public void testTableColumnUpperNowFindFindLowerCaseColumn() throws SQLException {
findColumn("description", true);
}
+ @Test
public void testTableColumnUpperNowFindFindUpperCaseColumn() throws SQLException {
findColumn("DESCRIPTION", true);
}
+ @Test
public void testTableColumnUpperNowFindFindMixedCaseColumn() throws SQLException {
findColumn("Description", false);
}
+ @Test
public void testTableColumnMixedNowFindLowerCaseColumn() throws SQLException {
findColumn("foo", false);
}
+ @Test
public void testTableColumnMixedNowFindFindUpperCaseColumn() throws SQLException {
findColumn("FOO", false);
}
+ @Test
public void testTableColumnMixedNowFindFindMixedCaseColumn() throws SQLException {
findColumn("fOo", true);
}
private void findColumn(String label, boolean failOnNotFound) throws SQLException {
PreparedStatement query = conn.prepareStatement("select * from allmixedup");
- if (0 == TestUtil.findColumn(query, label) && failOnNotFound) {
+ if ((TestUtil.findColumn(query, label) == 0) && failOnNotFound) {
fail(String.format("Expected to find the column with the label [%1$s].", label));
}
query.close();
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/ColumnSanitiserEnabledTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/ColumnSanitiserEnabledTest.java
index 01034fb..c4c04a9 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/ColumnSanitiserEnabledTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/ColumnSanitiserEnabledTest.java
@@ -5,10 +5,15 @@
package org.postgresql.test.jdbc2;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
import org.postgresql.core.BaseConnection;
import org.postgresql.test.TestUtil;
-import junit.framework.TestCase;
+import org.junit.Before;
+import org.junit.Test;
import java.sql.Connection;
import java.sql.PreparedStatement;
@@ -20,14 +25,11 @@ import java.util.Properties;
* This test suite will check the behaviour of the findColumnIndex method. The tests will check the
* behaviour of the method when the sanitiser is enabled. Default behaviour of the driver.
*/
-public class ColumnSanitiserEnabledTest extends TestCase {
+public class ColumnSanitiserEnabledTest {
private Connection conn;
- public ColumnSanitiserEnabledTest(String name) {
- super(name);
- }
-
- protected void setUp() throws Exception {
+ @Before
+ public void setUp() throws Exception {
Properties props = new Properties();
props.setProperty("disableColumnSanitiser", Boolean.FALSE.toString());
conn = TestUtil.openDB(props);
@@ -52,45 +54,54 @@ public class ColumnSanitiserEnabledTest extends TestCase {
* application supplied column names.
*/
+ @Test
public void testTableColumnLowerNowFindFindLowerCaseColumn() throws SQLException {
findColumn("id", true);
}
+ @Test
public void testTableColumnLowerNowFindFindUpperCaseColumn() throws SQLException {
findColumn("ID", true);
}
+ @Test
public void testTableColumnLowerNowFindFindMixedCaseColumn() throws SQLException {
findColumn("Id", true);
}
+ @Test
public void testTableColumnUpperNowFindFindLowerCaseColumn() throws SQLException {
findColumn("description", true);
}
+ @Test
public void testTableColumnUpperNowFindFindUpperCaseColumn() throws SQLException {
findColumn("DESCRIPTION", true);
}
+ @Test
public void testTableColumnUpperNowFindFindMixedCaseColumn() throws SQLException {
findColumn("Description", true);
}
+ @Test
public void testTableColumnMixedNowFindLowerCaseColumn() throws SQLException {
findColumn("foo", true);
}
+ @Test
public void testTableColumnMixedNowFindFindUpperCaseColumn() throws SQLException {
findColumn("FOO", true);
}
+ @Test
public void testTableColumnMixedNowFindFindMixedCaseColumn() throws SQLException {
findColumn("fOo", true);
}
private void findColumn(String label, boolean failOnNotFound) throws SQLException {
PreparedStatement query = conn.prepareStatement("select * from allmixedup");
- if (0 == TestUtil.findColumn(query, label) && failOnNotFound) {
+ if ((TestUtil.findColumn(query, label) == 0) && failOnNotFound) {
fail(String.format("Expected to find the column with the label [%1$s].", label));
}
query.close();
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/ConcurrentStatementFetch.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/ConcurrentStatementFetch.java
new file mode 100644
index 0000000..74c6bc6
--- /dev/null
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/ConcurrentStatementFetch.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright (c) 2017, PostgreSQL Global Development Group
+ * See the LICENSE file in the project root for more information.
+ */
+
+package org.postgresql.test.jdbc2;
+
+import org.postgresql.core.ServerVersion;
+import org.postgresql.test.TestUtil;
+
+import org.junit.Assert;
+import org.junit.Assume;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.util.ArrayList;
+import java.util.Collection;
+
+ at RunWith(Parameterized.class)
+public class ConcurrentStatementFetch extends BaseTest4 {
+
+ private final AutoCommit autoCommit;
+ private final int fetchSize;
+
+ public ConcurrentStatementFetch(AutoCommit autoCommit, int fetchSize, BinaryMode binaryMode) {
+ this.autoCommit = autoCommit;
+ this.fetchSize = fetchSize;
+ setBinaryMode(binaryMode);
+ }
+
+ @Parameterized.Parameters(name = "{index}: fetch(autoCommit={0}, fetchSize={1}, binaryMode={2})")
+ public static Iterable<Object[]> data() {
+ Collection<Object[]> ids = new ArrayList<Object[]>();
+ for (AutoCommit autoCommit : AutoCommit.values()) {
+ for (int fetchSize : new int[]{1, 2, 20}) {
+ for (BinaryMode binaryMode : BinaryMode.values()) {
+ ids.add(new Object[]{autoCommit, fetchSize, binaryMode});
+ }
+ }
+ }
+ return ids;
+ }
+
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+ con.setAutoCommit(autoCommit == AutoCommit.YES);
+ }
+
+ @Test
+ public void testFetchTwoStatements() throws Exception {
+ // This test definitely fails at 8.2 in autocommit=false, and works with 8.4+
+ Assume.assumeTrue(autoCommit == AutoCommit.YES
+ || TestUtil.haveMinimumServerVersion(con, ServerVersion.v8_4));
+ PreparedStatement ps1 = null;
+ PreparedStatement ps2 = null;
+ try {
+ ps1 = con.prepareStatement("select * from generate_series(0, 9)");
+ ps1.setFetchSize(fetchSize);
+ ResultSet rs1 = ps1.executeQuery();
+ ps2 = con.prepareStatement("select * from generate_series(10, 19)");
+ ps2.setFetchSize(fetchSize);
+ ResultSet rs2 = ps2.executeQuery();
+
+ for (int i = 0; i < 10; i++) {
+ Assert.assertTrue(rs1.next());
+ Assert.assertTrue(rs2.next());
+ Assert.assertEquals("Row#" + i + ", resultset 1", i, rs1.getInt(1));
+ Assert.assertEquals("Row#" + i + ", resultset 2", i + 10, rs2.getInt(1));
+ }
+ Assert.assertFalse(rs1.next());
+ Assert.assertFalse(rs2.next());
+ } finally {
+ TestUtil.closeQuietly(ps1);
+ TestUtil.closeQuietly(ps2);
+ }
+ }
+}
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/ConnectTimeoutTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/ConnectTimeoutTest.java
index 22d5634..417c068 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/ConnectTimeoutTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/ConnectTimeoutTest.java
@@ -5,27 +5,32 @@
package org.postgresql.test.jdbc2;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
import org.postgresql.test.TestUtil;
-import junit.framework.TestCase;
+import org.junit.Before;
+import org.junit.Test;
import java.net.SocketTimeoutException;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;
-public class ConnectTimeoutTest extends TestCase {
+
+public class ConnectTimeoutTest {
// The IP below is non-routable (see http://stackoverflow.com/a/904609/1261287)
private static final String UNREACHABLE_HOST = "10.255.255.1";
private static final String UNREACHABLE_URL = "jdbc:postgresql://" + UNREACHABLE_HOST + ":5432/test";
private static final int CONNECT_TIMEOUT = 5;
- @Override
- protected void setUp() throws Exception {
- super.setUp();
+ @Before
+ public void setUp() throws Exception {
TestUtil.initDriver();
}
+ @Test
public void testTimeout() {
final Properties props = new Properties();
props.setProperty("user", "test");
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/ConnectionTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/ConnectionTest.java
index b03f756..a0e211b 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/ConnectionTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/ConnectionTest.java
@@ -5,10 +5,18 @@
package org.postgresql.test.jdbc2;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
import org.postgresql.jdbc.PgConnection;
import org.postgresql.test.TestUtil;
-import junit.framework.TestCase;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
import java.sql.Connection;
import java.sql.PreparedStatement;
@@ -19,25 +27,16 @@ import java.sql.Statement;
import java.util.HashMap;
import java.util.Map;
-/*
+/**
* TestCase to test the internal functionality of org.postgresql.jdbc2.Connection and it's
* superclass.
- *
*/
-
-public class ConnectionTest extends TestCase {
-
+public class ConnectionTest {
private Connection con;
- /*
- * Constructor
- */
- public ConnectionTest(String name) {
- super(name);
- }
-
// Set up the fixture for this testcase: the tables for this test.
- protected void setUp() throws Exception {
+ @Before
+ public void setUp() throws Exception {
con = TestUtil.openDB();
TestUtil.createTable(con, "test_a", "imagename name,image oid,id int4");
@@ -47,7 +46,8 @@ public class ConnectionTest extends TestCase {
}
// Tear down the fixture for this test case.
- protected void tearDown() throws Exception {
+ @After
+ public void tearDown() throws Exception {
TestUtil.closeDB(con);
con = TestUtil.openDB();
@@ -61,6 +61,7 @@ public class ConnectionTest extends TestCase {
/*
* Tests the two forms of createStatement()
*/
+ @Test
public void testCreateStatement() throws Exception {
con = TestUtil.openDB();
@@ -78,6 +79,7 @@ public class ConnectionTest extends TestCase {
/*
* Tests the two forms of prepareStatement()
*/
+ @Test
public void testPrepareStatement() throws Exception {
con = TestUtil.openDB();
@@ -97,12 +99,14 @@ public class ConnectionTest extends TestCase {
/*
* Put the test for createPrepareCall here
*/
+ @Test
public void testPrepareCall() {
}
/*
* Test nativeSQL
*/
+ @Test
public void testNativeSQL() throws Exception {
// test a simple escape
con = TestUtil.openDB();
@@ -112,6 +116,7 @@ public class ConnectionTest extends TestCase {
/*
* Test autoCommit (both get & set)
*/
+ @Test
public void testTransactions() throws Exception {
con = TestUtil.openDB();
Statement st;
@@ -153,6 +158,7 @@ public class ConnectionTest extends TestCase {
/*
* Simple test to see if isClosed works.
*/
+ @Test
public void testIsClosed() throws Exception {
con = TestUtil.openDB();
@@ -168,6 +174,7 @@ public class ConnectionTest extends TestCase {
/*
* Test the warnings system
*/
+ @Test
public void testWarnings() throws Exception {
con = TestUtil.openDB();
@@ -189,7 +196,7 @@ public class ConnectionTest extends TestCase {
// Finally test clearWarnings() this time there must be something to delete
con.clearWarnings();
- assertTrue(con.getWarnings() == null);
+ assertNull(con.getWarnings());
TestUtil.closeDB(con);
}
@@ -197,6 +204,7 @@ public class ConnectionTest extends TestCase {
/*
* Transaction Isolation Levels
*/
+ @Test
public void testTransactionIsolation() throws Exception {
con = TestUtil.openDB();
@@ -260,6 +268,7 @@ public class ConnectionTest extends TestCase {
/*
* JDBC2 Type mappings
*/
+ @Test
public void testTypeMaps() throws Exception {
con = TestUtil.openDB();
@@ -281,6 +290,7 @@ public class ConnectionTest extends TestCase {
/**
* Closing a Connection more than once is not an error.
*/
+ @Test
public void testDoubleClose() throws Exception {
con = TestUtil.openDB();
con.close();
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/CopyBothResponseTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/CopyBothResponseTest.java
new file mode 100644
index 0000000..66defae
--- /dev/null
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/CopyBothResponseTest.java
@@ -0,0 +1,208 @@
+/*
+ * Copyright (c) 2004, PostgreSQL Global Development Group
+ * See the LICENSE file in the project root for more information.
+ */
+
+package org.postgresql.test.jdbc2;
+
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.junit.Assert.assertThat;
+
+import org.postgresql.PGConnection;
+import org.postgresql.PGProperty;
+import org.postgresql.copy.CopyDual;
+import org.postgresql.copy.CopyManager;
+import org.postgresql.core.BaseConnection;
+import org.postgresql.core.ServerVersion;
+import org.postgresql.replication.LogSequenceNumber;
+import org.postgresql.test.TestUtil;
+import org.postgresql.test.util.rules.ServerVersionRule;
+import org.postgresql.test.util.rules.annotation.HaveMinimalServerVersion;
+
+import org.hamcrest.CoreMatchers;
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Rule;
+import org.junit.Test;
+
+import java.nio.ByteBuffer;
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.Properties;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * CopyBothResponse use since 9.1 PostgreSQL version for replication protocol
+ */
+ at HaveMinimalServerVersion("9.4")
+public class CopyBothResponseTest {
+ @Rule
+ public ServerVersionRule versionRule = new ServerVersionRule();
+
+ private Connection sqlConnection;
+ private Connection replConnection;
+
+ @BeforeClass
+ public static void beforeClass() throws Exception {
+ Connection con = TestUtil.openDB();
+ TestUtil.createTable(con, "testreplication", "pk serial primary key, name varchar(100)");
+ con.close();
+ }
+
+ @AfterClass
+ public static void testAfterClass() throws Exception {
+ Connection con = TestUtil.openDB();
+ TestUtil.dropTable(con, "testreplication");
+ con.close();
+ }
+
+ @Before
+ public void setUp() throws Exception {
+ sqlConnection = TestUtil.openDB();
+ replConnection = openReplicationConnection();
+ replConnection.setAutoCommit(true);
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ sqlConnection.close();
+ replConnection.close();
+ }
+
+ @Test
+ public void testOpenConnectByReplicationProtocol() throws Exception {
+ CopyManager cm = ((PGConnection) replConnection).getCopyAPI();
+
+ LogSequenceNumber logSequenceNumber = getCurrentLSN();
+ CopyDual copyDual = cm.copyDual(
+ "START_REPLICATION " + logSequenceNumber.asString());
+ try {
+ assertThat(
+ "Replication protocol work via copy protocol and initialize as CopyBothResponse, "
+ + "we want that first initialize will work",
+ copyDual, CoreMatchers.notNullValue()
+ );
+ } finally {
+ copyDual.endCopy();
+ }
+ }
+
+ @Test
+ public void testReceiveKeepAliveMessage() throws Exception {
+ CopyManager cm = ((PGConnection) replConnection).getCopyAPI();
+
+ LogSequenceNumber logSequenceNumber = getCurrentLSN();
+ CopyDual copyDual = cm.copyDual(
+ "START_REPLICATION " + logSequenceNumber.asString());
+
+ sendStandByUpdate(copyDual, logSequenceNumber, logSequenceNumber, logSequenceNumber, true);
+ ByteBuffer buf = ByteBuffer.wrap(copyDual.readFromCopy());
+
+ int code = buf.get();
+ copyDual.endCopy();
+
+ assertThat(
+ "Streaming replication start with swap keep alive message, we want that first get packege will be keep alive",
+ code, equalTo((int) 'k')
+ );
+ }
+
+ @Test
+ public void testKeedAliveContaintCorrectLSN() throws Exception {
+ CopyManager cm = ((PGConnection) replConnection).getCopyAPI();
+
+ LogSequenceNumber startLsn = getCurrentLSN();
+ CopyDual copyDual =
+ cm.copyDual("START_REPLICATION " + startLsn.asString());
+ sendStandByUpdate(copyDual, startLsn, startLsn, startLsn, true);
+
+ ByteBuffer buf = ByteBuffer.wrap(copyDual.readFromCopy());
+
+ int code = buf.get();
+ LogSequenceNumber lastLSN = LogSequenceNumber.valueOf(buf.getLong());
+ copyDual.endCopy();
+
+ assertThat(
+ "Keep alive message contain last lsn on server, we want that before start replication "
+ + "and get keep alive message not occurs wal modifications",
+ lastLSN, CoreMatchers.equalTo(startLsn)
+ );
+ }
+
+ @Test
+ public void testReceiveXLogData() throws Exception {
+ CopyManager cm = ((PGConnection) replConnection).getCopyAPI();
+
+ LogSequenceNumber startLsn = getCurrentLSN();
+
+ Statement st = sqlConnection.createStatement();
+ st.execute("insert into testreplication(name) values('testing get changes')");
+ st.close();
+
+ CopyDual copyDual =
+ cm.copyDual("START_REPLICATION " + startLsn.asString());
+ sendStandByUpdate(copyDual, startLsn, startLsn, startLsn, false);
+
+ ByteBuffer buf = ByteBuffer.wrap(copyDual.readFromCopy());
+
+ char code = (char) buf.get();
+ copyDual.endCopy();
+
+ assertThat(
+ "When replication starts via slot and specify LSN that lower than last LSN on server, "
+ + "we should get all changes that occurs beetween two LSN",
+ code, equalTo('w')
+ );
+ }
+
+ private void sendStandByUpdate(CopyDual copyDual, LogSequenceNumber received,
+ LogSequenceNumber flushed, LogSequenceNumber applied, boolean replyRequired)
+ throws SQLException {
+ ByteBuffer response = ByteBuffer.allocate(1 + 8 + 8 + 8 + 8 + 1);
+ response.put((byte) 'r');
+ response.putLong(received.asLong()); //received
+ response.putLong(flushed.asLong()); //flushed
+ response.putLong(applied.asLong()); //applied
+ response.putLong(TimeUnit.MICROSECONDS.convert((System.currentTimeMillis() - 946674000000L),
+ TimeUnit.MICROSECONDS));
+ response.put(replyRequired ? (byte) 1 : (byte) 0); //reply soon as possible
+
+ byte[] standbyUpdate = response.array();
+ copyDual.writeToCopy(standbyUpdate, 0, standbyUpdate.length);
+ copyDual.flushCopy();
+ }
+
+ private LogSequenceNumber getCurrentLSN() throws SQLException {
+ Statement st = sqlConnection.createStatement();
+ ResultSet rs = null;
+ try {
+ rs = st.executeQuery("select "
+ + (((BaseConnection) sqlConnection).haveMinimumServerVersion(ServerVersion.v10)
+ ? "pg_current_wal_lsn()" : "pg_current_xlog_location()"));
+
+ if (rs.next()) {
+ String lsn = rs.getString(1);
+ return LogSequenceNumber.valueOf(lsn);
+ } else {
+ return LogSequenceNumber.INVALID_LSN;
+ }
+ } finally {
+ if (rs != null) {
+ rs.close();
+ }
+ st.close();
+ }
+ }
+
+ private Connection openReplicationConnection() throws Exception {
+ Properties properties = new Properties();
+ PGProperty.ASSUME_MIN_SERVER_VERSION.set(properties, "9.4");
+ PGProperty.PROTOCOL_VERSION.set(properties, "3");
+ PGProperty.REPLICATION.set(properties, "database");
+ return TestUtil.openDB(properties);
+ }
+}
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/CopyLargeFileTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/CopyLargeFileTest.java
index 6594167..bd07d6d 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/CopyLargeFileTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/CopyLargeFileTest.java
@@ -5,13 +5,17 @@
package org.postgresql.test.jdbc2;
+import static org.junit.Assert.assertEquals;
+
import org.postgresql.PGConnection;
import org.postgresql.copy.CopyManager;
import org.postgresql.test.TestUtil;
import org.postgresql.test.util.BufferGenerator;
import org.postgresql.test.util.StrangeInputStream;
-import junit.framework.TestCase;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
import java.io.File;
import java.io.FileInputStream;
@@ -22,19 +26,17 @@ import java.sql.PreparedStatement;
import java.sql.SQLException;
/**
- * Created by amozhenin on 30.09.2015.
+ * @author amozhenin on 30.09.2015.
*/
-public class CopyLargeFileTest extends TestCase {
+public class CopyLargeFileTest {
private static final int FEED_COUNT = 10;
private Connection con;
private CopyManager copyAPI;
-
- protected void setUp() throws Exception {
- super.setUp();
-
+ @Before
+ public void setUp() throws Exception {
con = TestUtil.openDB();
TestUtil.createTable(con, "pgjdbc_issue366_test_glossary",
@@ -66,8 +68,8 @@ public class CopyLargeFileTest extends TestCase {
stmt.executeUpdate();
}
- protected void tearDown() throws Exception {
- super.tearDown();
+ @After
+ public void tearDown() throws Exception {
try {
TestUtil.dropTable(con, "pgjdbc_issue366_test_data");
TestUtil.dropTable(con, "pgjdbc_issue366_test_glossary");
@@ -77,6 +79,7 @@ public class CopyLargeFileTest extends TestCase {
}
}
+ @Test
public void testFeedTableSeveralTimesTest() throws Exception {
for (int i = 1; i <= FEED_COUNT; i++) {
feedTableAndCheckTableFeedIsOk(con);
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/CopyTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/CopyTest.java
index 3e0feef..01f9e80 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/CopyTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/CopyTest.java
@@ -5,6 +5,11 @@
package org.postgresql.test.jdbc2;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
import org.postgresql.PGConnection;
import org.postgresql.copy.CopyIn;
import org.postgresql.copy.CopyManager;
@@ -14,7 +19,9 @@ import org.postgresql.core.ServerVersion;
import org.postgresql.test.TestUtil;
import org.postgresql.util.PSQLState;
-import junit.framework.TestCase;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
@@ -32,8 +39,7 @@ import java.sql.Statement;
/**
* @author kato at iki.fi
*/
-public class CopyTest extends TestCase {
-
+public class CopyTest {
private Connection con;
private CopyManager copyAPI;
private String copyParams;
@@ -45,10 +51,6 @@ public class CopyTest extends TestCase {
"\t4\t444.40\n"};
private int dataRows = origData.length;
- public CopyTest(String name) {
- super(name);
- }
-
private byte[] getData(String[] origData) {
ByteArrayOutputStream buf = new ByteArrayOutputStream();
PrintStream ps = new PrintStream(buf);
@@ -58,7 +60,8 @@ public class CopyTest extends TestCase {
return buf.toByteArray();
}
- protected void setUp() throws Exception {
+ @Before
+ public void setUp() throws Exception {
con = TestUtil.openDB();
TestUtil.createTable(con, "copytest", "stringvalue text, intvalue int, numvalue numeric(5,2)");
@@ -71,7 +74,8 @@ public class CopyTest extends TestCase {
}
}
- protected void tearDown() throws Exception {
+ @After
+ public void tearDown() throws Exception {
TestUtil.closeDB(con);
// one of the tests will render the existing connection broken,
@@ -93,22 +97,19 @@ public class CopyTest extends TestCase {
return result;
}
+ @Test
public void testCopyInByRow() throws SQLException {
String sql = "COPY copytest FROM STDIN";
CopyIn cp = copyAPI.copyIn(sql);
- for (int i = 0; i < origData.length; i++) {
- byte[] buf = origData[i].getBytes();
+ for (String anOrigData : origData) {
+ byte[] buf = anOrigData.getBytes();
cp.writeToCopy(buf, 0, buf.length);
}
long count1 = cp.endCopy();
long count2 = cp.getHandledRowCount();
- long expectedResult = -1;
- if (TestUtil.haveMinimumServerVersion(con, "8.2")) {
- expectedResult = dataRows;
- }
- assertEquals(expectedResult, count1);
- assertEquals(expectedResult, count2);
+ assertEquals(dataRows, count1);
+ assertEquals(dataRows, count2);
try {
cp.cancelCopy();
@@ -121,11 +122,12 @@ public class CopyTest extends TestCase {
assertEquals(dataRows, rowCount);
}
+ @Test
public void testCopyInAsOutputStream() throws SQLException, IOException {
String sql = "COPY copytest FROM STDIN";
OutputStream os = new PGCopyOutputStream((PGConnection) con, sql, 1000);
- for (int i = 0; i < origData.length; i++) {
- byte[] buf = origData[i].getBytes();
+ for (String anOrigData : origData) {
+ byte[] buf = anOrigData.getBytes();
os.write(buf);
}
os.close();
@@ -133,6 +135,7 @@ public class CopyTest extends TestCase {
assertEquals(dataRows, rowCount);
}
+ @Test
public void testCopyInFromInputStream() throws SQLException, IOException {
String sql = "COPY copytest FROM STDIN";
copyAPI.copyIn(sql, new ByteArrayInputStream(getData(origData)), 3);
@@ -140,6 +143,7 @@ public class CopyTest extends TestCase {
assertEquals(dataRows, rowCount);
}
+ @Test
public void testCopyInFromStreamFail() throws SQLException {
String sql = "COPY copytest FROM STDIN";
try {
@@ -157,6 +161,7 @@ public class CopyTest extends TestCase {
assertEquals(0, rowCount);
}
+ @Test
public void testCopyInFromReader() throws SQLException, IOException {
String sql = "COPY copytest FROM STDIN";
copyAPI.copyIn(sql, new StringReader(new String(getData(origData))), 3);
@@ -164,6 +169,7 @@ public class CopyTest extends TestCase {
assertEquals(dataRows, rowCount);
}
+ @Test
public void testSkipping() {
String sql = "COPY copytest FROM STDIN";
String at = "init";
@@ -191,12 +197,13 @@ public class CopyTest extends TestCase {
assertEquals(dataRows * (skip - 1), rowCount);
}
+ @Test
public void testCopyOutByRow() throws SQLException, IOException {
testCopyInByRow(); // ensure we have some data.
String sql = "COPY copytest TO STDOUT";
CopyOut cp = copyAPI.copyOut(sql);
int count = 0;
- byte buf[];
+ byte[] buf;
while ((buf = cp.readFromCopy()) != null) {
count++;
}
@@ -204,15 +211,13 @@ public class CopyTest extends TestCase {
assertEquals(dataRows, count);
long rowCount = cp.getHandledRowCount();
- long expectedResult = -1;
- if (TestUtil.haveMinimumServerVersion(con, "8.2")) {
- expectedResult = dataRows;
- }
- assertEquals(expectedResult, rowCount);
+
+ assertEquals(dataRows, rowCount);
assertEquals(dataRows, getCount());
}
+ @Test
public void testCopyOut() throws SQLException, IOException {
testCopyInByRow(); // ensure we have some data.
String sql = "COPY copytest TO STDOUT";
@@ -221,10 +226,9 @@ public class CopyTest extends TestCase {
assertEquals(dataRows, getCount());
// deep comparison of data written and read
byte[] copybytes = copydata.toByteArray();
- assertTrue(copybytes != null);
+ assertNotNull(copybytes);
for (int i = 0, l = 0; i < origData.length; i++) {
byte[] origBytes = origData[i].getBytes();
- assertTrue(origBytes != null);
assertTrue("Copy is shorter than original", copybytes.length >= l + origBytes.length);
for (int j = 0; j < origBytes.length; j++, l++) {
assertEquals("content changed at byte#" + j + ": " + origBytes[j] + copybytes[l],
@@ -233,6 +237,7 @@ public class CopyTest extends TestCase {
}
}
+ @Test
public void testNonCopyOut() throws SQLException, IOException {
String sql = "SELECT 1";
try {
@@ -244,6 +249,7 @@ public class CopyTest extends TestCase {
assertEquals(0, getCount());
}
+ @Test
public void testNonCopyIn() throws SQLException, IOException {
String sql = "SELECT 1";
try {
@@ -255,6 +261,7 @@ public class CopyTest extends TestCase {
assertEquals(0, getCount());
}
+ @Test
public void testStatementCopyIn() throws SQLException {
Statement stmt = con.createStatement();
try {
@@ -267,6 +274,7 @@ public class CopyTest extends TestCase {
assertEquals(0, getCount());
}
+ @Test
public void testStatementCopyOut() throws SQLException {
testCopyInByRow(); // ensure we have some data.
@@ -281,11 +289,8 @@ public class CopyTest extends TestCase {
assertEquals(dataRows, getCount());
}
+ @Test
public void testCopyQuery() throws SQLException, IOException {
- if (!TestUtil.haveMinimumServerVersion(con, "8.2")) {
- return;
- }
-
testCopyInByRow(); // ensure we have some data.
long count = copyAPI.copyOut("COPY (SELECT generate_series(1,1000)) TO STDOUT",
@@ -293,6 +298,7 @@ public class CopyTest extends TestCase {
assertEquals(1000, count);
}
+ @Test
public void testCopyRollback() throws SQLException {
con.setAutoCommit(false);
testCopyInByRow();
@@ -300,9 +306,8 @@ public class CopyTest extends TestCase {
assertEquals(0, getCount());
}
+ @Test
public void testChangeDateStyle() throws SQLException {
-
-
try {
con.setAutoCommit(false);
con.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);
@@ -316,8 +321,8 @@ public class CopyTest extends TestCase {
// I expect an SQLException
String sql = "COPY copytest FROM STDIN with xxx " + copyParams;
CopyIn cp = manager.copyIn(sql);
- for (int i = 0; i < origData.length; i++) {
- byte[] buf = origData[i].getBytes();
+ for (String anOrigData : origData) {
+ byte[] buf = anOrigData.getBytes();
cp.writeToCopy(buf, 0, buf.length);
}
@@ -333,7 +338,13 @@ public class CopyTest extends TestCase {
}
}
+ @Test
public void testLockReleaseOnCancelFailure() throws SQLException, InterruptedException {
+ if (!TestUtil.haveMinimumServerVersion(con, ServerVersion.v8_4)) {
+ // pg_backend_pid() requires PostgreSQL 8.4+
+ return;
+ }
+
// This is a fairly complex test because it is testing a
// deadlock that only occurs when the connection to postgres
// is broken during a copy operation. We'll start a copy
@@ -376,11 +387,11 @@ public class CopyTest extends TestCase {
rollback.start();
rollback.join(1000);
if (rollback.isAlive()) {
- TestCase.fail("rollback did not terminate");
+ fail("rollback did not terminate");
}
SQLException rollbackException = rollback.exception();
if (rollbackException == null) {
- TestCase.fail("rollback should have thrown an exception");
+ fail("rollback should have thrown an exception");
}
acceptIOCause(rollbackException);
}
@@ -389,12 +400,13 @@ public class CopyTest extends TestCase {
private final Connection con;
private SQLException rollbackException;
- public Rollback(Connection con) {
+ Rollback(Connection con) {
setName("Asynchronous rollback");
setDaemon(true);
this.con = con;
}
+ @Override
public void run() {
try {
con.rollback();
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/CursorFetchTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/CursorFetchTest.java
index d9d0a90..6f66898 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/CursorFetchTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/CursorFetchTest.java
@@ -5,28 +5,50 @@
package org.postgresql.test.jdbc2;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
import org.postgresql.test.TestUtil;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
+import java.util.ArrayList;
+import java.util.Collection;
/*
* Tests for using non-zero setFetchSize().
*/
-public class CursorFetchTest extends BaseTest {
- public CursorFetchTest(String name) {
- super(name);
+ at RunWith(Parameterized.class)
+public class CursorFetchTest extends BaseTest4 {
+
+ public CursorFetchTest(BinaryMode binaryMode) {
+ setBinaryMode(binaryMode);
+ }
+
+ @Parameterized.Parameters(name = "binary = {0}")
+ public static Iterable<Object[]> data() {
+ Collection<Object[]> ids = new ArrayList<Object[]>();
+ for (BinaryMode binaryMode : BinaryMode.values()) {
+ ids.add(new Object[]{binaryMode});
+ }
+ return ids;
}
- protected void setUp() throws Exception {
+ @Override
+ public void setUp() throws Exception {
super.setUp();
TestUtil.createTable(con, "test_fetch", "value integer");
con.setAutoCommit(false);
}
- protected void tearDown() throws SQLException {
+ @Override
+ public void tearDown() throws SQLException {
if (!con.getAutoCommit()) {
con.rollback();
}
@@ -45,6 +67,7 @@ public class CursorFetchTest extends BaseTest {
}
// Test various fetchsizes.
+ @Test
public void testBasicFetch() throws Exception {
createRows(100);
@@ -69,6 +92,7 @@ public class CursorFetchTest extends BaseTest {
// Similar, but for scrollable resultsets.
+ @Test
public void testScrollableFetch() throws Exception {
createRows(100);
@@ -111,6 +135,7 @@ public class CursorFetchTest extends BaseTest {
}
}
+ @Test
public void testScrollableAbsoluteFetch() throws Exception {
createRows(100);
@@ -153,6 +178,7 @@ public class CursorFetchTest extends BaseTest {
// -run query (all rows should be fetched)
// -set fetchsize = 50 (should have no effect)
// -process results
+ @Test
public void testResultSetFetchSizeOne() throws Exception {
createRows(100);
@@ -178,6 +204,7 @@ public class CursorFetchTest extends BaseTest {
// --process 25 rows
// --should do a FETCH ALL to get more data
// --process 75 rows
+ @Test
public void testResultSetFetchSizeTwo() throws Exception {
createRows(100);
@@ -205,6 +232,7 @@ public class CursorFetchTest extends BaseTest {
// --process 50 rows
// --do a FETCH FORWARD 50
// --process 25 rows. end of results.
+ @Test
public void testResultSetFetchSizeThree() throws Exception {
createRows(100);
@@ -232,6 +260,7 @@ public class CursorFetchTest extends BaseTest {
// --process 25 rows
// --do a FETCH FORWARD 25
// --process 25 rows. end of results.
+ @Test
public void testResultSetFetchSizeFour() throws Exception {
createRows(100);
@@ -249,6 +278,7 @@ public class CursorFetchTest extends BaseTest {
assertEquals(100, count);
}
+ @Test
public void testSingleRowResultPositioning() throws Exception {
String msg;
createRows(1);
@@ -289,6 +319,7 @@ public class CursorFetchTest extends BaseTest {
}
}
+ @Test
public void testMultiRowResultPositioning() throws Exception {
String msg;
@@ -340,6 +371,7 @@ public class CursorFetchTest extends BaseTest {
}
// Test odd queries that should not be transformed into cursor-based fetches.
+ @Test
public void testInsert() throws Exception {
// INSERT should not be transformed.
PreparedStatement stmt = con.prepareStatement("insert into test_fetch(value) values(1)");
@@ -347,6 +379,7 @@ public class CursorFetchTest extends BaseTest {
stmt.executeUpdate();
}
+ @Test
public void testMultistatement() throws Exception {
// Queries with multiple statements should not be transformed.
@@ -370,6 +403,7 @@ public class CursorFetchTest extends BaseTest {
// if the driver tries to use a cursor with autocommit on
// it will fail because the cursor will disappear partway
// through execution
+ @Test
public void testNoCursorWithAutoCommit() throws Exception {
createRows(10); // 0 .. 9
con.setAutoCommit(true);
@@ -384,6 +418,7 @@ public class CursorFetchTest extends BaseTest {
assertEquals(10, count);
}
+ @Test
public void testGetRow() throws SQLException {
Statement stmt = con.createStatement();
stmt.setFetchSize(1);
@@ -400,6 +435,7 @@ public class CursorFetchTest extends BaseTest {
// isLast() may change the results of other positioning methods as it has to
// buffer some more results. This tests avoid using it so as to test robustness
// other positioning methods
+ @Test
public void testRowResultPositioningWithoutIsLast() throws Exception {
String msg;
@@ -446,16 +482,15 @@ public class CursorFetchTest extends BaseTest {
// Empty resultsets require all row positioning methods to return false
+ @Test
public void testNoRowResultPositioning() throws Exception {
- String msg;
-
int[] sizes = {0, 1, 50, 100};
for (int size : sizes) {
Statement stmt = con.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE);
stmt.setFetchSize(size);
ResultSet rs = stmt.executeQuery("select * from test_fetch order by value");
- msg = "no row (empty resultset) positioning error with fetchsize=" + size;
+ String msg = "no row (empty resultset) positioning error with fetchsize=" + size;
assertTrue(msg, !rs.isBeforeFirst());
assertTrue(msg, !rs.isAfterLast());
assertTrue(msg, !rs.isFirst());
@@ -473,9 +508,8 @@ public class CursorFetchTest extends BaseTest {
}
// Empty resultsets require all row positioning methods to return false
+ @Test
public void testScrollableNoRowResultPositioning() throws Exception {
- String msg;
-
int[] sizes = {0, 1, 50, 100};
for (int size : sizes) {
Statement stmt =
@@ -483,7 +517,7 @@ public class CursorFetchTest extends BaseTest {
stmt.setFetchSize(size);
ResultSet rs = stmt.executeQuery("select * from test_fetch order by value");
- msg = "no row (empty resultset) positioning error with fetchsize=" + size;
+ String msg = "no row (empty resultset) positioning error with fetchsize=" + size;
assertTrue(msg, !rs.isBeforeFirst());
assertTrue(msg, !rs.isAfterLast());
assertTrue(msg, !rs.isFirst());
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/DatabaseEncodingTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/DatabaseEncodingTest.java
index 220c38f..fe3a06f 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/DatabaseEncodingTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/DatabaseEncodingTest.java
@@ -5,10 +5,16 @@
package org.postgresql.test.jdbc2;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
import org.postgresql.core.Encoding;
import org.postgresql.test.TestUtil;
-import junit.framework.TestCase;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
import java.io.IOException;
import java.sql.Connection;
@@ -23,18 +29,15 @@ import java.util.Arrays;
* Ensure that we can do a round-trip of all server-supported unicode values without trashing them,
* and that bad encodings are detected.
*/
-public class DatabaseEncodingTest extends TestCase {
- private Connection con;
-
- public DatabaseEncodingTest(String name) {
- super(name);
- }
-
+public class DatabaseEncodingTest {
private static final int STEP = 100;
+ private Connection con;
+
// Set up the fixture for this testcase: a connection to a database with
// a table for this test.
- protected void setUp() throws Exception {
+ @Before
+ public void setUp() throws Exception {
con = TestUtil.openDB();
TestUtil.createTable(con, "testdbencoding",
"unicode_ordinal integer primary key not null, unicode_string varchar(" + STEP + ")");
@@ -44,7 +47,8 @@ public class DatabaseEncodingTest extends TestCase {
}
// Tear down the fixture for this test case.
- protected void tearDown() throws Exception {
+ @After
+ public void tearDown() throws Exception {
con.setAutoCommit(true);
TestUtil.dropTable(con, "testdbencoding");
TestUtil.closeDB(con);
@@ -63,6 +67,7 @@ public class DatabaseEncodingTest extends TestCase {
return sb.toString();
}
+ @Test
public void testEncoding() throws Exception {
// Check that we have a UTF8 server encoding, or we must skip this test.
Statement stmt = con.createStatement();
@@ -80,7 +85,7 @@ public class DatabaseEncodingTest extends TestCase {
rs.close();
- boolean testHighUnicode = TestUtil.haveMinimumServerVersion(con, "8.1");
+ boolean testHighUnicode = true;
// Create data.
// NB: we avoid d800-dfff as those are reserved for surrogates in UTF-16
@@ -192,6 +197,7 @@ public class DatabaseEncodingTest extends TestCase {
}
}
+ @Test
public void testUTF8Decode() throws Exception {
// Tests for our custom UTF-8 decoder.
@@ -221,6 +227,7 @@ public class DatabaseEncodingTest extends TestCase {
}
}
+ @Test
public void testBadUTF8Decode() throws Exception {
Encoding utf8Encoding = Encoding.getJVMEncoding("UTF-8");
@@ -281,6 +288,7 @@ public class DatabaseEncodingTest extends TestCase {
}
}
+ @Test
public void testTruncatedUTF8Decode() throws Exception {
Encoding utf8Encoding = Encoding.getJVMEncoding("UTF-8");
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/DatabaseMetaDataPropertiesTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/DatabaseMetaDataPropertiesTest.java
index 72f4bd8..d313ec9 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/DatabaseMetaDataPropertiesTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/DatabaseMetaDataPropertiesTest.java
@@ -5,9 +5,16 @@
package org.postgresql.test.jdbc2;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
import org.postgresql.test.TestUtil;
-import junit.framework.TestCase;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
@@ -18,29 +25,23 @@ import java.sql.SQLException;
* properties. Methods which return a ResultSet are tested elsewhere. This avoids a complicated
* setUp/tearDown for something like assertTrue(dbmd.nullPlusNonNullIsNull());
*/
-
-public class DatabaseMetaDataPropertiesTest extends TestCase {
-
+public class DatabaseMetaDataPropertiesTest {
private Connection con;
- /*
- * Constructor
- */
- public DatabaseMetaDataPropertiesTest(String name) {
- super(name);
- }
-
- protected void setUp() throws Exception {
+ @Before
+ public void setUp() throws Exception {
con = TestUtil.openDB();
}
- protected void tearDown() throws Exception {
+ @After
+ public void tearDown() throws Exception {
TestUtil.closeDB(con);
}
/*
* The spec says this may return null, but we always do!
*/
+ @Test
public void testGetMetaData() throws SQLException {
DatabaseMetaData dbmd = con.getMetaData();
assertNotNull(dbmd);
@@ -49,6 +50,7 @@ public class DatabaseMetaDataPropertiesTest extends TestCase {
/*
* Test default capabilities
*/
+ @Test
public void testCapabilities() throws SQLException {
DatabaseMetaData dbmd = con.getMetaData();
assertNotNull(dbmd);
@@ -68,11 +70,7 @@ public class DatabaseMetaDataPropertiesTest extends TestCase {
assertTrue(dbmd.supportsMinimumSQLGrammar());
assertTrue(!dbmd.supportsCoreSQLGrammar());
assertTrue(!dbmd.supportsExtendedSQLGrammar());
- if (TestUtil.haveMinimumServerVersion(con, "7.3")) {
- assertTrue(dbmd.supportsANSI92EntryLevelSQL());
- } else {
- assertTrue(!dbmd.supportsANSI92EntryLevelSQL());
- }
+ assertTrue(dbmd.supportsANSI92EntryLevelSQL());
assertTrue(!dbmd.supportsANSI92IntermediateSQL());
assertTrue(!dbmd.supportsANSI92FullSQL());
@@ -80,6 +78,7 @@ public class DatabaseMetaDataPropertiesTest extends TestCase {
}
+ @Test
public void testJoins() throws SQLException {
DatabaseMetaData dbmd = con.getMetaData();
assertNotNull(dbmd);
@@ -89,6 +88,7 @@ public class DatabaseMetaDataPropertiesTest extends TestCase {
assertTrue(dbmd.supportsLimitedOuterJoins());
}
+ @Test
public void testCursors() throws SQLException {
DatabaseMetaData dbmd = con.getMetaData();
assertNotNull(dbmd);
@@ -97,31 +97,30 @@ public class DatabaseMetaDataPropertiesTest extends TestCase {
assertTrue(!dbmd.supportsPositionedUpdate());
}
+ @Test
public void testValues() throws SQLException {
DatabaseMetaData dbmd = con.getMetaData();
assertNotNull(dbmd);
int indexMaxKeys = dbmd.getMaxColumnsInIndex();
- if (TestUtil.haveMinimumServerVersion(con, "7.3")) {
- assertEquals(32, indexMaxKeys);
- } else {
- assertEquals(16, indexMaxKeys);
- }
+ assertEquals(32, indexMaxKeys);
}
+ @Test
public void testNulls() throws SQLException {
DatabaseMetaData dbmd = con.getMetaData();
assertNotNull(dbmd);
- assertTrue(!dbmd.nullsAreSortedAtStart());
- assertTrue(dbmd.nullsAreSortedAtEnd() != TestUtil.haveMinimumServerVersion(con, "7.2"));
- assertTrue(dbmd.nullsAreSortedHigh() == TestUtil.haveMinimumServerVersion(con, "7.2"));
- assertTrue(!dbmd.nullsAreSortedLow());
+ assertFalse(dbmd.nullsAreSortedAtStart());
+ assertFalse(dbmd.nullsAreSortedAtEnd());
+ assertTrue(dbmd.nullsAreSortedHigh());
+ assertFalse(dbmd.nullsAreSortedLow());
assertTrue(dbmd.nullPlusNonNullIsNull());
assertTrue(dbmd.supportsNonNullableColumns());
}
+ @Test
public void testLocalFiles() throws SQLException {
DatabaseMetaData dbmd = con.getMetaData();
assertNotNull(dbmd);
@@ -130,23 +129,25 @@ public class DatabaseMetaDataPropertiesTest extends TestCase {
assertTrue(!dbmd.usesLocalFiles());
}
+ @Test
public void testIdentifiers() throws SQLException {
DatabaseMetaData dbmd = con.getMetaData();
assertNotNull(dbmd);
- assertTrue(!dbmd.supportsMixedCaseIdentifiers()); // always false
- assertTrue(dbmd.supportsMixedCaseQuotedIdentifiers()); // always true
+ assertFalse(dbmd.supportsMixedCaseIdentifiers());
+ assertTrue(dbmd.supportsMixedCaseQuotedIdentifiers());
- assertTrue(!dbmd.storesUpperCaseIdentifiers()); // always false
- assertTrue(dbmd.storesLowerCaseIdentifiers()); // always true
- assertTrue(!dbmd.storesUpperCaseQuotedIdentifiers()); // always false
- assertTrue(!dbmd.storesLowerCaseQuotedIdentifiers()); // always false
- assertTrue(!dbmd.storesMixedCaseQuotedIdentifiers()); // always false
+ assertFalse(dbmd.storesUpperCaseIdentifiers());
+ assertTrue(dbmd.storesLowerCaseIdentifiers());
+ assertFalse(dbmd.storesUpperCaseQuotedIdentifiers());
+ assertFalse(dbmd.storesLowerCaseQuotedIdentifiers());
+ assertFalse(dbmd.storesMixedCaseQuotedIdentifiers());
- assertTrue(dbmd.getIdentifierQuoteString().equals("\""));
+ assertEquals( "\"", dbmd.getIdentifierQuoteString());
}
+ @Test
public void testTables() throws SQLException {
DatabaseMetaData dbmd = con.getMetaData();
assertNotNull(dbmd);
@@ -155,13 +156,10 @@ public class DatabaseMetaDataPropertiesTest extends TestCase {
assertTrue(dbmd.supportsAlterTableWithAddColumn());
// we can only drop columns in >= 7.3
- if (TestUtil.haveMinimumServerVersion(con, "7.3")) {
- assertTrue(dbmd.supportsAlterTableWithDropColumn());
- } else {
- assertTrue(!dbmd.supportsAlterTableWithDropColumn());
- }
+ assertTrue(dbmd.supportsAlterTableWithDropColumn());
}
+ @Test
public void testSelect() throws SQLException {
DatabaseMetaData dbmd = con.getMetaData();
assertNotNull(dbmd);
@@ -181,30 +179,38 @@ public class DatabaseMetaDataPropertiesTest extends TestCase {
assertTrue(dbmd.supportsGroupByBeyondSelect()); // needs checking
}
+ @Test
public void testDBParams() throws SQLException {
DatabaseMetaData dbmd = con.getMetaData();
assertNotNull(dbmd);
- assertTrue(dbmd.getURL().equals(TestUtil.getURL()));
- assertTrue(dbmd.getUserName().equals(TestUtil.getUser()));
+ assertEquals(TestUtil.getURL(), dbmd.getURL());
+ assertEquals(TestUtil.getUser(), dbmd.getUserName());
}
+ @Test
public void testDbProductDetails() throws SQLException {
assertTrue(con instanceof org.postgresql.PGConnection);
DatabaseMetaData dbmd = con.getMetaData();
assertNotNull(dbmd);
- assertTrue(dbmd.getDatabaseProductName().equals("PostgreSQL"));
+ assertEquals("PostgreSQL", dbmd.getDatabaseProductName());
+ assertTrue(dbmd.getDatabaseMajorVersion() >= 8);
+ assertTrue(dbmd.getDatabaseMinorVersion() >= 0);
+ assertTrue(dbmd.getDatabaseProductVersion().startsWith(String.valueOf(dbmd.getDatabaseMajorVersion())));
}
+ @Test
public void testDriverVersioning() throws SQLException {
DatabaseMetaData dbmd = con.getMetaData();
assertNotNull(dbmd);
- assertTrue(dbmd.getDriverVersion().equals(org.postgresql.Driver.getVersion()));
- assertTrue(dbmd.getDriverMajorVersion() == org.postgresql.Driver.MAJORVERSION);
- assertTrue(dbmd.getDriverMinorVersion() == org.postgresql.Driver.MINORVERSION);
+ assertEquals("PostgreSQL JDBC Driver", dbmd.getDriverName());
+ assertEquals(org.postgresql.util.DriverInfo.DRIVER_VERSION, dbmd.getDriverVersion());
+ assertEquals(new org.postgresql.Driver().getMajorVersion(), dbmd.getDriverMajorVersion());
+ assertEquals(new org.postgresql.Driver().getMinorVersion(), dbmd.getDriverMinorVersion());
+ assertTrue(dbmd.getJDBCMajorVersion() >= 4);
+ assertTrue(dbmd.getJDBCMinorVersion() >= 0);
}
}
-
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/DatabaseMetaDataTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/DatabaseMetaDataTest.java
index 2e22391..77d8d72 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/DatabaseMetaDataTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/DatabaseMetaDataTest.java
@@ -5,9 +5,19 @@
package org.postgresql.test.jdbc2;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import org.postgresql.core.ServerVersion;
import org.postgresql.test.TestUtil;
-import junit.framework.TestCase;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
@@ -17,27 +27,20 @@ import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
import java.util.ArrayList;
-import java.util.HashMap;
+import java.util.Arrays;
+import java.util.HashSet;
import java.util.List;
-import java.util.Map;
+import java.util.Set;
/*
* TestCase to test the internal functionality of org.postgresql.jdbc2.DatabaseMetaData
*
*/
-
-public class DatabaseMetaDataTest extends TestCase {
-
+public class DatabaseMetaDataTest {
private Connection con;
- /*
- * Constructor
- */
- public DatabaseMetaDataTest(String name) {
- super(name);
- }
-
- protected void setUp() throws Exception {
+ @Before
+ public void setUp() throws Exception {
con = TestUtil.openDB();
TestUtil.createTable(con, "metadatatest",
"id int4, name text, updated timestamptz, colour text, quest text");
@@ -50,7 +53,11 @@ public class DatabaseMetaDataTest extends TestCase {
TestUtil.createTable(con, "intarraytable", "a int4[], b int4[][]");
TestUtil.createCompositeType(con, "custom", "i int");
TestUtil.createCompositeType(con, "_custom", "f float");
- TestUtil.createTable(con, "customtable", "c1 custom, c2 _custom, c3 custom[], c4 _custom[]");
+
+
+ // 8.2 does not support arrays of composite types
+ TestUtil.createTable(con, "customtable", "c1 custom, c2 _custom"
+ + (TestUtil.haveMinimumServerVersion(con, ServerVersion.v8_3) ? ", c3 custom[], c4 _custom[]" : ""));
Statement stmt = con.createStatement();
// we add the following comments to ensure the joins to the comments
@@ -60,27 +67,25 @@ public class DatabaseMetaDataTest extends TestCase {
stmt.execute(
"CREATE OR REPLACE FUNCTION f1(int, varchar) RETURNS int AS 'SELECT 1;' LANGUAGE SQL");
- if (TestUtil.haveMinimumServerVersion(con, "8.0")) {
- stmt.execute(
- "CREATE OR REPLACE FUNCTION f2(a int, b varchar) RETURNS int AS 'SELECT 1;' LANGUAGE SQL");
- }
- if (TestUtil.haveMinimumServerVersion(con, "8.1")) {
- stmt.execute(
- "CREATE OR REPLACE FUNCTION f3(IN a int, INOUT b varchar, OUT c timestamptz) AS $f$ BEGIN b := 'a'; c := now(); return; END; $f$ LANGUAGE plpgsql");
- }
stmt.execute(
- "CREATE OR REPLACE FUNCTION f4(int) RETURNS metadatatest AS 'SELECT 1, ''a''::text, now(), ''c''::text, ''q''::text' LANGUAGE SQL");
+ "CREATE OR REPLACE FUNCTION f2(a int, b varchar) RETURNS int AS 'SELECT 1;' LANGUAGE SQL");
stmt.execute(
- "CREATE OR REPLACE FUNCTION f5() RETURNS TABLE (i int) LANGUAGE sql AS 'SELECT 1'");
-
- if (TestUtil.haveMinimumServerVersion(con, "7.3")) {
- TestUtil.createDomain(con, "nndom", "int not null");
- TestUtil.createTable(con, "domaintable", "id nndom");
+ "CREATE OR REPLACE FUNCTION f3(IN a int, INOUT b varchar, OUT c timestamptz) AS $f$ BEGIN b := 'a'; c := now(); return; END; $f$ LANGUAGE plpgsql");
+ stmt.execute(
+ "CREATE OR REPLACE FUNCTION f4(int) RETURNS metadatatest AS 'SELECT 1, ''a''::text, now(), ''c''::text, ''q''::text' LANGUAGE SQL");
+ if (TestUtil.haveMinimumServerVersion(con, ServerVersion.v8_4)) {
+ // RETURNS TABLE requires PostgreSQL 8.4+
+ stmt.execute(
+ "CREATE OR REPLACE FUNCTION f5() RETURNS TABLE (i int) LANGUAGE sql AS 'SELECT 1'");
}
+
+ TestUtil.createDomain(con, "nndom", "int not null");
+ TestUtil.createTable(con, "domaintable", "id nndom");
stmt.close();
}
- protected void tearDown() throws Exception {
+ @After
+ public void tearDown() throws Exception {
// Drop function first because it depends on the
// metadatatest table's type
Statement stmt = con.createStatement();
@@ -99,20 +104,15 @@ public class DatabaseMetaDataTest extends TestCase {
TestUtil.dropType(con, "_custom");
stmt.execute("DROP FUNCTION f1(int, varchar)");
- if (TestUtil.haveMinimumServerVersion(con, "8.0")) {
- stmt.execute("DROP FUNCTION f2(int, varchar)");
- }
- if (TestUtil.haveMinimumServerVersion(con, "8.1")) {
- stmt.execute("DROP FUNCTION f3(int, varchar)");
- }
- if (TestUtil.haveMinimumServerVersion(con, "7.3")) {
- TestUtil.dropType(con, "domaintable");
- TestUtil.dropDomain(con, "nndom");
- }
+ stmt.execute("DROP FUNCTION f2(int, varchar)");
+ stmt.execute("DROP FUNCTION f3(int, varchar)");
+ TestUtil.dropType(con, "domaintable");
+ TestUtil.dropDomain(con, "nndom");
TestUtil.closeDB(con);
}
+ @Test
public void testArrayTypeInfo() throws SQLException {
DatabaseMetaData dbmd = con.getMetaData();
ResultSet rs = dbmd.getColumns(null, null, "intarraytable", "a");
@@ -126,6 +126,7 @@ public class DatabaseMetaDataTest extends TestCase {
TestUtil.closeQuietly(rs);
}
+ @Test
public void testArrayInt4DoubleDim() throws SQLException {
DatabaseMetaData dbmd = con.getMetaData();
ResultSet rs = dbmd.getColumns(null, null, "intarraytable", "b");
@@ -137,6 +138,7 @@ public class DatabaseMetaDataTest extends TestCase {
assertEquals("_int4", rs.getString("TYPE_NAME")); // even int4[][] is represented as _int4
}
+ @Test
public void testCustomArrayTypeInfo() throws SQLException {
DatabaseMetaData dbmd = con.getMetaData();
ResultSet res = dbmd.getColumns(null, null, "customtable", null);
@@ -144,22 +146,27 @@ public class DatabaseMetaDataTest extends TestCase {
assertEquals("custom", res.getString("TYPE_NAME"));
assertTrue(res.next());
assertEquals("_custom", res.getString("TYPE_NAME"));
- assertTrue(res.next());
- assertEquals("__custom", res.getString("TYPE_NAME"));
- assertTrue(res.next());
- assertEquals("___custom", res.getString("TYPE_NAME"));
- con.createArrayOf("custom", new Object[] {});
- res = dbmd.getColumns(null, null, "customtable", null);
- assertTrue(res.next());
- assertEquals("custom", res.getString("TYPE_NAME"));
- assertTrue(res.next());
- assertEquals("_custom", res.getString("TYPE_NAME"));
- assertTrue(res.next());
- assertEquals("__custom", res.getString("TYPE_NAME"));
- assertTrue(res.next());
- assertEquals("___custom", res.getString("TYPE_NAME"));
+ if (TestUtil.haveMinimumServerVersion(con, ServerVersion.v8_3)) {
+ assertTrue(res.next());
+ assertEquals("__custom", res.getString("TYPE_NAME"));
+ assertTrue(res.next());
+ assertEquals("___custom", res.getString("TYPE_NAME"));
+ }
+ if (TestUtil.haveMinimumServerVersion(con, ServerVersion.v8_3)) {
+ con.createArrayOf("custom", new Object[]{});
+ res = dbmd.getColumns(null, null, "customtable", null);
+ assertTrue(res.next());
+ assertEquals("custom", res.getString("TYPE_NAME"));
+ assertTrue(res.next());
+ assertEquals("_custom", res.getString("TYPE_NAME"));
+ assertTrue(res.next());
+ assertEquals("__custom", res.getString("TYPE_NAME"));
+ assertTrue(res.next());
+ assertEquals("___custom", res.getString("TYPE_NAME"));
+ }
}
+ @Test
public void testTables() throws Exception {
DatabaseMetaData dbmd = con.getMetaData();
assertNotNull(dbmd);
@@ -191,6 +198,7 @@ public class DatabaseMetaDataTest extends TestCase {
assertEquals(java.sql.Types.TIMESTAMP, rs.getInt("DATA_TYPE"));
}
+ @Test
public void testCrossReference() throws Exception {
Connection con1 = TestUtil.openDB();
@@ -220,13 +228,7 @@ public class DatabaseMetaDataTest extends TestCase {
assertTrue(fkColumnName.equals("m") || fkColumnName.equals("n"));
String fkName = rs.getString("FK_NAME");
- if (TestUtil.haveMinimumServerVersion(con1, "8.0")) {
- assertEquals("ww_m_fkey", fkName);
- } else if (TestUtil.haveMinimumServerVersion(con1, "7.3")) {
- assertTrue(fkName.startsWith("$1"));
- } else {
- assertTrue(fkName.startsWith("<unnamed>"));
- }
+ assertEquals("ww_m_fkey", fkName);
String pkName = rs.getString("PK_NAME");
assertEquals("vv_pkey", pkName);
@@ -241,6 +243,7 @@ public class DatabaseMetaDataTest extends TestCase {
TestUtil.closeDB(con1);
}
+ @Test
public void testForeignKeyActions() throws Exception {
Connection conn = TestUtil.openDB();
TestUtil.createTable(conn, "pkt", "id int primary key");
@@ -252,14 +255,14 @@ public class DatabaseMetaDataTest extends TestCase {
ResultSet rs = dbmd.getImportedKeys(null, "", "fkt1");
assertTrue(rs.next());
- assertTrue(rs.getInt("UPDATE_RULE") == DatabaseMetaData.importedKeyRestrict);
- assertTrue(rs.getInt("DELETE_RULE") == DatabaseMetaData.importedKeyCascade);
+ assertEquals(DatabaseMetaData.importedKeyRestrict, rs.getInt("UPDATE_RULE"));
+ assertEquals(DatabaseMetaData.importedKeyCascade, rs.getInt("DELETE_RULE"));
rs.close();
rs = dbmd.getImportedKeys(null, "", "fkt2");
assertTrue(rs.next());
- assertTrue(rs.getInt("UPDATE_RULE") == DatabaseMetaData.importedKeySetNull);
- assertTrue(rs.getInt("DELETE_RULE") == DatabaseMetaData.importedKeySetDefault);
+ assertEquals(DatabaseMetaData.importedKeySetNull, rs.getInt("UPDATE_RULE"));
+ assertEquals(DatabaseMetaData.importedKeySetDefault, rs.getInt("DELETE_RULE"));
rs.close();
TestUtil.dropTable(conn, "fkt2");
@@ -268,11 +271,8 @@ public class DatabaseMetaDataTest extends TestCase {
TestUtil.closeDB(conn);
}
+ @Test
public void testForeignKeysToUniqueIndexes() throws Exception {
- if (!TestUtil.haveMinimumServerVersion(con, "7.4")) {
- return;
- }
-
Connection con1 = TestUtil.openDB();
TestUtil.createTable(con1, "pkt",
"a int not null, b int not null, CONSTRAINT pkt_pk_a PRIMARY KEY (a), CONSTRAINT pkt_un_b UNIQUE (b)");
@@ -283,18 +283,19 @@ public class DatabaseMetaDataTest extends TestCase {
ResultSet rs = dbmd.getImportedKeys("", "", "fkt");
int j = 0;
for (; rs.next(); j++) {
- assertTrue("pkt".equals(rs.getString("PKTABLE_NAME")));
- assertTrue("fkt".equals(rs.getString("FKTABLE_NAME")));
- assertTrue("pkt_un_b".equals(rs.getString("PK_NAME")));
- assertTrue("b".equals(rs.getString("PKCOLUMN_NAME")));
+ assertEquals("pkt", rs.getString("PKTABLE_NAME"));
+ assertEquals("fkt", rs.getString("FKTABLE_NAME"));
+ assertEquals("pkt_un_b", rs.getString("PK_NAME"));
+ assertEquals("b", rs.getString("PKCOLUMN_NAME"));
}
- assertTrue(j == 1);
+ assertEquals(1, j);
TestUtil.dropTable(con1, "fkt");
TestUtil.dropTable(con1, "pkt");
con1.close();
}
+ @Test
public void testMultiColumnForeignKeys() throws Exception {
Connection con1 = TestUtil.openDB();
TestUtil.createTable(con1, "pkt",
@@ -306,24 +307,25 @@ public class DatabaseMetaDataTest extends TestCase {
ResultSet rs = dbmd.getImportedKeys("", "", "fkt");
int j = 0;
for (; rs.next(); j++) {
- assertTrue("pkt".equals(rs.getString("PKTABLE_NAME")));
- assertTrue("fkt".equals(rs.getString("FKTABLE_NAME")));
- assertTrue(j + 1 == rs.getInt("KEY_SEQ"));
+ assertEquals("pkt", rs.getString("PKTABLE_NAME"));
+ assertEquals("fkt", rs.getString("FKTABLE_NAME"));
+ assertEquals(j + 1, rs.getInt("KEY_SEQ"));
if (j == 0) {
- assertTrue("b".equals(rs.getString("PKCOLUMN_NAME")));
- assertTrue("c".equals(rs.getString("FKCOLUMN_NAME")));
+ assertEquals("b", rs.getString("PKCOLUMN_NAME"));
+ assertEquals("c", rs.getString("FKCOLUMN_NAME"));
} else {
- assertTrue("a".equals(rs.getString("PKCOLUMN_NAME")));
- assertTrue("d".equals(rs.getString("FKCOLUMN_NAME")));
+ assertEquals("a", rs.getString("PKCOLUMN_NAME"));
+ assertEquals("d", rs.getString("FKCOLUMN_NAME"));
}
}
- assertTrue(j == 2);
+ assertEquals(2, j);
TestUtil.dropTable(con1, "fkt");
TestUtil.dropTable(con1, "pkt");
con1.close();
}
+ @Test
public void testSameTableForeignKeys() throws Exception {
Connection con1 = TestUtil.openDB();
@@ -376,7 +378,7 @@ public class DatabaseMetaDataTest extends TestCase {
// continue foreign key, i.e. fkName matches the last foreign key
assertEquals(fkNames.get(fkNames.size() - 1), fkName);
// see always increases by 1
- assertTrue(seq == lastFieldCount + 1);
+ assertEquals(seq, lastFieldCount + 1);
}
lastFieldCount = seq;
}
@@ -389,6 +391,7 @@ public class DatabaseMetaDataTest extends TestCase {
}
+ @Test
public void testForeignKeys() throws Exception {
Connection con1 = TestUtil.openDB();
TestUtil.createTable(con1, "people", "id int4 primary key, name text");
@@ -427,7 +430,7 @@ public class DatabaseMetaDataTest extends TestCase {
}
- assertTrue(j == 2);
+ assertEquals(2, j);
rs = dbmd.getExportedKeys(null, "", "people");
@@ -449,6 +452,7 @@ public class DatabaseMetaDataTest extends TestCase {
TestUtil.closeDB(con1);
}
+ @Test
public void testColumns() throws SQLException {
// At the moment just test that no exceptions are thrown KJ
DatabaseMetaData dbmd = con.getMetaData();
@@ -457,8 +461,9 @@ public class DatabaseMetaDataTest extends TestCase {
rs.close();
}
+ @Test
public void testDroppedColumns() throws SQLException {
- if (!TestUtil.haveMinimumServerVersion(con, "8.4")) {
+ if (!TestUtil.haveMinimumServerVersion(con, ServerVersion.v8_4)) {
return;
}
@@ -488,10 +493,27 @@ public class DatabaseMetaDataTest extends TestCase {
assertTrue(rs.next());
assertEquals("quest", rs.getString("COLUMN_NAME"));
assertEquals(3, rs.getInt("ORDINAL_POSITION"));
- assertTrue(!rs.next());
+ assertFalse(rs.next());
rs.close();
+
+ /* getFunctionColumns also has to be aware of dropped columns
+ add this in here to make sure it can deal with them
+ */
+ rs = dbmd.getFunctionColumns(null, null, "f4", null);
+ assertTrue(rs.next());
+
+ assertTrue(rs.next());
+ assertEquals("id", rs.getString(4));
+
+ assertTrue(rs.next());
+ assertEquals("updated", rs.getString(4));
+
+
+ rs.close();
+
}
+ @Test
public void testSerialColumns() throws SQLException {
DatabaseMetaData dbmd = con.getMetaData();
ResultSet rs = dbmd.getColumns(null, null, "sercoltest", null);
@@ -512,6 +534,7 @@ public class DatabaseMetaDataTest extends TestCase {
rs.close();
}
+ @Test
public void testColumnPrivileges() throws SQLException {
// At the moment just test that no exceptions are thrown KJ
DatabaseMetaData dbmd = con.getMetaData();
@@ -520,6 +543,7 @@ public class DatabaseMetaDataTest extends TestCase {
rs.close();
}
+ @Test
public void testTablePrivileges() throws SQLException {
DatabaseMetaData dbmd = con.getMetaData();
assertNotNull(dbmd);
@@ -537,6 +561,7 @@ public class DatabaseMetaDataTest extends TestCase {
l_foundSelect);
}
+ @Test
public void testNoTablePrivileges() throws SQLException {
Statement stmt = con.createStatement();
stmt.execute("REVOKE ALL ON metadatatest FROM PUBLIC");
@@ -546,6 +571,7 @@ public class DatabaseMetaDataTest extends TestCase {
assertTrue(!rs.next());
}
+ @Test
public void testPrimaryKeys() throws SQLException {
// At the moment just test that no exceptions are thrown KJ
DatabaseMetaData dbmd = con.getMetaData();
@@ -554,15 +580,14 @@ public class DatabaseMetaDataTest extends TestCase {
rs.close();
}
+ @Test
public void testIndexInfo() throws SQLException {
Statement stmt = con.createStatement();
stmt.execute("create index idx_id on metadatatest (id)");
stmt.execute("create index idx_func_single on metadatatest (upper(colour))");
stmt.execute("create unique index idx_un_id on metadatatest(id)");
- if (TestUtil.haveMinimumServerVersion(con, "7.4")) {
- stmt.execute("create index idx_func_multi on metadatatest (upper(colour), upper(quest))");
- stmt.execute("create index idx_func_mixed on metadatatest (colour, upper(quest))");
- }
+ stmt.execute("create index idx_func_multi on metadatatest (upper(colour), upper(quest))");
+ stmt.execute("create index idx_func_mixed on metadatatest (colour, upper(quest))");
DatabaseMetaData dbmd = con.getMetaData();
assertNotNull(dbmd);
@@ -574,27 +599,25 @@ public class DatabaseMetaDataTest extends TestCase {
assertEquals("id", rs.getString("COLUMN_NAME"));
assertTrue(!rs.getBoolean("NON_UNIQUE"));
- if (TestUtil.haveMinimumServerVersion(con, "7.4")) {
- assertTrue(rs.next());
- assertEquals("idx_func_mixed", rs.getString("INDEX_NAME"));
- assertEquals(1, rs.getInt("ORDINAL_POSITION"));
- assertEquals("colour", rs.getString("COLUMN_NAME"));
+ assertTrue(rs.next());
+ assertEquals("idx_func_mixed", rs.getString("INDEX_NAME"));
+ assertEquals(1, rs.getInt("ORDINAL_POSITION"));
+ assertEquals("colour", rs.getString("COLUMN_NAME"));
- assertTrue(rs.next());
- assertEquals("idx_func_mixed", rs.getString("INDEX_NAME"));
- assertEquals(2, rs.getInt("ORDINAL_POSITION"));
- assertEquals("upper(quest)", rs.getString("COLUMN_NAME"));
+ assertTrue(rs.next());
+ assertEquals("idx_func_mixed", rs.getString("INDEX_NAME"));
+ assertEquals(2, rs.getInt("ORDINAL_POSITION"));
+ assertEquals("upper(quest)", rs.getString("COLUMN_NAME"));
- assertTrue(rs.next());
- assertEquals("idx_func_multi", rs.getString("INDEX_NAME"));
- assertEquals(1, rs.getInt("ORDINAL_POSITION"));
- assertEquals("upper(colour)", rs.getString("COLUMN_NAME"));
+ assertTrue(rs.next());
+ assertEquals("idx_func_multi", rs.getString("INDEX_NAME"));
+ assertEquals(1, rs.getInt("ORDINAL_POSITION"));
+ assertEquals("upper(colour)", rs.getString("COLUMN_NAME"));
- assertTrue(rs.next());
- assertEquals("idx_func_multi", rs.getString("INDEX_NAME"));
- assertEquals(2, rs.getInt("ORDINAL_POSITION"));
- assertEquals("upper(quest)", rs.getString("COLUMN_NAME"));
- }
+ assertTrue(rs.next());
+ assertEquals("idx_func_multi", rs.getString("INDEX_NAME"));
+ assertEquals(2, rs.getInt("ORDINAL_POSITION"));
+ assertEquals("upper(quest)", rs.getString("COLUMN_NAME"));
assertTrue(rs.next());
assertEquals("idx_func_single", rs.getString("INDEX_NAME"));
@@ -612,11 +635,8 @@ public class DatabaseMetaDataTest extends TestCase {
rs.close();
}
+ @Test
public void testNotNullDomainColumn() throws SQLException {
- if (!TestUtil.haveMinimumServerVersion(con, "7.3")) {
- return;
- }
-
DatabaseMetaData dbmd = con.getMetaData();
ResultSet rs = dbmd.getColumns("", "", "domaintable", "");
assertTrue(rs.next());
@@ -625,8 +645,9 @@ public class DatabaseMetaDataTest extends TestCase {
assertTrue(!rs.next());
}
+ @Test
public void testAscDescIndexInfo() throws SQLException {
- if (!TestUtil.haveMinimumServerVersion(con, "8.3")) {
+ if (!TestUtil.haveMinimumServerVersion(con, ServerVersion.v8_3)) {
return;
}
@@ -649,6 +670,7 @@ public class DatabaseMetaDataTest extends TestCase {
assertEquals("D", rs.getString("ASC_OR_DESC"));
}
+ @Test
public void testPartialIndexInfo() throws SQLException {
Statement stmt = con.createStatement();
stmt.execute("create index idx_p_name_id on metadatatest (name) where id > 5");
@@ -667,6 +689,7 @@ public class DatabaseMetaDataTest extends TestCase {
rs.close();
}
+ @Test
public void testTableTypes() throws SQLException {
// At the moment just test that no exceptions are thrown KJ
DatabaseMetaData dbmd = con.getMetaData();
@@ -675,6 +698,7 @@ public class DatabaseMetaDataTest extends TestCase {
rs.close();
}
+ @Test
public void testFuncWithoutNames() throws SQLException {
DatabaseMetaData dbmd = con.getMetaData();
assertNotNull(dbmd);
@@ -699,11 +723,8 @@ public class DatabaseMetaDataTest extends TestCase {
rs.close();
}
+ @Test
public void testFuncWithNames() throws SQLException {
- if (!TestUtil.haveMinimumServerVersion(con, "8.0")) {
- return;
- }
-
DatabaseMetaData dbmd = con.getMetaData();
ResultSet rs = dbmd.getProcedureColumns(null, null, "f2", null);
@@ -720,11 +741,8 @@ public class DatabaseMetaDataTest extends TestCase {
rs.close();
}
+ @Test
public void testFuncWithDirection() throws SQLException {
- if (!TestUtil.haveMinimumServerVersion(con, "8.1")) {
- return;
- }
-
DatabaseMetaData dbmd = con.getMetaData();
ResultSet rs = dbmd.getProcedureColumns(null, null, "f3", null);
@@ -746,6 +764,7 @@ public class DatabaseMetaDataTest extends TestCase {
rs.close();
}
+ @Test
public void testFuncReturningComposite() throws SQLException {
DatabaseMetaData dbmd = con.getMetaData();
ResultSet rs = dbmd.getProcedureColumns(null, null, "f4", null);
@@ -784,7 +803,11 @@ public class DatabaseMetaDataTest extends TestCase {
rs.close();
}
+ @Test
public void testFuncReturningTable() throws Exception {
+ if (!TestUtil.haveMinimumServerVersion(con, ServerVersion.v8_4)) {
+ return;
+ }
DatabaseMetaData dbmd = con.getMetaData();
ResultSet rs = dbmd.getProcedureColumns(null, null, "f5", null);
assertTrue(rs.next());
@@ -799,6 +822,7 @@ public class DatabaseMetaDataTest extends TestCase {
rs.close();
}
+ @Test
public void testVersionColumns() throws SQLException {
// At the moment just test that no exceptions are thrown KJ
DatabaseMetaData dbmd = con.getMetaData();
@@ -807,6 +831,7 @@ public class DatabaseMetaDataTest extends TestCase {
rs.close();
}
+ @Test
public void testBestRowIdentifier() throws SQLException {
// At the moment just test that no exceptions are thrown KJ
DatabaseMetaData dbmd = con.getMetaData();
@@ -816,6 +841,7 @@ public class DatabaseMetaDataTest extends TestCase {
rs.close();
}
+ @Test
public void testProcedures() throws SQLException {
// At the moment just test that no exceptions are thrown KJ
DatabaseMetaData dbmd = con.getMetaData();
@@ -824,6 +850,7 @@ public class DatabaseMetaDataTest extends TestCase {
rs.close();
}
+ @Test
public void testCatalogs() throws SQLException {
DatabaseMetaData dbmd = con.getMetaData();
ResultSet rs = dbmd.getCatalogs();
@@ -832,6 +859,7 @@ public class DatabaseMetaDataTest extends TestCase {
assertTrue(!rs.next());
}
+ @Test
public void testSchemas() throws Exception {
DatabaseMetaData dbmd = con.getMetaData();
assertNotNull(dbmd);
@@ -853,19 +881,13 @@ public class DatabaseMetaDataTest extends TestCase {
}
}
rs.close();
- if (TestUtil.haveMinimumServerVersion(con, "7.3")) {
- assertTrue(count >= 2);
- assertTrue(foundPublic);
- assertTrue(foundPGCatalog);
- assertTrue(!foundEmpty);
- } else {
- assertEquals(count, 1);
- assertTrue(foundEmpty);
- assertTrue(!foundPublic);
- assertTrue(!foundPGCatalog);
- }
+ assertTrue(count >= 2);
+ assertTrue(foundPublic);
+ assertTrue(foundPGCatalog);
+ assertTrue(!foundEmpty);
}
+ @Test
public void testEscaping() throws SQLException {
DatabaseMetaData dbmd = con.getMetaData();
ResultSet rs = dbmd.getTables(null, null, "a'", new String[]{"TABLE"});
@@ -876,6 +898,7 @@ public class DatabaseMetaDataTest extends TestCase {
assertTrue(!rs.next());
}
+ @Test
public void testSearchStringEscape() throws Exception {
DatabaseMetaData dbmd = con.getMetaData();
String pattern = dbmd.getSearchStringEscape() + "_";
@@ -890,11 +913,8 @@ public class DatabaseMetaDataTest extends TestCase {
pstmt.close();
}
+ @Test
public void testGetUDTQualified() throws Exception {
- if (!TestUtil.haveMinimumServerVersion(con, "7.3")) {
- return;
- }
-
Statement stmt = null;
try {
stmt = con.createStatement();
@@ -947,11 +967,8 @@ public class DatabaseMetaDataTest extends TestCase {
}
+ @Test
public void testGetUDT1() throws Exception {
- if (!TestUtil.haveMinimumServerVersion(con, "7.3")) {
- return;
- }
-
try {
Statement stmt = con.createStatement();
stmt.execute("create domain testint8 as int8");
@@ -959,22 +976,15 @@ public class DatabaseMetaDataTest extends TestCase {
DatabaseMetaData dbmd = con.getMetaData();
ResultSet rs = dbmd.getUDTs(null, null, "testint8", null);
assertTrue(rs.next());
- String cat;
- String schema;
- String typeName;
- String remarks;
- String className;
- int dataType;
- int baseType;
- cat = rs.getString("type_cat");
- schema = rs.getString("type_schem");
- typeName = rs.getString("type_name");
- className = rs.getString("class_name");
- dataType = rs.getInt("data_type");
- remarks = rs.getString("remarks");
+ String cat = rs.getString("type_cat");
+ String schema = rs.getString("type_schem");
+ String typeName = rs.getString("type_name");
+ String className = rs.getString("class_name");
+ int dataType = rs.getInt("data_type");
+ String remarks = rs.getString("remarks");
- baseType = rs.getInt("base_type");
+ int baseType = rs.getInt("base_type");
assertTrue("base type", !rs.wasNull());
assertEquals("data type", Types.DISTINCT, dataType);
assertEquals("type name ", "testint8", typeName);
@@ -990,11 +1000,8 @@ public class DatabaseMetaDataTest extends TestCase {
}
+ @Test
public void testGetUDT2() throws Exception {
- if (!TestUtil.haveMinimumServerVersion(con, "7.3")) {
- return;
- }
-
try {
Statement stmt = con.createStatement();
stmt.execute("create domain testint8 as int8");
@@ -1002,22 +1009,16 @@ public class DatabaseMetaDataTest extends TestCase {
DatabaseMetaData dbmd = con.getMetaData();
ResultSet rs = dbmd.getUDTs(null, null, "testint8", new int[]{Types.DISTINCT, Types.STRUCT});
assertTrue(rs.next());
- String cat;
- String schema;
String typeName;
- String remarks;
- String className;
- int dataType;
- int baseType;
- cat = rs.getString("type_cat");
- schema = rs.getString("type_schem");
+ String cat = rs.getString("type_cat");
+ String schema = rs.getString("type_schem");
typeName = rs.getString("type_name");
- className = rs.getString("class_name");
- dataType = rs.getInt("data_type");
- remarks = rs.getString("remarks");
+ String className = rs.getString("class_name");
+ int dataType = rs.getInt("data_type");
+ String remarks = rs.getString("remarks");
- baseType = rs.getInt("base_type");
+ int baseType = rs.getInt("base_type");
assertTrue("base type", !rs.wasNull());
assertEquals("data type", Types.DISTINCT, dataType);
assertEquals("type name ", "testint8", typeName);
@@ -1032,11 +1033,8 @@ public class DatabaseMetaDataTest extends TestCase {
}
}
+ @Test
public void testGetUDT3() throws Exception {
- if (!TestUtil.haveMinimumServerVersion(con, "7.3")) {
- return;
- }
-
try {
Statement stmt = con.createStatement();
stmt.execute("create domain testint8 as int8");
@@ -1044,22 +1042,15 @@ public class DatabaseMetaDataTest extends TestCase {
DatabaseMetaData dbmd = con.getMetaData();
ResultSet rs = dbmd.getUDTs(null, null, "testint8", new int[]{Types.DISTINCT});
assertTrue(rs.next());
- String cat;
- String schema;
- String typeName;
- String remarks;
- String className;
- int dataType;
- int baseType;
- cat = rs.getString("type_cat");
- schema = rs.getString("type_schem");
- typeName = rs.getString("type_name");
- className = rs.getString("class_name");
- dataType = rs.getInt("data_type");
- remarks = rs.getString("remarks");
+ String cat = rs.getString("type_cat");
+ String schema = rs.getString("type_schem");
+ String typeName = rs.getString("type_name");
+ String className = rs.getString("class_name");
+ int dataType = rs.getInt("data_type");
+ String remarks = rs.getString("remarks");
- baseType = rs.getInt("base_type");
+ int baseType = rs.getInt("base_type");
assertTrue("base type", !rs.wasNull());
assertEquals("data type", Types.DISTINCT, dataType);
assertEquals("type name ", "testint8", typeName);
@@ -1074,33 +1065,23 @@ public class DatabaseMetaDataTest extends TestCase {
}
}
+ @Test
public void testGetUDT4() throws Exception {
- if (!TestUtil.haveMinimumServerVersion(con, "7.3")) {
- return;
- }
-
try {
Statement stmt = con.createStatement();
stmt.execute("create type testint8 as (i int8)");
DatabaseMetaData dbmd = con.getMetaData();
ResultSet rs = dbmd.getUDTs(null, null, "testint8", null);
assertTrue(rs.next());
- String cat;
- String schema;
- String typeName;
- String remarks;
- String className;
- int dataType;
- int baseType;
- cat = rs.getString("type_cat");
- schema = rs.getString("type_schem");
- typeName = rs.getString("type_name");
- className = rs.getString("class_name");
- dataType = rs.getInt("data_type");
- remarks = rs.getString("remarks");
+ String cat = rs.getString("type_cat");
+ String schema = rs.getString("type_schem");
+ String typeName = rs.getString("type_name");
+ String className = rs.getString("class_name");
+ int dataType = rs.getInt("data_type");
+ String remarks = rs.getString("remarks");
- baseType = rs.getInt("base_type");
+ int baseType = rs.getInt("base_type");
assertTrue("base type", rs.wasNull());
assertEquals("data type", Types.STRUCT, dataType);
assertEquals("type name ", "testint8", typeName);
@@ -1114,76 +1095,69 @@ public class DatabaseMetaDataTest extends TestCase {
}
}
- // these all work from 9.1 on. Not meant to be exhaustive, but it's better than nothing.
- private String[] typeArray = new String[]{
- "bool",
- "bytea",
- "char",
- "name",
- "int8",
- "int2",
- "int2vector",
- "int4",
- "text",
- "oid",
- "tid",
- "xid",
- "cid",
- "oidvector",
- "xml",
- "point",
- "lseg",
- "path",
- "box",
- "polygon",
- "line",
- "float4",
- "float8",
- "abstime",
- "reltime",
- "tinterval",
- "unknown",
- "circle",
- "money",
- "macaddr",
- "inet",
- "cidr",
- "aclitem",
- "bpchar",
- "varchar",
- "date",
- "time",
- "timestamp",
- "timestamptz",
- "interval",
- "timetz",
- "bit",
- "varbit",
- "numeric",
- "refcursor",
- "uuid",
- "tsvector",
- "gtsvector",
- "tsquery",
- "any",
- "anyarray",
- "void",
- };
-
+ @Test
public void testTypes() throws SQLException {
+ // https://www.postgresql.org/docs/8.2/static/datatype.html
+ List<String> stringTypeList = new ArrayList<String>();
+ stringTypeList.addAll(Arrays.asList("bit",
+ "bool",
+ "box",
+ "bytea",
+ "char",
+ "cidr",
+ "circle",
+ "date",
+ "float4",
+ "float8",
+ "inet",
+ "int2",
+ "int4",
+ "int8",
+ "interval",
+ "line",
+ "lseg",
+ "macaddr",
+ "money",
+ "numeric",
+ "path",
+ "point",
+ "polygon",
+ "text",
+ "time",
+ "timestamp",
+ "timestamptz",
+ "timetz",
+ "varbit",
+ "varchar"));
+ if (TestUtil.haveMinimumServerVersion(con, ServerVersion.v8_3)) {
+ stringTypeList.add("tsquery");
+ stringTypeList.add("tsvector");
+ stringTypeList.add("txid_snapshot");
+ stringTypeList.add("uuid");
+ stringTypeList.add("xml");
+ }
+ if (TestUtil.haveMinimumServerVersion(con, ServerVersion.v9_2)) {
+ stringTypeList.add("json");
+ }
+ if (TestUtil.haveMinimumServerVersion(con, ServerVersion.v9_4)) {
+ stringTypeList.add("jsonb");
+ stringTypeList.add("pg_lsn");
+ }
+
DatabaseMetaData dbmd = con.getMetaData();
ResultSet rs = dbmd.getTypeInfo();
- Map<String, Boolean> types = new HashMap<String, Boolean>();
+ List<String> types = new ArrayList<String>();
while (rs.next()) {
- types.put(rs.getString("TYPE_NAME"), true);
+ types.add(rs.getString("TYPE_NAME"));
}
- for (String typeName : typeArray) {
- assertTrue(types.containsKey(typeName));
+ for (String typeName : stringTypeList) {
+ assertTrue(types.contains(typeName));
}
}
+ @Test
public void testTypeInfoSigned() throws SQLException {
DatabaseMetaData dbmd = con.getMetaData();
ResultSet rs = dbmd.getTypeInfo();
@@ -1198,6 +1172,7 @@ public class DatabaseMetaDataTest extends TestCase {
}
}
+ @Test
public void testTypeInfoQuoting() throws SQLException {
DatabaseMetaData dbmd = con.getMetaData();
ResultSet rs = dbmd.getTypeInfo();
@@ -1211,6 +1186,7 @@ public class DatabaseMetaDataTest extends TestCase {
}
}
+ @Test
public void testInformationAboutArrayTypes() throws SQLException {
DatabaseMetaData dbmd = con.getMetaData();
ResultSet rs = dbmd.getColumns("", "", "arraytable", "");
@@ -1224,4 +1200,121 @@ public class DatabaseMetaDataTest extends TestCase {
assertTrue(!rs.next());
}
+ @Test
+ public void testPartitionedTables() throws SQLException {
+ if (TestUtil.haveMinimumServerVersion(con, ServerVersion.v10)) {
+ Statement stmt = null;
+ try {
+ stmt = con.createStatement();
+ stmt.execute(
+ "CREATE TABLE measurement (logdate date not null,peaktemp int,unitsales int ) PARTITION BY RANGE (logdate);");
+ DatabaseMetaData dbmd = con.getMetaData();
+ ResultSet rs = dbmd.getTables("", "", "measurement", new String[]{"TABLE"});
+ assertTrue(rs.next());
+ assertEquals("measurement", rs.getString("table_name"));
+
+ } finally {
+ if (stmt != null) {
+ stmt.execute("drop table measurement");
+ stmt.close();
+ }
+ }
+ }
+ }
+
+ @Test
+ public void testIdentityColumns() throws SQLException {
+ if ( TestUtil.haveMinimumServerVersion(con, ServerVersion.v10) ) {
+ Statement stmt = null;
+ try {
+ stmt = con.createStatement();
+ stmt.execute("CREATE TABLE test_new ("
+ + "id int GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,"
+ + "payload text)");
+ DatabaseMetaData dbmd = con.getMetaData();
+ ResultSet rs = dbmd.getColumns("", "", "test_new", "id");
+ assertTrue(rs.next());
+ assertEquals(rs.getString("COLUMN_NAME"), "id");
+ assertTrue(rs.getBoolean("IS_AUTOINCREMENT"));
+
+ } finally {
+ if ( stmt != null ) {
+ stmt.execute( "drop table test_new");
+ stmt.close();
+ }
+ }
+ }
+
+ }
+
+ @Test
+ public void testGetSQLKeywords() throws SQLException {
+ DatabaseMetaData dbmd = con.getMetaData();
+ String keywords = dbmd.getSQLKeywords();
+
+ // We don't want SQL:2003 keywords returned, so check for that.
+ String sql2003 = "a,abs,absolute,action,ada,add,admin,after,all,allocate,alter,always,and,any,are,"
+ + "array,as,asc,asensitive,assertion,assignment,asymmetric,at,atomic,attribute,attributes,"
+ + "authorization,avg,before,begin,bernoulli,between,bigint,binary,blob,boolean,both,breadth,by,"
+ + "c,call,called,cardinality,cascade,cascaded,case,cast,catalog,catalog_name,ceil,ceiling,chain,"
+ + "char,char_length,character,character_length,character_set_catalog,character_set_name,"
+ + "character_set_schema,characteristics,characters,check,checked,class_origin,clob,close,"
+ + "coalesce,cobol,code_units,collate,collation,collation_catalog,collation_name,collation_schema,"
+ + "collect,column,column_name,command_function,command_function_code,commit,committed,condition,"
+ + "condition_number,connect,connection_name,constraint,constraint_catalog,constraint_name,"
+ + "constraint_schema,constraints,constructors,contains,continue,convert,corr,corresponding,count,"
+ + "covar_pop,covar_samp,create,cross,cube,cume_dist,current,current_collation,current_date,"
+ + "current_default_transform_group,current_path,current_role,current_time,current_timestamp,"
+ + "current_transform_group_for_type,current_user,cursor,cursor_name,cycle,data,date,datetime_interval_code,"
+ + "datetime_interval_precision,day,deallocate,dec,decimal,declare,default,defaults,deferrable,"
+ + "deferred,defined,definer,degree,delete,dense_rank,depth,deref,derived,desc,describe,"
+ + "descriptor,deterministic,diagnostics,disconnect,dispatch,distinct,domain,double,drop,dynamic,"
+ + "dynamic_function,dynamic_function_code,each,element,else,end,end-exec,equals,escape,every,"
+ + "except,exception,exclude,excluding,exec,execute,exists,exp,external,extract,false,fetch,filter,"
+ + "final,first,float,floor,following,for,foreign,fortran,found,free,from,full,function,fusion,"
+ + "g,general,get,global,go,goto,grant,granted,group,grouping,having,hierarchy,hold,hour,identity,"
+ + "immediate,implementation,in,including,increment,indicator,initially,inner,inout,input,"
+ + "insensitive,insert,instance,instantiable,int,integer,intersect,intersection,interval,into,"
+ + "invoker,is,isolation,join,k,key,key_member,key_type,language,large,last,lateral,leading,left,"
+ + "length,level,like,ln,local,localtime,localtimestamp,locator,lower,m,map,match,matched,max,"
+ + "maxvalue,member,merge,message_length,message_octet_length,message_text,method,min,minute,"
+ + "minvalue,mod,modifies,module,month,more,multiset,mumps,name,names,national,natural,nchar,"
+ + "nclob,nesting,new,next,no,none,normalize,normalized,not,null,nullable,nullif,nulls,number,"
+ + "numeric,object,octet_length,octets,of,old,on,only,open,option,options,or,order,ordering,"
+ + "ordinality,others,out,outer,output,over,overlaps,overlay,overriding,pad,parameter,parameter_mode,"
+ + "parameter_name,parameter_ordinal_position,parameter_specific_catalog,parameter_specific_name,"
+ + "parameter_specific_schema,partial,partition,pascal,path,percent_rank,percentile_cont,"
+ + "percentile_disc,placing,pli,position,power,preceding,precision,prepare,preserve,primary,"
+ + "prior,privileges,procedure,public,range,rank,read,reads,real,recursive,ref,references,"
+ + "referencing,regr_avgx,regr_avgy,regr_count,regr_intercept,regr_r2,regr_slope,regr_sxx,"
+ + "regr_sxy,regr_syy,relative,release,repeatable,restart,result,return,returned_cardinality,"
+ + "returned_length,returned_octet_length,returned_sqlstate,returns,revoke,right,role,rollback,"
+ + "rollup,routine,routine_catalog,routine_name,routine_schema,row,row_count,row_number,rows,"
+ + "savepoint,scale,schema,schema_name,scope_catalog,scope_name,scope_schema,scroll,search,second,"
+ + "section,security,select,self,sensitive,sequence,serializable,server_name,session,session_user,"
+ + "set,sets,similar,simple,size,smallint,some,source,space,specific,specific_name,specifictype,sql,"
+ + "sqlexception,sqlstate,sqlwarning,sqrt,start,state,statement,static,stddev_pop,stddev_samp,"
+ + "structure,style,subclass_origin,submultiset,substring,sum,symmetric,system,system_user,table,"
+ + "table_name,tablesample,temporary,then,ties,time,timestamp,timezone_hour,timezone_minute,to,"
+ + "top_level_count,trailing,transaction,transaction_active,transactions_committed,"
+ + "transactions_rolled_back,transform,transforms,translate,translation,treat,trigger,trigger_catalog,"
+ + "trigger_name,trigger_schema,trim,true,type,uescape,unbounded,uncommitted,under,union,unique,"
+ + "unknown,unnamed,unnest,update,upper,usage,user,user_defined_type_catalog,user_defined_type_code,"
+ + "user_defined_type_name,user_defined_type_schema,using,value,values,var_pop,var_samp,varchar,"
+ + "varying,view,when,whenever,where,width_bucket,window,with,within,without,work,write,year,zone";
+
+ String[] excludeSQL2003 = sql2003.split(",");
+ String[] returned = keywords.split(",");
+ Set<String> returnedSet = new HashSet<String>(Arrays.asList(returned));
+ Assert.assertEquals("Returned keywords should be unique", returnedSet.size(), returned.length);
+
+ for (String s : excludeSQL2003) {
+ assertFalse("Keyword from SQL:2003 \"" + s + "\" found", returnedSet.contains(s));
+ }
+
+ if (TestUtil.haveMinimumServerVersion(con, ServerVersion.v9_0)) {
+ Assert.assertTrue("reindex should be in keywords", returnedSet.contains("reindex"));
+ }
+ }
+
}
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/DateStyleTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/DateStyleTest.java
new file mode 100644
index 0000000..4f69e9a
--- /dev/null
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/DateStyleTest.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 2018, PostgreSQL Global Development Group
+ * See the LICENSE file in the project root for more information.
+ */
+
+package org.postgresql.test.jdbc2;
+
+import org.postgresql.test.TestUtil;
+import org.postgresql.util.PSQLState;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.Arrays;
+
+ at RunWith(Parameterized.class)
+public class DateStyleTest extends BaseTest4 {
+
+ @Parameterized.Parameter(0)
+ public String dateStyle;
+
+ @Parameterized.Parameter(1)
+ public boolean shouldPass;
+
+
+ @Parameterized.Parameters(name = "dateStyle={0}, shouldPass={1}")
+ public static Iterable<Object[]> data() {
+ return Arrays.asList(new Object[][]{
+ {"iso, mdy", true},
+ {"ISO", true},
+ {"ISO,ymd", true},
+ {"PostgreSQL", false}
+ });
+ }
+
+ @Test
+ public void conenct() throws SQLException {
+ Statement st = con.createStatement();
+ try {
+ st.execute("set DateStyle='" + dateStyle + "'");
+ if (!shouldPass) {
+ Assert.fail("Set DateStyle=" + dateStyle + " should not be allowed");
+ }
+ } catch (SQLException e) {
+ if (shouldPass) {
+ throw new IllegalStateException("Set DateStyle=" + dateStyle
+ + " should be fine, however received " + e.getMessage(), e);
+ }
+ if (PSQLState.CONNECTION_FAILURE.getState().equals(e.getSQLState())) {
+ return;
+ }
+ throw new IllegalStateException("Set DateStyle=" + dateStyle
+ + " should result in CONNECTION_FAILURE error, however received " + e.getMessage(), e);
+ } finally {
+ TestUtil.closeQuietly(st);
+ }
+ }
+}
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/DateTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/DateTest.java
index 6ed369a..1f54965 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/DateTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/DateTest.java
@@ -5,9 +5,15 @@
package org.postgresql.test.jdbc2;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
import org.postgresql.test.TestUtil;
-import junit.framework.TestCase;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
import java.sql.Connection;
import java.sql.PreparedStatement;
@@ -20,20 +26,17 @@ import java.sql.Statement;
* problems from re-occurring ;-)
*
*/
-public class DateTest extends TestCase {
-
+public class DateTest {
private Connection con;
- public DateTest(String name) {
- super(name);
- }
-
- protected void setUp() throws Exception {
+ @Before
+ public void setUp() throws Exception {
con = TestUtil.openDB();
TestUtil.createTable(con, "testdate", "dt date");
}
- protected void tearDown() throws Exception {
+ @After
+ public void tearDown() throws Exception {
TestUtil.dropTable(con, "testdate");
TestUtil.closeDB(con);
}
@@ -41,6 +44,7 @@ public class DateTest extends TestCase {
/*
* Tests the time methods in ResultSet
*/
+ @Test
public void testGetDate() throws SQLException {
Statement stmt = con.createStatement();
@@ -73,6 +77,7 @@ public class DateTest extends TestCase {
/*
* Tests the time methods in PreparedStatement
*/
+ @Test
public void testSetDate() throws SQLException {
Statement stmt = con.createStatement();
PreparedStatement ps = con.prepareStatement(TestUtil.insertSQL("testdate", "?"));
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/DriverTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/DriverTest.java
index 70b323f..317f437 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/DriverTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/DriverTest.java
@@ -5,32 +5,49 @@
package org.postgresql.test.jdbc2;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
import org.postgresql.Driver;
+import org.postgresql.PGProperty;
import org.postgresql.test.TestUtil;
+import org.postgresql.util.NullOutputStream;
+import org.postgresql.util.WriterHandler;
-import junit.framework.TestCase;
-import org.junit.Assert;
+import org.junit.Test;
+import java.io.PrintWriter;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.DriverManager;
+import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Properties;
+import java.util.logging.Handler;
+import java.util.logging.Logger;
/*
* Tests the dynamically created class org.postgresql.Driver
*
*/
-public class DriverTest extends TestCase {
+public class DriverTest {
+
+ @Test
+ public void urlIsNotForPostgreSQL() throws SQLException {
+ Driver driver = new Driver();
- public DriverTest(String name) {
- super(name);
+ assertNull(driver.connect("jdbc:otherdb:database", new Properties()));
}
/*
* This tests the acceptsURL() method with a couple of well and poorly formed jdbc urls.
*/
+ @Test
public void testAcceptsURL() throws Exception {
TestUtil.initDriver(); // Set up log levels, etc.
@@ -69,14 +86,15 @@ public class DriverTest extends TestCase {
drv.getClass().getDeclaredMethod("parseURL", String.class, Properties.class);
parseMethod.setAccessible(true);
Properties p = (Properties) parseMethod.invoke(drv, url, null);
- assertEquals(url, dbName, p.getProperty("PGDBNAME"));
- assertEquals(url, hosts, p.getProperty("PGHOST"));
- assertEquals(url, ports, p.getProperty("PGPORT"));
+ assertEquals(url, dbName, p.getProperty(PGProperty.PG_DBNAME.getName()));
+ assertEquals(url, hosts, p.getProperty(PGProperty.PG_HOST.getName()));
+ assertEquals(url, ports, p.getProperty(PGProperty.PG_PORT.getName()));
}
/**
* Tests the connect method by connecting to the test database
*/
+ @Test
public void testConnect() throws Exception {
TestUtil.initDriver(); // Set up log levels, etc.
@@ -101,6 +119,7 @@ public class DriverTest extends TestCase {
*
* @throws Exception if something wrong happens
*/
+ @Test
public void testConnectFailover() throws Exception {
String url = "jdbc:postgresql://invalidhost.not.here," + TestUtil.getServer() + ":"
+ TestUtil.getPort() + "/" + TestUtil.getDatabase() + "?connectTimeout=5";
@@ -112,6 +131,7 @@ public class DriverTest extends TestCase {
/*
* Test that the readOnly property works.
*/
+ @Test
public void testReadOnly() throws Exception {
TestUtil.initDriver(); // Set up log levels, etc.
@@ -134,14 +154,14 @@ public class DriverTest extends TestCase {
con.close();
}
+ @Test
public void testRegistration() throws Exception {
TestUtil.initDriver();
- ArrayList<java.sql.Driver> drivers;
// Driver is initially registered because it is automatically done when class is loaded
- Assert.assertTrue(org.postgresql.Driver.isRegistered());
+ assertTrue(org.postgresql.Driver.isRegistered());
- drivers = Collections.list(DriverManager.getDrivers());
+ ArrayList<java.sql.Driver> drivers = Collections.list(DriverManager.getDrivers());
searchInstanceOf: {
for (java.sql.Driver driver : drivers) {
@@ -149,24 +169,23 @@ public class DriverTest extends TestCase {
break searchInstanceOf;
}
}
- Assert.fail("Driver has not been found in DriverManager's list but it should be registered");
+ fail("Driver has not been found in DriverManager's list but it should be registered");
}
// Deregister the driver
Driver.deregister();
- Assert.assertFalse(Driver.isRegistered());
+ assertFalse(Driver.isRegistered());
drivers = Collections.list(DriverManager.getDrivers());
for (java.sql.Driver driver : drivers) {
if (driver instanceof org.postgresql.Driver) {
- Assert
- .fail("Driver should be deregistered but it is still present in DriverManager's list");
+ fail("Driver should be deregistered but it is still present in DriverManager's list");
}
}
// register again the driver
Driver.register();
- Assert.assertTrue(Driver.isRegistered());
+ assertTrue(Driver.isRegistered());
drivers = Collections.list(DriverManager.getDrivers());
for (java.sql.Driver driver : drivers) {
@@ -174,6 +193,76 @@ public class DriverTest extends TestCase {
return;
}
}
- Assert.fail("Driver has not been found in DriverManager's list but it should be registered");
+ fail("Driver has not been found in DriverManager's list but it should be registered");
+ }
+
+ @Test
+ public void testSetLogWriter() throws Exception {
+
+ // this is a dummy to make sure TestUtil is initialized
+ Connection con = DriverManager.getConnection(TestUtil.getURL(), TestUtil.getUser(), TestUtil.getPassword());
+ con.close();
+ String loggerLevel = System.getProperty("loggerLevel");
+ String loggerFile = System.getProperty("loggerFile");
+
+ try {
+
+ PrintWriter printWriter = new PrintWriter(new NullOutputStream(System.err));
+ DriverManager.setLogWriter(printWriter);
+ assertEquals(DriverManager.getLogWriter(), printWriter);
+ System.clearProperty("loggerFile");
+ System.clearProperty("loggerLevel");
+ Properties props = new Properties();
+ props.setProperty("user", TestUtil.getUser());
+ props.setProperty("password", TestUtil.getPassword());
+ props.setProperty("loggerLevel", "DEBUG");
+ con = DriverManager.getConnection(TestUtil.getURL(), props);
+
+ Logger logger = Logger.getLogger("org.postgresql");
+ Handler[] handlers = logger.getHandlers();
+ assertTrue(handlers[0] instanceof WriterHandler );
+ con.close();
+ } finally {
+ DriverManager.setLogWriter(null);
+ System.setProperty("loggerLevel", loggerLevel);
+ System.setProperty("loggerFile", loggerFile);
+
+ }
+
}
+
+ @Test
+ public void testSetLogStream() throws Exception {
+
+ // this is a dummy to make sure TestUtil is initialized
+ Connection con = DriverManager.getConnection(TestUtil.getURL(), TestUtil.getUser(), TestUtil.getPassword());
+ con.close();
+ String loggerLevel = System.getProperty("loggerLevel");
+ String loggerFile = System.getProperty("loggerFile");
+
+ try {
+
+ DriverManager.setLogStream(new NullOutputStream(System.err));
+ System.clearProperty("loggerFile");
+ System.clearProperty("loggerLevel");
+ Properties props = new Properties();
+ props.setProperty("user", TestUtil.getUser());
+ props.setProperty("password", TestUtil.getPassword());
+ props.setProperty("loggerLevel", "DEBUG");
+ con = DriverManager.getConnection(TestUtil.getURL(), props);
+
+ Logger logger = Logger.getLogger("org.postgresql");
+ Handler []handlers = logger.getHandlers();
+ assertTrue( handlers[0] instanceof WriterHandler );
+ con.close();
+ } finally {
+ DriverManager.setLogStream(null);
+ System.setProperty("loggerLevel", loggerLevel);
+ System.setProperty("loggerFile", loggerFile);
+
+
+ }
+
+ }
+
}
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/EncodingTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/EncodingTest.java
index ac6b2a9..8b43a9a 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/EncodingTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/EncodingTest.java
@@ -5,27 +5,24 @@
package org.postgresql.test.jdbc2;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
import org.postgresql.core.Encoding;
-import junit.framework.TestCase;
+import org.junit.Test;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.Reader;
import java.util.Locale;
-/*
+/**
* Tests for the Encoding class.
- *
*/
+public class EncodingTest {
-
-public class EncodingTest extends TestCase {
-
- public EncodingTest(String name) {
- super(name);
- }
-
+ @Test
public void testCreation() throws Exception {
Encoding encoding = Encoding.getDatabaseEncoding("UTF8");
assertEquals("UTF", encoding.name().substring(0, 3).toUpperCase(Locale.US));
@@ -35,6 +32,7 @@ public class EncodingTest extends TestCase {
Encoding.defaultEncoding(), Encoding.getDatabaseEncoding("UNKNOWN"));
}
+ @Test
public void testTransformations() throws Exception {
Encoding encoding = Encoding.getDatabaseEncoding("UTF8");
assertEquals("ab", encoding.decode(new byte[]{97, 98}));
@@ -48,6 +46,7 @@ public class EncodingTest extends TestCase {
assertEquals(new String(new byte[]{97}), encoding.decode(new byte[]{97}));
}
+ @Test
public void testReader() throws Exception {
Encoding encoding = Encoding.getDatabaseEncoding("SQL_ASCII");
InputStream stream = new ByteArrayInputStream(new byte[]{97, 98});
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/GeometricTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/GeometricTest.java
index fe50360..dac1a2a 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/GeometricTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/GeometricTest.java
@@ -5,6 +5,11 @@
package org.postgresql.test.jdbc2;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import org.postgresql.core.ServerVersion;
import org.postgresql.geometric.PGbox;
import org.postgresql.geometric.PGcircle;
import org.postgresql.geometric.PGline;
@@ -16,7 +21,9 @@ import org.postgresql.test.TestUtil;
import org.postgresql.util.PGobject;
import org.postgresql.util.PSQLException;
-import junit.framework.TestCase;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
import java.sql.Connection;
import java.sql.PreparedStatement;
@@ -25,27 +32,24 @@ import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
-
/*
* Test case for geometric type I/O
*/
-public class GeometricTest extends TestCase {
+public class GeometricTest {
private Connection con;
- public GeometricTest(String name) {
- super(name);
- }
-
// Set up the fixture for this testcase: a connection to a database with
// a table for this test.
- protected void setUp() throws Exception {
+ @Before
+ public void setUp() throws Exception {
con = TestUtil.openDB();
TestUtil.createTable(con, "testgeometric",
"boxval box, circleval circle, lsegval lseg, pathval path, polygonval polygon, pointval point, lineval line");
}
// Tear down the fixture for this test case.
- protected void tearDown() throws Exception {
+ @After
+ public void tearDown() throws Exception {
TestUtil.dropTable(con, "testgeometric");
TestUtil.closeDB(con);
}
@@ -67,6 +71,7 @@ public class GeometricTest extends TestCase {
stmt.close();
}
+ @Test
public void testPGbox() throws Exception {
checkReadWrite(new PGbox(1.0, 2.0, 3.0, 4.0), "boxval");
checkReadWrite(new PGbox(-1.0, 2.0, 3.0, 4.0), "boxval");
@@ -75,12 +80,14 @@ public class GeometricTest extends TestCase {
checkReadWrite(new PGbox(1.0, 2.0, 3.0, -4.0), "boxval");
}
+ @Test
public void testPGcircle() throws Exception {
checkReadWrite(new PGcircle(1.0, 2.0, 3.0), "circleval");
checkReadWrite(new PGcircle(-1.0, 2.0, 3.0), "circleval");
checkReadWrite(new PGcircle(1.0, -2.0, 3.0), "circleval");
}
+ @Test
public void testPGlseg() throws Exception {
checkReadWrite(new PGlseg(1.0, 2.0, 3.0, 4.0), "lsegval");
checkReadWrite(new PGlseg(-1.0, 2.0, 3.0, 4.0), "lsegval");
@@ -89,6 +96,7 @@ public class GeometricTest extends TestCase {
checkReadWrite(new PGlseg(1.0, 2.0, 3.0, -4.0), "lsegval");
}
+ @Test
public void testPGpath() throws Exception {
PGpoint[] points =
new PGpoint[]{new PGpoint(0.0, 0.0), new PGpoint(0.0, 5.0), new PGpoint(5.0, 5.0),
@@ -98,6 +106,7 @@ public class GeometricTest extends TestCase {
checkReadWrite(new PGpath(points, false), "pathval");
}
+ @Test
public void testPGpolygon() throws Exception {
PGpoint[] points =
new PGpoint[]{new PGpoint(0.0, 0.0), new PGpoint(0.0, 5.0), new PGpoint(5.0, 5.0),
@@ -106,14 +115,15 @@ public class GeometricTest extends TestCase {
checkReadWrite(new PGpolygon(points), "polygonval");
}
+ @Test
public void testPGline() throws Exception {
final String columnName = "lineval";
// PostgreSQL versions older than 9.4 support creating columns with the LINE datatype, but
// not actually writing to those columns. Only try to write if the version if at least 9.4
- final boolean roundTripToDatabase = TestUtil.haveMinimumServerVersion(con, "9.4");
+ final boolean roundTripToDatabase = TestUtil.haveMinimumServerVersion(con, ServerVersion.v9_4);
- if (TestUtil.haveMinimumServerVersion(con, "9.4")) {
+ if (TestUtil.haveMinimumServerVersion(con, ServerVersion.v9_4)) {
// Apparently the driver requires public no-args constructor, and postgresql doesn't accept
// lines with A and B
@@ -160,6 +170,7 @@ public class GeometricTest extends TestCase {
}
}
+ @Test
public void testPGpoint() throws Exception {
checkReadWrite(new PGpoint(1.0, 2.0), "pointval");
}
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/GetXXXTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/GetXXXTest.java
index da4aeec..cb717c9 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/GetXXXTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/GetXXXTest.java
@@ -5,9 +5,15 @@
package org.postgresql.test.jdbc2;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
import org.postgresql.test.TestUtil;
-import junit.framework.TestCase;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
import java.sql.Connection;
import java.sql.PreparedStatement;
@@ -17,20 +23,15 @@ import java.sql.Statement;
import java.sql.Timestamp;
import java.util.Calendar;
import java.util.HashMap;
+
/*
* Test for getObject
*/
+public class GetXXXTest {
+ private Connection con = null;
-public class GetXXXTest extends TestCase {
- Connection con = null;
-
- public GetXXXTest(String name) {
- super(name);
- }
-
- protected void setUp() throws Exception {
- super.setUp();
-
+ @Before
+ public void setUp() throws Exception {
con = TestUtil.openDB();
TestUtil.createTempTable(con, "test_interval",
"initial timestamp with time zone, final timestamp with time zone");
@@ -40,16 +41,17 @@ public class GetXXXTest extends TestCase {
pstmt.setTimestamp(1, new Timestamp(cal.getTime().getTime()));
pstmt.setTimestamp(2, new Timestamp(System.currentTimeMillis()));
- assertTrue(pstmt.executeUpdate() == 1);
+ assertEquals(1, pstmt.executeUpdate());
pstmt.close();
}
- protected void tearDown() throws Exception {
- super.tearDown();
+ @After
+ public void tearDown() throws Exception {
TestUtil.dropTable(con, "test_interval");
con.close();
}
+ @Test
public void testGetObject() throws SQLException {
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("select (final-initial) as diff from test_interval");
@@ -62,6 +64,7 @@ public class GetXXXTest extends TestCase {
}
}
+ @Test
public void testGetUDT() throws SQLException {
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("select (final-initial) as diff from test_interval");
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/IntervalTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/IntervalTest.java
index c498c06..6465774 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/IntervalTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/IntervalTest.java
@@ -5,10 +5,17 @@
package org.postgresql.test.jdbc2;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
import org.postgresql.test.TestUtil;
import org.postgresql.util.PGInterval;
-import junit.framework.TestCase;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
import java.sql.Connection;
import java.sql.PreparedStatement;
@@ -19,34 +26,32 @@ import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
-public class IntervalTest extends TestCase {
-
- private Connection _conn;
+public class IntervalTest {
+ private Connection conn;
- public IntervalTest(String name) {
- super(name);
+ @Before
+ public void setUp() throws Exception {
+ conn = TestUtil.openDB();
+ TestUtil.createTable(conn, "testinterval", "v interval");
+ TestUtil.createTable(conn, "testdate", "v date");
}
- protected void setUp() throws Exception {
- _conn = TestUtil.openDB();
- TestUtil.createTable(_conn, "testinterval", "v interval");
- TestUtil.createTable(_conn, "testdate", "v date");
- }
+ @After
+ public void tearDown() throws Exception {
+ TestUtil.dropTable(conn, "testinterval");
+ TestUtil.dropTable(conn, "testdate");
- protected void tearDown() throws Exception {
- TestUtil.dropTable(_conn, "testinterval");
- TestUtil.dropTable(_conn, "testdate");
-
- TestUtil.closeDB(_conn);
+ TestUtil.closeDB(conn);
}
+ @Test
public void testOnlineTests() throws SQLException {
- PreparedStatement pstmt = _conn.prepareStatement("INSERT INTO testinterval VALUES (?)");
+ PreparedStatement pstmt = conn.prepareStatement("INSERT INTO testinterval VALUES (?)");
pstmt.setObject(1, new PGInterval(2004, 13, 28, 0, 0, 43000.9013));
pstmt.executeUpdate();
pstmt.close();
- Statement stmt = _conn.createStatement();
+ Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT v FROM testinterval");
assertTrue(rs.next());
PGInterval pgi = (PGInterval) rs.getObject(1);
@@ -61,15 +66,16 @@ public class IntervalTest extends TestCase {
stmt.close();
}
+ @Test
public void testStringToIntervalCoercion() throws SQLException {
- Statement stmt = _conn.createStatement();
+ Statement stmt = conn.createStatement();
stmt.executeUpdate(TestUtil.insertSQL("testdate", "'2010-01-01'"));
stmt.executeUpdate(TestUtil.insertSQL("testdate", "'2010-01-02'"));
stmt.executeUpdate(TestUtil.insertSQL("testdate", "'2010-01-04'"));
stmt.executeUpdate(TestUtil.insertSQL("testdate", "'2010-01-05'"));
stmt.close();
- PreparedStatement pstmt = _conn.prepareStatement(
+ PreparedStatement pstmt = conn.prepareStatement(
"SELECT v FROM testdate WHERE v < (?::timestamp with time zone + ? * ?::interval) ORDER BY v");
pstmt.setObject(1, makeDate(2010, 1, 1));
pstmt.setObject(2, Integer.valueOf(2));
@@ -97,6 +103,7 @@ public class IntervalTest extends TestCase {
}
+ @Test
public void testIntervalToStringCoercion() throws SQLException {
PGInterval interval = new PGInterval("1 year 3 months");
String coercedStringValue = interval.toString();
@@ -105,22 +112,20 @@ public class IntervalTest extends TestCase {
}
+ @Test
public void testDaysHours() throws SQLException {
- Statement stmt = _conn.createStatement();
+ Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT '101:12:00'::interval");
assertTrue(rs.next());
PGInterval i = (PGInterval) rs.getObject(1);
// 8.1 servers store hours and days separately.
- if (TestUtil.haveMinimumServerVersion(_conn, "8.1")) {
- assertEquals(0, i.getDays());
- assertEquals(101, i.getHours());
- } else {
- assertEquals(4, i.getDays());
- assertEquals(5, i.getHours());
- }
+ assertEquals(0, i.getDays());
+ assertEquals(101, i.getHours());
+
assertEquals(12, i.getMinutes());
}
+ @Test
public void testAddRounding() {
PGInterval pgi = new PGInterval(0, 0, 0, 0, 0, 0.6006);
Calendar cal = Calendar.getInstance();
@@ -133,6 +138,7 @@ public class IntervalTest extends TestCase {
assertEquals(origTime, cal.getTime().getTime());
}
+ @Test
public void testOfflineTests() throws Exception {
PGInterval pgi = new PGInterval(2004, 4, 20, 15, 57, 12.1);
@@ -172,7 +178,7 @@ public class IntervalTest extends TestCase {
assertEquals(-12.1, pgi.getSeconds(), 0);
}
- Calendar getStartCalendar() {
+ private Calendar getStartCalendar() {
Calendar cal = new GregorianCalendar();
cal.set(Calendar.YEAR, 2005);
cal.set(Calendar.MONTH, 4);
@@ -185,6 +191,7 @@ public class IntervalTest extends TestCase {
return cal;
}
+ @Test
public void testCalendar() throws Exception {
Calendar cal = getStartCalendar();
@@ -235,6 +242,7 @@ public class IntervalTest extends TestCase {
assertEquals(100, cal.get(Calendar.MILLISECOND));
}
+ @Test
public void testDate() throws Exception {
Date date = getStartCalendar().getTime();
Date date2 = getStartCalendar().getTime();
@@ -249,6 +257,7 @@ public class IntervalTest extends TestCase {
assertEquals(date2, date);
}
+ @Test
public void testISODate() throws Exception {
Date date = getStartCalendar().getTime();
Date date2 = getStartCalendar().getTime();
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/JBuilderTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/JBuilderTest.java
index 731280a..872144e 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/JBuilderTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/JBuilderTest.java
@@ -5,9 +5,13 @@
package org.postgresql.test.jdbc2;
+import static org.junit.Assert.assertNotNull;
+
import org.postgresql.test.TestUtil;
-import junit.framework.TestCase;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
import java.sql.Connection;
import java.sql.ResultSet;
@@ -17,14 +21,11 @@ import java.sql.Statement;
* Some simple tests to check that the required components needed for JBuilder stay working
*
*/
-public class JBuilderTest extends TestCase {
-
- public JBuilderTest(String name) {
- super(name);
- }
+public class JBuilderTest {
// Set up the fixture for this testcase: the tables for this test.
- protected void setUp() throws Exception {
+ @Before
+ public void setUp() throws Exception {
Connection con = TestUtil.openDB();
TestUtil.createTable(con, "test_c", "source text,cost money,imageid int4");
@@ -33,7 +34,8 @@ public class JBuilderTest extends TestCase {
}
// Tear down the fixture for this test case.
- protected void tearDown() throws Exception {
+ @After
+ public void tearDown() throws Exception {
Connection con = TestUtil.openDB();
TestUtil.dropTable(con, "test_c");
TestUtil.closeDB(con);
@@ -42,6 +44,7 @@ public class JBuilderTest extends TestCase {
/*
* This tests that Money types work. JDBCExplorer barfs if this fails.
*/
+ @Test
public void testMoney() throws Exception {
Connection con = TestUtil.openDB();
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/Jdbc2TestSuite.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/Jdbc2TestSuite.java
index 780cae6..dc1dc24 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/Jdbc2TestSuite.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/Jdbc2TestSuite.java
@@ -5,136 +5,127 @@
package org.postgresql.test.jdbc2;
+import org.postgresql.core.OidToStringTest;
+import org.postgresql.core.OidValueOfTest;
import org.postgresql.core.ParserTest;
+import org.postgresql.core.ReturningParserTest;
import org.postgresql.core.v3.V3ParameterListTests;
import org.postgresql.jdbc.DeepBatchedInsertStatementTest;
-import org.postgresql.test.CursorFetchBinaryTest;
-import org.postgresql.test.TestUtil;
+import org.postgresql.jdbc.PrimitiveArraySupportTest;
+import org.postgresql.test.core.JavaVersionTest;
import org.postgresql.test.core.NativeQueryBindLengthTest;
+import org.postgresql.test.util.ExpressionPropertiesTest;
+import org.postgresql.test.util.LruCacheTest;
import org.postgresql.test.util.ServerVersionParseTest;
import org.postgresql.test.util.ServerVersionTest;
+import org.postgresql.util.ReaderInputStreamTest;
-import junit.framework.JUnit4TestAdapter;
-import junit.framework.TestSuite;
-
-import java.sql.Connection;
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
/*
* Executes all known tests for JDBC2 and includes some utility methods.
*/
-public class Jdbc2TestSuite extends TestSuite {
-
- /*
- * The main entry point for JUnit
- */
- public static TestSuite suite() throws Exception {
- TestSuite suite = new TestSuite();
-
- //
- // Add one line per class in our test cases. These should be in order of
- // complexity.
-
- // ANTTest should be first as it ensures that test parameters are
- // being sent to the suite.
- //
- suite.addTestSuite(ANTTest.class);
-
- // Basic Driver internals
- suite.addTestSuite(DriverTest.class);
- suite.addTestSuite(ConnectionTest.class);
- suite.addTestSuite(DatabaseMetaDataTest.class);
- suite.addTestSuite(DatabaseMetaDataPropertiesTest.class);
- suite.addTestSuite(SearchPathLookupTest.class);
- suite.addTestSuite(EncodingTest.class);
- suite.addTestSuite(ColumnSanitiserDisabledTest.class);
- suite.addTestSuite(ColumnSanitiserEnabledTest.class);
- suite.addTest(new JUnit4TestAdapter(ServerVersionParseTest.class));
- suite.addTest(new JUnit4TestAdapter(ServerVersionTest.class));
-
- // Connectivity/Protocols
-
- suite.addTest(new JUnit4TestAdapter(TypeCacheDLLStressTest.class));
-
- // ResultSet
- suite.addTest(new JUnit4TestAdapter(ResultSetTest.class));
- suite.addTest(new JUnit4TestAdapter(ResultSetMetaDataTest.class));
- suite.addTest(new JUnit4TestAdapter(ArrayTest.class));
- suite.addTest(new JUnit4TestAdapter(RefCursorTest.class));
-
- // Time, Date, Timestamp, PGTime, PGTimestamp
- suite.addTestSuite(DateTest.class);
- suite.addTestSuite(TimeTest.class);
- suite.addTestSuite(TimestampTest.class);
- suite.addTestSuite(TimezoneTest.class);
- suite.addTest(new JUnit4TestAdapter(PGTimeTest.class));
- suite.addTestSuite(PGTimestampTest.class);
- suite.addTest(new JUnit4TestAdapter(TimezoneCachingTest.class));
- suite.addTestSuite(ParserTest.class);
-
- // PreparedStatement
- suite.addTest(new JUnit4TestAdapter(PreparedStatementTest.class));
- suite.addTestSuite(StatementTest.class);
- suite.addTest(new JUnit4TestAdapter(QuotationTest.class));
-
- // ServerSide Prepared Statements
- suite.addTest(new JUnit4TestAdapter(ServerPreparedStmtTest.class));
-
- // BatchExecute
- suite.addTest(new JUnit4TestAdapter(BatchExecuteTest.class));
- suite.addTest(new JUnit4TestAdapter(BatchFailureTest.class));
-
- suite.addTest(new JUnit4TestAdapter(BatchedInsertReWriteEnabledTest.class));
- suite.addTest(new JUnit4TestAdapter(NativeQueryBindLengthTest.class));
- suite.addTestSuite(DeepBatchedInsertStatementTest.class);
-
- // Other misc tests, based on previous problems users have had or specific
- // features some applications require.
- suite.addTestSuite(JBuilderTest.class);
- suite.addTestSuite(MiscTest.class);
- suite.addTestSuite(NotifyTest.class);
- suite.addTestSuite(DatabaseEncodingTest.class);
-
- // Fastpath/LargeObject
- suite.addTestSuite(BlobTest.class);
- suite.addTestSuite(OID74Test.class);
- suite.addTestSuite(BlobTransactionTest.class);
-
- suite.addTest(new JUnit4TestAdapter(UpdateableResultTest.class));
-
- suite.addTest(new JUnit4TestAdapter(CallableStmtTest.class));
- suite.addTestSuite(CursorFetchTest.class);
- suite.addTestSuite(CursorFetchBinaryTest.class);
- suite.addTest(new JUnit4TestAdapter(ServerCursorTest.class));
-
- suite.addTestSuite(IntervalTest.class);
- suite.addTestSuite(GeometricTest.class);
-
- suite.addTestSuite(LoginTimeoutTest.class);
- suite.addTestSuite(TestACL.class);
-
- suite.addTestSuite(ConnectTimeoutTest.class);
-
- suite.addTestSuite(PGPropertyTest.class);
-
- suite.addTestSuite(V3ParameterListTests.class);
-
- Connection conn = TestUtil.openDB();
- if (TestUtil.isProtocolVersion(conn, 3)) {
- suite.addTestSuite(CopyTest.class);
- suite.addTestSuite(CopyLargeFileTest.class);
- }
- if (TestUtil.haveMinimumServerVersion(conn, "9.3")) {
- suite.addTestSuite(ServerErrorTest.class);
- }
-
- if (TestUtil.haveMinimumServerVersion(conn, "9.5")) {
- suite.addTestSuite(UpsertTest.class);
- suite.addTestSuite(UpsertBinaryTest.class);
- }
-
- conn.close();
-
- // That's all folks
- return suite;
- }
+ at RunWith(Suite.class)
+ at Suite.SuiteClasses({
+ ANTTest.class,
+ JavaVersionTest.class,
+
+ DriverTest.class,
+ ConnectionTest.class,
+ DateStyleTest.class,
+ DatabaseMetaDataTest.class,
+ DatabaseMetaDataPropertiesTest.class,
+ SearchPathLookupTest.class,
+ EncodingTest.class,
+ ExpressionPropertiesTest.class,
+ ColumnSanitiserDisabledTest.class,
+ ColumnSanitiserEnabledTest.class,
+ LruCacheTest.class,
+ ReaderInputStreamTest.class,
+ ServerVersionParseTest.class,
+ ServerVersionTest.class,
+
+ DriverTest.class,
+ ConnectionTest.class,
+ DatabaseMetaDataTest.class,
+ DatabaseMetaDataPropertiesTest.class,
+ SearchPathLookupTest.class,
+ EncodingTest.class,
+ ExpressionPropertiesTest.class,
+ ColumnSanitiserDisabledTest.class,
+ ColumnSanitiserEnabledTest.class,
+ LruCacheTest.class,
+ ReaderInputStreamTest.class,
+ ServerVersionParseTest.class,
+ ServerVersionTest.class,
+
+ TypeCacheDLLStressTest.class,
+
+ ResultSetTest.class,
+ ResultSetMetaDataTest.class,
+ StringTypeUnspecifiedArrayTest.class,
+ ArrayTest.class,
+ PrimitiveArraySupportTest.class,
+ RefCursorTest.class,
+
+ DateTest.class,
+ TimeTest.class,
+ TimestampTest.class,
+ TimezoneTest.class,
+ PGTimeTest.class,
+ PGTimestampTest.class,
+ TimezoneCachingTest.class,
+ ParserTest.class,
+ ReturningParserTest.class,
+
+ OidToStringTest.class,
+ OidValueOfTest.class,
+
+ PreparedStatementTest.class,
+ StatementTest.class,
+ QuotationTest.class,
+
+ ServerPreparedStmtTest.class,
+
+ BatchExecuteTest.class,
+ BatchFailureTest.class,
+
+ BatchedInsertReWriteEnabledTest.class,
+ NativeQueryBindLengthTest.class,
+ DeepBatchedInsertStatementTest.class,
+ JBuilderTest.class,
+ MiscTest.class,
+ NotifyTest.class,
+ DatabaseEncodingTest.class,
+ ClientEncodingTest.class,
+
+ BlobTest.class,
+ BlobTransactionTest.class,
+
+ UpdateableResultTest.class,
+
+ CallableStmtTest.class,
+ CursorFetchTest.class,
+ ConcurrentStatementFetch.class,
+ ServerCursorTest.class,
+
+ IntervalTest.class,
+ GeometricTest.class,
+
+ LoginTimeoutTest.class,
+ TestACL.class,
+
+ ConnectTimeoutTest.class,
+
+ PGPropertyTest.class,
+
+ V3ParameterListTests.class,
+
+ CopyTest.class,
+ CopyLargeFileTest.class,
+ ServerErrorTest.class,
+ UpsertTest.class
+})
+public class Jdbc2TestSuite {
}
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/LoginTimeoutTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/LoginTimeoutTest.java
index c120245..56a3391 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/LoginTimeoutTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/LoginTimeoutTest.java
@@ -5,9 +5,13 @@
package org.postgresql.test.jdbc2;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
import org.postgresql.test.TestUtil;
-import junit.framework.TestCase;
+import org.junit.Before;
+import org.junit.Test;
import java.io.IOException;
import java.net.InetAddress;
@@ -19,15 +23,14 @@ import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;
-public class LoginTimeoutTest extends TestCase {
- public LoginTimeoutTest(String name) {
- super(name);
- }
+public class LoginTimeoutTest {
+ @Before
public void setUp() throws Exception {
TestUtil.initDriver(); // Set up log levels, etc.
}
+ @Test
public void testIntTimeout() throws Exception {
Properties props = new Properties();
props.setProperty("user", TestUtil.getUser());
@@ -38,6 +41,7 @@ public class LoginTimeoutTest extends TestCase {
conn.close();
}
+ @Test
public void testFloatTimeout() throws Exception {
Properties props = new Properties();
props.setProperty("user", TestUtil.getUser());
@@ -48,6 +52,7 @@ public class LoginTimeoutTest extends TestCase {
conn.close();
}
+ @Test
public void testZeroTimeout() throws Exception {
Properties props = new Properties();
props.setProperty("user", TestUtil.getUser());
@@ -58,6 +63,7 @@ public class LoginTimeoutTest extends TestCase {
conn.close();
}
+ @Test
public void testNegativeTimeout() throws Exception {
Properties props = new Properties();
props.setProperty("user", TestUtil.getUser());
@@ -68,6 +74,7 @@ public class LoginTimeoutTest extends TestCase {
conn.close();
}
+ @Test
public void testBadTimeout() throws Exception {
Properties props = new Properties();
props.setProperty("user", TestUtil.getUser());
@@ -98,6 +105,7 @@ public class LoginTimeoutTest extends TestCase {
return listenSocket.getLocalPort();
}
+ @Override
public void run() {
try {
Socket newSocket = listenSocket.accept();
@@ -123,6 +131,7 @@ public class LoginTimeoutTest extends TestCase {
}
+ @Test
public void testTimeoutOccurs() throws Exception {
// Spawn a helper thread to accept a connection and do nothing with it;
// this should trigger a timeout.
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/MiscTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/MiscTest.java
index b328091..990e1bf 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/MiscTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/MiscTest.java
@@ -5,9 +5,13 @@
package org.postgresql.test.jdbc2;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.fail;
+
import org.postgresql.test.TestUtil;
-import junit.framework.TestCase;
+import org.junit.Ignore;
+import org.junit.Test;
import java.io.ByteArrayOutputStream;
import java.io.ObjectOutputStream;
@@ -22,11 +26,7 @@ import java.sql.Statement;
* problems from re-occurring ;-)
*
*/
-public class MiscTest extends TestCase {
-
- public MiscTest(String name) {
- super(name);
- }
+public class MiscTest {
/*
* Some versions of the driver would return rs as a null?
@@ -35,6 +35,7 @@ public class MiscTest extends TestCase {
*
* Added Feb 13 2001
*/
+ @Test
public void testDatabaseSelectNullBug() throws Exception {
Connection con = TestUtil.openDB();
@@ -56,6 +57,7 @@ public class MiscTest extends TestCase {
* Ensure the cancel call does not return before it has completed. Previously it did which
* cancelled future queries.
*/
+ @Test
public void testSingleThreadCancel() throws Exception {
Connection con = TestUtil.openDB();
Statement stmt = con.createStatement();
@@ -67,6 +69,7 @@ public class MiscTest extends TestCase {
TestUtil.closeDB(con);
}
+ @Test
public void testError() throws Exception {
Connection con = TestUtil.openDB();
try {
@@ -89,6 +92,7 @@ public class MiscTest extends TestCase {
con.close();
}
+ @Test
public void testWarning() throws Exception {
Connection con = TestUtil.openDB();
Statement stmt = con.createStatement();
@@ -110,6 +114,8 @@ public class MiscTest extends TestCase {
con.close();
}
+ @Ignore
+ @Test
public void xtestLocking() throws Exception {
Connection con = TestUtil.openDB();
Connection con2 = TestUtil.openDB();
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/NotifyTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/NotifyTest.java
index 4ef067b..ded17f1 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/NotifyTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/NotifyTest.java
@@ -5,36 +5,43 @@
package org.postgresql.test.jdbc2;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+
import org.postgresql.PGNotification;
+import org.postgresql.core.ServerVersion;
import org.postgresql.test.TestUtil;
-import junit.framework.TestCase;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
-public class NotifyTest extends TestCase {
+public class NotifyTest {
private Connection conn;
- public NotifyTest(String name) {
- super(name);
- }
-
- protected void setUp() throws Exception {
+ @Before
+ public void setUp() throws Exception {
conn = TestUtil.openDB();
}
- protected void tearDown() throws SQLException {
+ @After
+ public void tearDown() throws SQLException {
TestUtil.closeDB(conn);
}
+ @Test(timeout = 60000)
public void testNotify() throws SQLException {
Statement stmt = conn.createStatement();
stmt.executeUpdate("LISTEN mynotification");
stmt.executeUpdate("NOTIFY mynotification");
- PGNotification notifications[] = ((org.postgresql.PGConnection) conn).getNotifications();
+ PGNotification[] notifications = ((org.postgresql.PGConnection) conn).getNotifications();
assertNotNull(notifications);
assertEquals(1, notifications.length);
assertEquals("mynotification", notifications[0].getName());
@@ -43,8 +50,9 @@ public class NotifyTest extends TestCase {
stmt.close();
}
+ @Test(timeout = 60000)
public void testNotifyArgument() throws Exception {
- if (!TestUtil.haveMinimumServerVersion(conn, "9.0") || TestUtil.isProtocolVersion(conn, 2)) {
+ if (!TestUtil.haveMinimumServerVersion(conn, ServerVersion.v9_0)) {
return;
}
@@ -52,7 +60,7 @@ public class NotifyTest extends TestCase {
stmt.executeUpdate("LISTEN mynotification");
stmt.executeUpdate("NOTIFY mynotification, 'message'");
- PGNotification notifications[] = ((org.postgresql.PGConnection) conn).getNotifications();
+ PGNotification[] notifications = ((org.postgresql.PGConnection) conn).getNotifications();
assertNotNull(notifications);
assertEquals(1, notifications.length);
assertEquals("mynotification", notifications[0].getName());
@@ -61,27 +69,26 @@ public class NotifyTest extends TestCase {
stmt.close();
}
+ @Test(timeout = 60000)
public void testAsyncNotify() throws Exception {
Statement stmt = conn.createStatement();
stmt.executeUpdate("LISTEN mynotification");
// Notify on a separate connection to get an async notify on the first.
- Connection conn2 = TestUtil.openDB();
- try {
- Statement stmt2 = conn2.createStatement();
- stmt2.executeUpdate("NOTIFY mynotification");
- stmt2.close();
- } finally {
- conn2.close();
- }
+ connectAndNotify("mynotification");
- // Wait a bit to let the notify come through..
+ // Wait a bit to let the notify come through... Changed this so the test takes ~2 seconds
+ // less to run and is still as effective.
+ PGNotification[] notifications = null;
try {
- Thread.sleep(2000);
+ int retries = 20;
+ while (retries-- > 0
+ && (notifications = ((org.postgresql.PGConnection) conn).getNotifications()) == null ) {
+ Thread.sleep(100);
+ }
} catch (InterruptedException ie) {
}
- PGNotification notifications[] = ((org.postgresql.PGConnection) conn).getNotifications();
assertNotNull(notifications);
assertEquals(1, notifications.length);
assertEquals("mynotification", notifications[0].getName());
@@ -89,4 +96,160 @@ public class NotifyTest extends TestCase {
stmt.close();
}
+
+ /**
+ * To test timeouts we have to send the notification from another thread, because we
+ * listener is blocking.
+ */
+ @Test(timeout = 60000)
+ public void testAsyncNotifyWithTimeout() throws Exception {
+ Statement stmt = conn.createStatement();
+ stmt.executeUpdate("LISTEN mynotification");
+
+ // Here we let the getNotifications() timeout.
+ long startMillis = System.currentTimeMillis();
+ PGNotification[] notifications = ((org.postgresql.PGConnection) conn).getNotifications(500);
+ long endMillis = System.currentTimeMillis();
+ long runtime = endMillis - startMillis;
+ assertNull("There have been notifications, althought none have been expected.",notifications);
+ Assert.assertTrue("We didn't wait long enough! runtime=" + runtime, runtime > 450);
+
+ stmt.close();
+ }
+
+ @Test(timeout = 60000)
+ public void testAsyncNotifyWithTimeoutAndMessagesAvailableWhenStartingListening() throws Exception {
+ Statement stmt = conn.createStatement();
+ stmt.executeUpdate("LISTEN mynotification");
+
+ // Now we check the case where notifications are already available while we are starting to
+ // listen for notifications
+ connectAndNotify("mynotification");
+
+ PGNotification[] notifications = ((org.postgresql.PGConnection) conn).getNotifications(10000);
+ assertNotNull(notifications);
+ assertEquals(1, notifications.length);
+ assertEquals("mynotification", notifications[0].getName());
+ assertEquals("", notifications[0].getParameter());
+
+ stmt.close();
+ }
+
+ @Test(timeout = 60000)
+ public void testAsyncNotifyWithEndlessTimeoutAndMessagesAvailableWhenStartingListening() throws Exception {
+ Statement stmt = conn.createStatement();
+ stmt.executeUpdate("LISTEN mynotification");
+
+ // Now we check the case where notifications are already available while we are waiting forever
+ connectAndNotify("mynotification");
+
+ PGNotification[] notifications = ((org.postgresql.PGConnection) conn).getNotifications(0);
+ assertNotNull(notifications);
+ assertEquals(1, notifications.length);
+ assertEquals("mynotification", notifications[0].getName());
+ assertEquals("", notifications[0].getParameter());
+
+ stmt.close();
+ }
+
+ @Test(timeout = 60000)
+ public void testAsyncNotifyWithTimeoutAndMessagesSendAfter() throws Exception {
+ Statement stmt = conn.createStatement();
+ stmt.executeUpdate("LISTEN mynotification");
+
+ // Now we check the case where notifications are send after we have started to listen for
+ // notifications
+ new Thread( new Runnable() {
+ public void run() {
+ try {
+ Thread.sleep(200);
+ } catch (InterruptedException ie) {
+ }
+ connectAndNotify("mynotification");
+ }
+ }).start();
+
+ PGNotification[] notifications = ((org.postgresql.PGConnection) conn).getNotifications(10000);
+ assertNotNull(notifications);
+ assertEquals(1, notifications.length);
+ assertEquals("mynotification", notifications[0].getName());
+ assertEquals("", notifications[0].getParameter());
+
+ stmt.close();
+ }
+
+ @Test(timeout = 60000)
+ public void testAsyncNotifyWithEndlessTimeoutAndMessagesSendAfter() throws Exception {
+ Statement stmt = conn.createStatement();
+ stmt.executeUpdate("LISTEN mynotification");
+
+ // Now we check the case where notifications are send after we have started to listen for
+ // notifications forever
+ new Thread( new Runnable() {
+ public void run() {
+ try {
+ Thread.sleep(200);
+ } catch (InterruptedException ie) {
+ }
+ connectAndNotify("mynotification");
+ }
+ }).start();
+
+ PGNotification[] notifications = ((org.postgresql.PGConnection) conn).getNotifications(0);
+ assertNotNull(notifications);
+ assertEquals(1, notifications.length);
+ assertEquals("mynotification", notifications[0].getName());
+ assertEquals("", notifications[0].getParameter());
+
+ stmt.close();
+ }
+
+ @Test(timeout = 60000)
+ public void testAsyncNotifyWithTimeoutAndSocketThatBecomesClosed() throws Exception {
+ Statement stmt = conn.createStatement();
+ stmt.executeUpdate("LISTEN mynotification");
+
+ // Here we check what happens when the connection gets closed from another thread. This
+ // should be able, and this test ensures that no synchronized statements will stop the
+ // connection from becoming closed.
+ new Thread( new Runnable() {
+ public void run() {
+ try {
+ Thread.sleep(500);
+ } catch (InterruptedException ie) {
+ }
+ try {
+ conn.close();
+ } catch (SQLException e) {
+ }
+ }
+ }).start();
+
+ try {
+ ((org.postgresql.PGConnection) conn).getNotifications(40000);
+ Assert.fail("The getNotifications(...) call didn't return when the socket closed.");
+ } catch (SQLException e) {
+ // We expected thta
+ }
+
+ stmt.close();
+ }
+
+ private static void connectAndNotify(String channel) {
+ Connection conn2 = null;
+ try {
+ conn2 = TestUtil.openDB();
+ Statement stmt2 = conn2.createStatement();
+ stmt2.executeUpdate("NOTIFY " + channel);
+ stmt2.close();
+ } catch (Exception e) {
+ throw new RuntimeException("Couldn't notify '" + channel + "'.",e);
+ } finally {
+ try {
+ conn2.close();
+ } catch (SQLException e) {
+ }
+ }
+ }
+
}
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/OID74Test.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/OID74Test.java
deleted file mode 100644
index fecc741..0000000
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/OID74Test.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright (c) 2004, PostgreSQL Global Development Group
- * See the LICENSE file in the project root for more information.
- */
-
-package org.postgresql.test.jdbc2;
-
-import org.postgresql.test.TestUtil;
-
-import junit.framework.TestCase;
-
-import java.io.ByteArrayInputStream;
-import java.io.InputStream;
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Types;
-import java.util.Properties;
-
-/**
- * User: alexei
- */
-public class OID74Test extends TestCase {
- private Connection conn;
-
- public OID74Test(String name) {
- super(name);
- }
-
- public void setUp() throws Exception {
- // set up conection here
- Properties props = new Properties();
- props.setProperty("compatible", "7.1");
- conn = TestUtil.openDB(props);
-
- TestUtil.createTable(conn, "temp", "col oid");
- conn.setAutoCommit(false);
- }
-
- public void tearDown() throws Exception {
- conn.setAutoCommit(true);
- TestUtil.dropTable(conn, "temp");
- TestUtil.closeDB(conn);
- }
-
- public void testSetNull() throws SQLException {
- PreparedStatement pstmt = conn.prepareStatement("INSERT INTO temp VALUES (?)");
- pstmt.setNull(1, Types.VARBINARY);
- pstmt.executeUpdate();
- pstmt.setNull(1, Types.BLOB);
- pstmt.executeUpdate();
- pstmt.setNull(1, Types.CLOB);
- pstmt.executeUpdate();
- pstmt.close();
- }
-
- public void testBinaryStream() throws Exception {
- PreparedStatement pstmt = conn.prepareStatement("INSERT INTO temp VALUES (?)");
- pstmt.setBinaryStream(1, new ByteArrayInputStream(new byte[]{1, 2, 3, 4, 5}), 5);
- assertTrue((pstmt.executeUpdate() == 1));
- pstmt.close();
-
- pstmt = conn.prepareStatement("SELECT col FROM temp LIMIT 1");
- ResultSet rs = pstmt.executeQuery();
-
- assertTrue("No results from query", rs.next());
-
- InputStream in = rs.getBinaryStream(1);
- int data;
- int i = 1;
- while ((data = in.read()) != -1) {
- assertEquals(i++, data);
- }
- rs.close();
- pstmt.close();
- }
-}
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/PGPropertyTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/PGPropertyTest.java
index 8bb4cb7..7d20eea 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/PGPropertyTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/PGPropertyTest.java
@@ -5,43 +5,72 @@
package org.postgresql.test.jdbc2;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
import org.postgresql.Driver;
import org.postgresql.PGProperty;
import org.postgresql.ds.PGSimpleDataSource;
import org.postgresql.ds.common.BaseDataSource;
import org.postgresql.test.TestUtil;
-import junit.framework.TestCase;
-import org.junit.Assert;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.net.URLEncoder;
import java.sql.DriverPropertyInfo;
+import java.util.ArrayList;
import java.util.Map;
import java.util.Properties;
import java.util.TreeMap;
-public class PGPropertyTest extends TestCase {
+public class PGPropertyTest {
+
+ /**
+ * Some tests modify the "ssl" system property. To not disturb other test cases in the suite store
+ * the value of the property and restore it.
+ */
+ private String bootSSLPropertyValue;
+
+ @Before
+ public void setUp() {
+ bootSSLPropertyValue = System.getProperty("ssl");
+ }
+
+ @After
+ public void tearDown() {
+ if (bootSSLPropertyValue == null) {
+ System.getProperties().remove("ssl");
+ } else {
+ System.setProperty("ssl", bootSSLPropertyValue);
+ }
+ }
/**
* Test that we can get and set all default values and all choices (if any)
*/
+ @Test
public void testGetSetAllProperties() {
Properties properties = new Properties();
for (PGProperty property : PGProperty.values()) {
String value = property.get(properties);
- Assert.assertEquals(property.getDefaultValue(), value);
+ assertEquals(property.getDefaultValue(), value);
property.set(properties, value);
- Assert.assertEquals(value, property.get(properties));
+ assertEquals(value, property.get(properties));
if (property.getChoices() != null && property.getChoices().length > 0) {
for (String choice : property.getChoices()) {
property.set(properties, choice);
- Assert.assertEquals(choice, property.get(properties));
+ assertEquals(choice, property.get(properties));
}
}
}
@@ -50,15 +79,17 @@ public class PGPropertyTest extends TestCase {
/**
* Test that the enum constant is common with the underlying property name
*/
+ @Test
public void testEnumConstantNaming() {
for (PGProperty property : PGProperty.values()) {
String enumName = property.name().replaceAll("_", "");
- Assert.assertEquals("Naming of the enum constant [" + property.name()
+ assertEquals("Naming of the enum constant [" + property.name()
+ "] should follow the naming of its underlying property [" + property.getName()
+ "] in PGProperty", property.getName().toLowerCase(), enumName.toLowerCase());
}
}
+ @Test
public void testDriverGetPropertyInfo() {
Driver driver = new Driver();
DriverPropertyInfo[] infos = driver.getPropertyInfo(
@@ -67,11 +98,11 @@ public class PGPropertyTest extends TestCase {
new Properties());
for (DriverPropertyInfo info : infos) {
if ("user".equals(info.name)) {
- Assert.assertEquals("fred", info.value);
+ assertEquals("fred", info.value);
} else if ("password".equals(info.name)) {
- Assert.assertEquals("secret", info.value);
+ assertEquals("secret", info.value);
} else if ("ssl".equals(info.name)) {
- Assert.assertEquals("true", info.value);
+ assertEquals("true", info.value);
}
}
}
@@ -79,6 +110,7 @@ public class PGPropertyTest extends TestCase {
/**
* Test if the datasource has getter and setter for all properties
*/
+ @Test
public void testDataSourceProperties() throws Exception {
PGSimpleDataSource dataSource = new PGSimpleDataSource();
BeanInfo info = Introspector.getBeanInfo(dataSource.getClass());
@@ -94,14 +126,14 @@ public class PGPropertyTest extends TestCase {
// known properties
for (PGProperty property : PGProperty.values()) {
if (!property.getName().startsWith("PG")) {
- Assert.assertTrue("Missing getter/setter for property [" + property.getName() + "] in ["
+ assertTrue("Missing getter/setter for property [" + property.getName() + "] in ["
+ BaseDataSource.class + "]", propertyDescriptors.containsKey(property.getName()));
- Assert.assertNotNull("Not getter for property [" + property.getName() + "] in ["
+ assertNotNull("Not getter for property [" + property.getName() + "] in ["
+ BaseDataSource.class + "]",
propertyDescriptors.get(property.getName()).getReadMethod());
- Assert.assertNotNull("Not setter for property [" + property.getName() + "] in ["
+ assertNotNull("Not setter for property [" + property.getName() + "] in ["
+ BaseDataSource.class + "]",
propertyDescriptors.get(property.getName()).getWriteMethod());
}
@@ -121,6 +153,7 @@ public class PGPropertyTest extends TestCase {
/**
* Test that {@link PGProperty#isPresent(Properties)} returns a correct result in all cases
*/
+ @Test
public void testIsPresentWithParseURLResult() throws Exception {
Properties givenProperties = new Properties();
givenProperties.setProperty("user", TestUtil.getUser());
@@ -130,40 +163,43 @@ public class PGPropertyTest extends TestCase {
sysProperties.remove("ssl");
System.setProperties(sysProperties);
Properties parsedProperties = Driver.parseURL(TestUtil.getURL(), givenProperties);
- Assert.assertFalse("SSL property should not be present",
+ assertFalse("SSL property should not be present",
PGProperty.SSL.isPresent(parsedProperties));
System.setProperty("ssl", "true");
givenProperties.setProperty("ssl", "true");
parsedProperties = Driver.parseURL(TestUtil.getURL(), givenProperties);
- Assert.assertTrue("SSL property should be present", PGProperty.SSL.isPresent(parsedProperties));
+ assertTrue("SSL property should be present", PGProperty.SSL.isPresent(parsedProperties));
givenProperties.setProperty("ssl", "anotherValue");
parsedProperties = Driver.parseURL(TestUtil.getURL(), givenProperties);
- Assert.assertTrue("SSL property should be present", PGProperty.SSL.isPresent(parsedProperties));
+ assertTrue("SSL property should be present", PGProperty.SSL.isPresent(parsedProperties));
parsedProperties = Driver.parseURL(TestUtil.getURL() + "&ssl=true", null);
- Assert.assertTrue("SSL property should be present", PGProperty.SSL.isPresent(parsedProperties));
+ assertTrue("SSL property should be present", PGProperty.SSL.isPresent(parsedProperties));
}
/**
* Check whether the isPresent method really works.
*/
+ @Test
public void testPresenceCheck() {
Properties empty = new Properties();
- Object value = PGProperty.LOG_LEVEL.get(empty);
+ Object value = PGProperty.READ_ONLY.get(empty);
assertNotNull(value);
- Assert.assertFalse(PGProperty.LOG_LEVEL.isPresent(empty));
+ assertFalse(PGProperty.READ_ONLY.isPresent(empty));
}
+ @Test
public void testNullValue() {
Properties empty = new Properties();
- assertNull(PGProperty.LOG_LEVEL.getSetString(empty));
+ assertNull(PGProperty.LOGGER_LEVEL.getSetString(empty));
Properties withLogging = new Properties();
- withLogging.setProperty(PGProperty.LOG_LEVEL.getName(), "2");
- assertNotNull(PGProperty.LOG_LEVEL.getSetString(withLogging));
+ withLogging.setProperty(PGProperty.LOGGER_LEVEL.getName(), "OFF");
+ assertNotNull(PGProperty.LOGGER_LEVEL.getSetString(withLogging));
}
+ @Test
public void testEncodedUrlValues() {
String databaseName = "d&a%ta+base";
String userName = "&u%ser";
@@ -179,21 +215,46 @@ public class PGPropertyTest extends TestCase {
assertEquals("password", password, PGProperty.PASSWORD.get(parsed));
}
- public void setUp() {
- bootSSLPropertyValue = System.getProperty("ssl");
- }
+ @Test
+ public void testLowerCamelCase() {
+ // These are legacy properties excluded for backward compatibility.
+ ArrayList<String> excluded = new ArrayList<String>();
+ excluded.add("LOG_LEVEL"); // Remove with PR #722
+ excluded.add("PREPARED_STATEMENT_CACHE_SIZE_MIB"); // preparedStatementCacheSizeMi[B]
+ excluded.add("DATABASE_METADATA_CACHE_FIELDS_MIB"); // databaseMetadataCacheFieldsMi[B]
+ excluded.add("STRING_TYPE"); // string[t]ype
+ excluded.add("SSL_MODE"); // ssl[m]ode
+ excluded.add("SSL_FACTORY"); // ssl[f]actory
+ excluded.add("SSL_FACTORY_ARG"); // ssl[f]actory[a]rg
+ excluded.add("SSL_HOSTNAME_VERIFIER"); // ssl[h]ostname[v]erifier
+ excluded.add("SSL_CERT"); // ssl[c]ert
+ excluded.add("SSL_KEY"); // ssl[k]ey
+ excluded.add("SSL_ROOT_CERT"); // ssl[r]oot[c]ert
+ excluded.add("SSL_PASSWORD"); // ssl[p]assword
+ excluded.add("SSL_PASSWORD_CALLBACK"); // ssl[p]assword[c]allback
+ excluded.add("APPLICATION_NAME"); // [A]pplicationName
+ excluded.add("GSS_LIB"); // gss[l]ib
+ excluded.add("REWRITE_BATCHED_INSERTS"); // re[W]riteBatchedInserts
- public void tearDown() {
- if (bootSSLPropertyValue == null) {
- System.getProperties().remove("ssl");
- } else {
- System.setProperty("ssl", bootSSLPropertyValue);
+ for (PGProperty property : PGProperty.values()) {
+ if (!property.name().startsWith("PG")) { // Ignore all properties that start with PG
+ String[] words = property.name().split("_");
+ if (words.length == 1) {
+ assertEquals(words[0].toLowerCase(), property.getName());
+ } else {
+ if (!excluded.contains(property.name())) {
+ String word = "";
+ for (int i = 0; i < words.length; i++) {
+ if (i == 0) {
+ word = words[i].toLowerCase();
+ } else {
+ word += words[i].substring(0, 1).toUpperCase() + words[i].substring(1).toLowerCase();
+ }
+ }
+ assertEquals(word, property.getName());
+ }
+ }
+ }
}
}
-
- /**
- * Some tests modify the "ssl" system property. To not disturb other test cases in the suite store
- * the value of the property and restore it.
- */
- private String bootSSLPropertyValue;
}
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/PGTimeTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/PGTimeTest.java
index d0ea5cd..3463f21 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/PGTimeTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/PGTimeTest.java
@@ -8,6 +8,7 @@ package org.postgresql.test.jdbc2;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
+import static org.junit.Assume.assumeTrue;
import org.postgresql.test.TestUtil;
import org.postgresql.util.PGInterval;
@@ -54,8 +55,10 @@ public class PGTimeTest extends BaseTest4 {
*/
@Test
public void testTimeWithInterval() throws SQLException {
+ assumeTrue(TestUtil.haveIntegerDateTimes(con));
+
Calendar cal = Calendar.getInstance();
- cal.set(1970, 0, 1);
+ cal.set(1970, Calendar.JANUARY, 1);
final long now = cal.getTimeInMillis();
verifyTimeWithInterval(new PGTime(now), new PGInterval(0, 0, 0, 1, 2, 3.14), true);
@@ -133,7 +136,7 @@ public class PGTimeTest extends BaseTest4 {
@Test
public void testTimeInsertAndSelect() throws SQLException {
Calendar cal = Calendar.getInstance();
- cal.set(1970, 0, 1);
+ cal.set(1970, Calendar.JANUARY, 1);
final long now = cal.getTimeInMillis();
verifyInsertAndSelect(new PGTime(now), true);
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/PGTimestampTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/PGTimestampTest.java
index 4d680f4..286eefb 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/PGTimestampTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/PGTimestampTest.java
@@ -5,11 +5,18 @@
package org.postgresql.test.jdbc2;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assume.assumeTrue;
+
import org.postgresql.test.TestUtil;
import org.postgresql.util.PGInterval;
import org.postgresql.util.PGTimestamp;
-import junit.framework.TestCase;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
import java.sql.Connection;
import java.sql.PreparedStatement;
@@ -23,29 +30,24 @@ import java.util.TimeZone;
/**
* Tests {@link PGTimestamp} in various scenarios including setTimestamp, setObject for both
- * <code>timestamp with time zone</code> and <code>timestamp without time zone</code> data types.
+ * {@code timestamp with time zone} and {@code timestamp without time zone} data types.
*/
-public class PGTimestampTest extends TestCase {
+public class PGTimestampTest {
/**
* The name of the test table.
*/
private static final String TEST_TABLE = "testtimestamp";
- /**
- * The database connection.
- */
private Connection con;
- public PGTimestampTest(final String name) {
- super(name);
- }
-
- protected void setUp() throws Exception {
+ @Before
+ public void setUp() throws Exception {
con = TestUtil.openDB();
TestUtil.createTable(con, TEST_TABLE, "ts timestamp, tz timestamp with time zone");
}
- protected void tearDown() throws Exception {
+ @After
+ public void tearDown() throws Exception {
TestUtil.dropTable(con, TEST_TABLE);
TestUtil.closeDB(con);
}
@@ -55,7 +57,9 @@ public class PGTimestampTest extends TestCase {
*
* @throws SQLException if a JDBC or database problem occurs.
*/
+ @Test
public void testTimestampWithInterval() throws SQLException {
+ assumeTrue(TestUtil.haveIntegerDateTimes(con));
PGTimestamp timestamp = new PGTimestamp(System.currentTimeMillis());
PGInterval interval = new PGInterval(0, 0, 0, 1, 2, 3.14);
verifyTimestampWithInterval(timestamp, interval, true);
@@ -124,11 +128,12 @@ public class PGTimestampTest extends TestCase {
}
/**
- * Tests inserting and selecting <code>PGTimestamp</code> objects with <code>timestamp</code> and
- * <code>timestamp with time zone</code> columns.
+ * Tests inserting and selecting {@code PGTimestamp} objects with {@code timestamp} and
+ * {@code timestamp with time zone} columns.
*
* @throws SQLException if a JDBC or database problem occurs.
*/
+ @Test
public void testTimeInsertAndSelect() throws SQLException {
final long now = System.currentTimeMillis();
verifyInsertAndSelect(new PGTimestamp(now), true);
@@ -146,11 +151,11 @@ public class PGTimestampTest extends TestCase {
}
/**
- * Verifies that inserting the given <code>PGTimestamp</code> as a timestamp string and an object
+ * Verifies that inserting the given {@code PGTimestamp} as a timestamp string and an object
* produces the same results.
*
* @param timestamp the timestamp to test.
- * @param useSetObject <code>true</code> if the setObject method should be used instead of
+ * @param useSetObject {@code true} if the setObject method should be used instead of
* setTimestamp.
* @throws SQLException if a JDBC or database problem occurs.
*/
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/PreparedStatementTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/PreparedStatementTest.java
index b3b38d3..15cf6ce 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/PreparedStatementTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/PreparedStatementTest.java
@@ -11,10 +11,14 @@ import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
+import org.postgresql.PGStatement;
+import org.postgresql.jdbc.PgStatement;
import org.postgresql.jdbc.PreferQueryMode;
import org.postgresql.test.TestUtil;
import org.postgresql.test.util.BrokenInputStream;
+import org.junit.Assert;
+import org.junit.Assume;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
@@ -25,14 +29,22 @@ import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.math.BigDecimal;
+import java.math.BigInteger;
import java.math.RoundingMode;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
+import java.sql.Timestamp;
import java.sql.Types;
import java.util.ArrayList;
import java.util.Collection;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicLong;
+import java.util.logging.Handler;
+import java.util.logging.Level;
+import java.util.logging.LogRecord;
+import java.util.logging.Logger;
@RunWith(Parameterized.class)
@@ -58,6 +70,9 @@ public class PreparedStatementTest extends BaseTest4 {
TestUtil.createTable(con, "texttable", "ch char(3), te text, vc varchar(3)");
TestUtil.createTable(con, "intervaltable", "i interval");
TestUtil.createTable(con, "inttable", "a int");
+ TestUtil.createTable(con, "bool_tab", "bool_val boolean, null_val boolean, tf_val boolean, "
+ + "truefalse_val boolean, yn_val boolean, yesno_val boolean, "
+ + "onoff_val boolean, onezero_val boolean");
}
@Override
@@ -66,14 +81,32 @@ public class PreparedStatementTest extends BaseTest4 {
TestUtil.dropTable(con, "texttable");
TestUtil.dropTable(con, "intervaltable");
TestUtil.dropTable(con, "inttable");
+ TestUtil.dropTable(con, "bool_tab");
super.tearDown();
}
+ private int getNumberOfServerPreparedStatements(String sql)
+ throws SQLException {
+ PreparedStatement pstmt = null;
+ ResultSet rs = null;
+ try {
+ pstmt = con.prepareStatement(
+ "select count(*) from pg_prepared_statements where statement = ?");
+ pstmt.setString(1, sql);
+ rs = pstmt.executeQuery();
+ rs.next();
+ return rs.getInt(1);
+ } finally {
+ TestUtil.closeQuietly(rs);
+ TestUtil.closeQuietly(pstmt);
+ }
+ }
+
@Test
public void testSetBinaryStream() throws SQLException {
assumeByteaSupported();
ByteArrayInputStream bais;
- byte buf[] = new byte[10];
+ byte[] buf = new byte[10];
for (int i = 0; i < buf.length; i++) {
buf[i] = (byte) i;
}
@@ -135,16 +168,7 @@ public class PreparedStatementTest extends BaseTest4 {
@Test
public void testBinaryStreamErrorsRestartable() throws SQLException {
- // The V2 protocol does not have the ability to recover when
- // streaming data to the server. We could potentially try
- // introducing a syntax error to force the query to fail, but
- // that seems dangerous.
- //
- if (!TestUtil.isProtocolVersion(con, 3)) {
- return;
- }
-
- byte buf[] = new byte[10];
+ byte[] buf = new byte[10];
for (int i = 0; i < buf.length; i++) {
buf[i] = (byte) i;
}
@@ -266,83 +290,69 @@ public class PreparedStatementTest extends BaseTest4 {
@Test
public void testSingleQuotes() throws SQLException {
String[] testStrings = new String[]{
- "bare ? question mark",
- "quoted \\' single quote",
- "doubled '' single quote",
- "octal \\060 constant",
- "escaped \\? question mark",
- "double \\\\ backslash",
- "double \" quote",
- };
+ "bare ? question mark",
+ "quoted \\' single quote",
+ "doubled '' single quote",
+ "octal \\060 constant",
+ "escaped \\? question mark",
+ "double \\\\ backslash",
+ "double \" quote",};
String[] testStringsStdConf = new String[]{
- "bare ? question mark",
- "quoted '' single quote",
- "doubled '' single quote",
- "octal 0 constant",
- "escaped ? question mark",
- "double \\ backslash",
- "double \" quote",
- };
+ "bare ? question mark",
+ "quoted '' single quote",
+ "doubled '' single quote",
+ "octal 0 constant",
+ "escaped ? question mark",
+ "double \\ backslash",
+ "double \" quote",};
String[] expected = new String[]{
- "bare ? question mark",
- "quoted ' single quote",
- "doubled ' single quote",
- "octal 0 constant",
- "escaped ? question mark",
- "double \\ backslash",
- "double \" quote",
- };
-
- if (!TestUtil.haveMinimumServerVersion(con, "8.2")) {
- for (int i = 0; i < testStrings.length; ++i) {
- PreparedStatement pstmt = con.prepareStatement("SELECT '" + testStrings[i] + "'");
- ResultSet rs = pstmt.executeQuery();
- assertTrue(rs.next());
- assertEquals(expected[i], rs.getString(1));
- rs.close();
- pstmt.close();
- }
- } else {
- boolean oldStdStrings = TestUtil.getStandardConformingStrings(con);
- Statement stmt = con.createStatement();
-
- // Test with standard_conforming_strings turned off.
- stmt.execute("SET standard_conforming_strings TO off");
- for (int i = 0; i < testStrings.length; ++i) {
- PreparedStatement pstmt = con.prepareStatement("SELECT '" + testStrings[i] + "'");
- ResultSet rs = pstmt.executeQuery();
- assertTrue(rs.next());
- assertEquals(expected[i], rs.getString(1));
- rs.close();
- pstmt.close();
- }
-
- // Test with standard_conforming_strings turned off...
- // ... using the escape string syntax (E'').
- stmt.execute("SET standard_conforming_strings TO on");
- for (int i = 0; i < testStrings.length; ++i) {
- PreparedStatement pstmt = con.prepareStatement("SELECT E'" + testStrings[i] + "'");
- ResultSet rs = pstmt.executeQuery();
- assertTrue(rs.next());
- assertEquals(expected[i], rs.getString(1));
- rs.close();
- pstmt.close();
- }
- // ... using standard conforming input strings.
- for (int i = 0; i < testStrings.length; ++i) {
- PreparedStatement pstmt = con.prepareStatement("SELECT '" + testStringsStdConf[i] + "'");
- ResultSet rs = pstmt.executeQuery();
- assertTrue(rs.next());
- assertEquals(expected[i], rs.getString(1));
- rs.close();
- pstmt.close();
- }
+ "bare ? question mark",
+ "quoted ' single quote",
+ "doubled ' single quote",
+ "octal 0 constant",
+ "escaped ? question mark",
+ "double \\ backslash",
+ "double \" quote",};
+
+ boolean oldStdStrings = TestUtil.getStandardConformingStrings(con);
+ Statement stmt = con.createStatement();
+
+ // Test with standard_conforming_strings turned off.
+ stmt.execute("SET standard_conforming_strings TO off");
+ for (int i = 0; i < testStrings.length; ++i) {
+ PreparedStatement pstmt = con.prepareStatement("SELECT '" + testStrings[i] + "'");
+ ResultSet rs = pstmt.executeQuery();
+ assertTrue(rs.next());
+ assertEquals(expected[i], rs.getString(1));
+ rs.close();
+ pstmt.close();
+ }
- stmt.execute("SET standard_conforming_strings TO " + (oldStdStrings ? "on" : "off"));
- stmt.close();
+ // Test with standard_conforming_strings turned off...
+ // ... using the escape string syntax (E'').
+ stmt.execute("SET standard_conforming_strings TO on");
+ for (int i = 0; i < testStrings.length; ++i) {
+ PreparedStatement pstmt = con.prepareStatement("SELECT E'" + testStrings[i] + "'");
+ ResultSet rs = pstmt.executeQuery();
+ assertTrue(rs.next());
+ assertEquals(expected[i], rs.getString(1));
+ rs.close();
+ pstmt.close();
}
+ // ... using standard conforming input strings.
+ for (int i = 0; i < testStrings.length; ++i) {
+ PreparedStatement pstmt = con.prepareStatement("SELECT '" + testStringsStdConf[i] + "'");
+ ResultSet rs = pstmt.executeQuery();
+ assertTrue(rs.next());
+ assertEquals(expected[i], rs.getString(1));
+ rs.close();
+ pstmt.close();
+ }
+
+ stmt.execute("SET standard_conforming_strings TO " + (oldStdStrings ? "on" : "off"));
+ stmt.close();
}
@Test
@@ -370,10 +380,6 @@ public class PreparedStatementTest extends BaseTest4 {
@Test
public void testDollarQuotes() throws SQLException {
// dollar-quotes are supported in the backend since version 8.0
- if (!TestUtil.haveMinimumServerVersion(con, "8.0")) {
- return;
- }
-
PreparedStatement st;
ResultSet rs;
@@ -416,10 +422,6 @@ public class PreparedStatementTest extends BaseTest4 {
@Test
public void testDollarQuotesAndIdentifiers() throws SQLException {
// dollar-quotes are supported in the backend since version 8.0
- if (!TestUtil.haveMinimumServerVersion(con, "8.0")) {
- return;
- }
-
PreparedStatement st;
con.createStatement().execute("CREATE TEMP TABLE a$b$c(a varchar, b varchar)");
@@ -533,29 +535,177 @@ public class PreparedStatementTest extends BaseTest4 {
@Test
public void testBoolean() throws SQLException {
- PreparedStatement pstmt = con.prepareStatement(
- "CREATE TEMP TABLE bool_tab (max_val boolean, min_val boolean, null_val boolean)");
- pstmt.executeUpdate();
- pstmt.close();
+ testBoolean(0);
+ testBoolean(1);
+ testBoolean(5);
+ testBoolean(-1);
+ }
- pstmt = con.prepareStatement("insert into bool_tab values (?,?,?)");
+ public void testBoolean(int prepareThreshold) throws SQLException {
+ PreparedStatement pstmt = con.prepareStatement("insert into bool_tab values (?,?,?,?,?,?,?,?)");
+ ((org.postgresql.PGStatement) pstmt).setPrepareThreshold(prepareThreshold);
+
+ // Test TRUE values
pstmt.setBoolean(1, true);
- pstmt.setBoolean(2, false);
- pstmt.setNull(3, Types.BIT);
- pstmt.executeUpdate();
+ pstmt.setObject(1, Boolean.TRUE);
+ pstmt.setNull(2, Types.BIT);
+ pstmt.setObject(3, 't', Types.BIT);
+ pstmt.setObject(3, 'T', Types.BIT);
+ pstmt.setObject(3, "t", Types.BIT);
+ pstmt.setObject(4, "true", Types.BIT);
+ pstmt.setObject(5, 'y', Types.BIT);
+ pstmt.setObject(5, 'Y', Types.BIT);
+ pstmt.setObject(5, "Y", Types.BIT);
+ pstmt.setObject(6, "YES", Types.BIT);
+ pstmt.setObject(7, "On", Types.BIT);
+ pstmt.setObject(8, '1', Types.BIT);
+ pstmt.setObject(8, "1", Types.BIT);
+ assertEquals("one row inserted, true values", 1, pstmt.executeUpdate());
+ // Test FALSE values
+ pstmt.setBoolean(1, false);
+ pstmt.setObject(1, Boolean.FALSE);
+ pstmt.setNull(2, Types.BOOLEAN);
+ pstmt.setObject(3, 'f', Types.BOOLEAN);
+ pstmt.setObject(3, 'F', Types.BOOLEAN);
+ pstmt.setObject(3, "F", Types.BOOLEAN);
+ pstmt.setObject(4, "false", Types.BOOLEAN);
+ pstmt.setObject(5, 'n', Types.BOOLEAN);
+ pstmt.setObject(5, 'N', Types.BOOLEAN);
+ pstmt.setObject(5, "N", Types.BOOLEAN);
+ pstmt.setObject(6, "NO", Types.BOOLEAN);
+ pstmt.setObject(7, "Off", Types.BOOLEAN);
+ pstmt.setObject(8, "0", Types.BOOLEAN);
+ pstmt.setObject(8, '0', Types.BOOLEAN);
+ assertEquals("one row inserted, false values", 1, pstmt.executeUpdate());
+ // Test weird values
+ pstmt.setObject(1, (byte) 0, Types.BOOLEAN);
+ pstmt.setObject(2, BigDecimal.ONE, Types.BOOLEAN);
+ pstmt.setObject(3, 0L, Types.BOOLEAN);
+ pstmt.setObject(4, 0x1, Types.BOOLEAN);
+ pstmt.setObject(5, new Float(0), Types.BOOLEAN);
+ pstmt.setObject(5, 1.0d, Types.BOOLEAN);
+ pstmt.setObject(5, 0.0f, Types.BOOLEAN);
+ pstmt.setObject(6, Integer.valueOf("1"), Types.BOOLEAN);
+ pstmt.setObject(7, new java.math.BigInteger("0"), Types.BOOLEAN);
+ pstmt.clearParameters();
pstmt.close();
pstmt = con.prepareStatement("select * from bool_tab");
+ ((org.postgresql.PGStatement) pstmt).setPrepareThreshold(prepareThreshold);
ResultSet rs = pstmt.executeQuery();
+
assertTrue(rs.next());
+ assertTrue("expected true, received " + rs.getBoolean(1), rs.getBoolean(1));
+ rs.getFloat(2);
+ assertTrue(rs.wasNull());
+ assertTrue("expected true, received " + rs.getBoolean(3), rs.getBoolean(3));
+ assertTrue("expected true, received " + rs.getBoolean(4), rs.getBoolean(4));
+ assertTrue("expected true, received " + rs.getBoolean(5), rs.getBoolean(5));
+ assertTrue("expected true, received " + rs.getBoolean(6), rs.getBoolean(6));
+ assertTrue("expected true, received " + rs.getBoolean(7), rs.getBoolean(7));
+ assertTrue("expected true, received " + rs.getBoolean(8), rs.getBoolean(8));
- assertTrue("expected true,received " + rs.getBoolean(1), rs.getBoolean(1));
- assertFalse("expected false,received " + rs.getBoolean(2), rs.getBoolean(2));
- rs.getFloat(3);
+ assertTrue(rs.next());
+ assertFalse("expected false, received " + rs.getBoolean(1), rs.getBoolean(1));
+ rs.getBoolean(2);
assertTrue(rs.wasNull());
+ assertFalse("expected false, received " + rs.getBoolean(3), rs.getBoolean(3));
+ assertFalse("expected false, received " + rs.getBoolean(4), rs.getBoolean(4));
+ assertFalse("expected false, received " + rs.getBoolean(5), rs.getBoolean(5));
+ assertFalse("expected false, received " + rs.getBoolean(6), rs.getBoolean(6));
+ assertFalse("expected false, received " + rs.getBoolean(7), rs.getBoolean(7));
+ assertFalse("expected false, received " + rs.getBoolean(8), rs.getBoolean(8));
+
rs.close();
pstmt.close();
+ pstmt = con.prepareStatement("TRUNCATE TABLE bool_tab");
+ pstmt.executeUpdate();
+ pstmt.close();
+ }
+
+ @Test
+ public void testBadBoolean() throws SQLException {
+ PreparedStatement pstmt = con.prepareStatement("INSERT INTO bad_bool VALUES (?)");
+ try {
+ pstmt.setObject(1, "this is not boolean", Types.BOOLEAN);
+ fail();
+ } catch (SQLException e) {
+ assertEquals(org.postgresql.util.PSQLState.CANNOT_COERCE.getState(), e.getSQLState());
+ assertEquals("Cannot cast to boolean: \"this is not boolean\"", e.getMessage());
+ }
+ try {
+ pstmt.setObject(1, 'X', Types.BOOLEAN);
+ fail();
+ } catch (SQLException e) {
+ assertEquals(org.postgresql.util.PSQLState.CANNOT_COERCE.getState(), e.getSQLState());
+ assertEquals("Cannot cast to boolean: \"X\"", e.getMessage());
+ }
+ try {
+ java.io.File obj = new java.io.File("");
+ pstmt.setObject(1, obj, Types.BOOLEAN);
+ fail();
+ } catch (SQLException e) {
+ assertEquals(org.postgresql.util.PSQLState.CANNOT_COERCE.getState(), e.getSQLState());
+ assertEquals("Cannot cast to boolean", e.getMessage());
+ }
+ try {
+ pstmt.setObject(1, "1.0", Types.BOOLEAN);
+ fail();
+ } catch (SQLException e) {
+ assertEquals(org.postgresql.util.PSQLState.CANNOT_COERCE.getState(), e.getSQLState());
+ assertEquals("Cannot cast to boolean: \"1.0\"", e.getMessage());
+ }
+ try {
+ pstmt.setObject(1, "-1", Types.BOOLEAN);
+ fail();
+ } catch (SQLException e) {
+ assertEquals(org.postgresql.util.PSQLState.CANNOT_COERCE.getState(), e.getSQLState());
+ assertEquals("Cannot cast to boolean: \"-1\"", e.getMessage());
+ }
+ try {
+ pstmt.setObject(1, "ok", Types.BOOLEAN);
+ fail();
+ } catch (SQLException e) {
+ assertEquals(org.postgresql.util.PSQLState.CANNOT_COERCE.getState(), e.getSQLState());
+ assertEquals("Cannot cast to boolean: \"ok\"", e.getMessage());
+ }
+ try {
+ pstmt.setObject(1, 0.99f, Types.BOOLEAN);
+ fail();
+ } catch (SQLException e) {
+ assertEquals(org.postgresql.util.PSQLState.CANNOT_COERCE.getState(), e.getSQLState());
+ assertEquals("Cannot cast to boolean: \"0.99\"", e.getMessage());
+ }
+ try {
+ pstmt.setObject(1, -0.01d, Types.BOOLEAN);
+ fail();
+ } catch (SQLException e) {
+ assertEquals(org.postgresql.util.PSQLState.CANNOT_COERCE.getState(), e.getSQLState());
+ assertEquals("Cannot cast to boolean: \"-0.01\"", e.getMessage());
+ }
+ try {
+ pstmt.setObject(1, new java.sql.Date(0), Types.BOOLEAN);
+ fail();
+ } catch (SQLException e) {
+ assertEquals(org.postgresql.util.PSQLState.CANNOT_COERCE.getState(), e.getSQLState());
+ assertEquals("Cannot cast to boolean", e.getMessage());
+ }
+ try {
+ pstmt.setObject(1, new java.math.BigInteger("1000"), Types.BOOLEAN);
+ fail();
+ } catch (SQLException e) {
+ assertEquals(org.postgresql.util.PSQLState.CANNOT_COERCE.getState(), e.getSQLState());
+ assertEquals("Cannot cast to boolean: \"1000\"", e.getMessage());
+ }
+ try {
+ pstmt.setObject(1, Math.PI, Types.BOOLEAN);
+ fail();
+ } catch (SQLException e) {
+ assertEquals(org.postgresql.util.PSQLState.CANNOT_COERCE.getState(), e.getSQLState());
+ assertEquals("Cannot cast to boolean: \"3.141592653589793\"", e.getMessage());
+ }
+ pstmt.close();
}
@Test
@@ -610,18 +760,27 @@ public class PreparedStatementTest extends BaseTest4 {
pstmt.setObject(2, minStringFloat, Types.FLOAT);
pstmt.setNull(3, Types.FLOAT);
pstmt.executeUpdate();
+ pstmt.setObject(1, "1.0", Types.FLOAT);
+ pstmt.setObject(2, "0.0", Types.FLOAT);
+ pstmt.setNull(3, Types.FLOAT);
+ pstmt.executeUpdate();
pstmt.close();
pstmt = con.prepareStatement("select * from float_tab");
ResultSet rs = pstmt.executeQuery();
assertTrue(rs.next());
- assertTrue("expected true,received " + rs.getObject(1),
- ((Double) rs.getObject(1)).equals(maxFloat));
- assertTrue("expected false,received " + rs.getBoolean(2),
- ((Double) rs.getObject(2)).equals(minFloat));
+ assertTrue(((Double) rs.getObject(1)).equals(maxFloat));
+ assertTrue(((Double) rs.getObject(2)).equals(minFloat));
+ assertTrue(rs.getDouble(1) == maxFloat);
+ assertTrue(rs.getDouble(2) == minFloat);
rs.getFloat(3);
assertTrue(rs.wasNull());
+
+ assertTrue(rs.next());
+ assertTrue("expected true, received " + rs.getBoolean(1), rs.getBoolean(1));
+ assertFalse("expected false,received " + rs.getBoolean(2), rs.getBoolean(2));
+
rs.close();
pstmt.close();
@@ -963,18 +1122,76 @@ public class PreparedStatementTest extends BaseTest4 {
}
@Test
+ public void testSetObjectWithBigDecimal() throws SQLException {
+ TestUtil.createTempTable(con, "number_fallback",
+ "n1 numeric");
+ PreparedStatement psinsert = con.prepareStatement("insert into number_fallback values(?)");
+ PreparedStatement psselect = con.prepareStatement("select n1 from number_fallback");
+
+ psinsert.setObject(1, new BigDecimal("733"));
+ psinsert.execute();
+
+ ResultSet rs = psselect.executeQuery();
+ assertTrue(rs.next());
+ assertTrue(
+ "expected 733, but received " + rs.getBigDecimal(1),
+ new BigDecimal("733").compareTo(rs.getBigDecimal(1)) == 0);
+
+ psinsert.close();
+ psselect.close();
+ }
+
+ @Test
+ public void testSetObjectNumberFallbackWithBigInteger() throws SQLException {
+ TestUtil.createTempTable(con, "number_fallback",
+ "n1 numeric");
+ PreparedStatement psinsert = con.prepareStatement("insert into number_fallback values(?)");
+ PreparedStatement psselect = con.prepareStatement("select n1 from number_fallback");
+
+ psinsert.setObject(1, new BigInteger("733"));
+ psinsert.execute();
+
+ ResultSet rs = psselect.executeQuery();
+ assertTrue(rs.next());
+ assertTrue(
+ "expected 733, but received " + rs.getBigDecimal(1),
+ new BigDecimal("733").compareTo(rs.getBigDecimal(1)) == 0);
+
+ psinsert.close();
+ psselect.close();
+ }
+
+ @Test
+ public void testSetObjectNumberFallbackWithAtomicLong() throws SQLException {
+ TestUtil.createTempTable(con, "number_fallback",
+ "n1 numeric");
+ PreparedStatement psinsert = con.prepareStatement("insert into number_fallback values(?)");
+ PreparedStatement psselect = con.prepareStatement("select n1 from number_fallback");
+
+ psinsert.setObject(1, new AtomicLong(733));
+ psinsert.execute();
+
+ ResultSet rs = psselect.executeQuery();
+ assertTrue(rs.next());
+ assertTrue(
+ "expected 733, but received " + rs.getBigDecimal(1),
+ new BigDecimal("733").compareTo(rs.getBigDecimal(1)) == 0);
+
+ psinsert.close();
+ psselect.close();
+ }
+
+ @Test
public void testUnknownSetObject() throws SQLException {
PreparedStatement pstmt = con.prepareStatement("INSERT INTO intervaltable(i) VALUES (?)");
- if (TestUtil.isProtocolVersion(con, 3)) {
- pstmt.setString(1, "1 week");
- try {
- pstmt.executeUpdate();
- assertTrue("When using extended protocol, interval vs character varying type mismatch error is expected",
- preferQueryMode == PreferQueryMode.SIMPLE);
- } catch (SQLException sqle) {
- // ERROR: column "i" is of type interval but expression is of type character varying
- }
+ pstmt.setString(1, "1 week");
+ try {
+ pstmt.executeUpdate();
+ assertTrue("When using extended protocol, interval vs character varying type mismatch error is expected",
+ preferQueryMode == PreferQueryMode.SIMPLE);
+ } catch (SQLException sqle) {
+ // ERROR: column "i" is of type interval but expression is of type character varying
}
pstmt.setObject(1, "1 week", Types.OTHER);
@@ -1011,4 +1228,202 @@ public class PreparedStatementTest extends BaseTest4 {
pstmt.close();
}
+ @Test
+ public void testBatchWithPrepareThreshold5() throws SQLException {
+ assumeBinaryModeRegular();
+ Assume.assumeTrue("simple protocol only does not support prepared statement requests",
+ preferQueryMode != PreferQueryMode.SIMPLE);
+
+ PreparedStatement pstmt = con.prepareStatement("CREATE temp TABLE batch_tab_threshold5 (id bigint, val bigint)");
+ pstmt.executeUpdate();
+ pstmt.close();
+
+ // When using a prepareThreshold of 5, a batch update should use server-side prepare
+ pstmt = con.prepareStatement("INSERT INTO batch_tab_threshold5 (id, val) VALUES (?,?)");
+ ((PgStatement) pstmt).setPrepareThreshold(5);
+ for (int p = 0; p < 5; p++) {
+ for (int i = 0; i <= 5; i++) {
+ pstmt.setLong(1, i);
+ pstmt.setLong(2, i);
+ pstmt.addBatch();
+ }
+ pstmt.executeBatch();
+ }
+ pstmt.close();
+ assertTrue("prepareThreshold=5, so the statement should be server-prepared",
+ ((PGStatement) pstmt).isUseServerPrepare());
+ assertEquals("prepareThreshold=5, so the statement should be server-prepared", 1,
+ getNumberOfServerPreparedStatements("INSERT INTO batch_tab_threshold5 (id, val) VALUES ($1,$2)"));
+ }
+
+ @Test
+ public void testBatchWithPrepareThreshold0() throws SQLException {
+ assumeBinaryModeRegular();
+ Assume.assumeTrue("simple protocol only does not support prepared statement requests",
+ preferQueryMode != PreferQueryMode.SIMPLE);
+
+ PreparedStatement pstmt = con.prepareStatement("CREATE temp TABLE batch_tab_threshold0 (id bigint, val bigint)");
+ pstmt.executeUpdate();
+ pstmt.close();
+
+ // When using a prepareThreshold of 0, a batch update should not use server-side prepare
+ pstmt = con.prepareStatement("INSERT INTO batch_tab_threshold0 (id, val) VALUES (?,?)");
+ ((PgStatement) pstmt).setPrepareThreshold(0);
+ for (int p = 0; p < 5; p++) {
+ for (int i = 0; i <= 5; i++) {
+ pstmt.setLong(1, i);
+ pstmt.setLong(2, i);
+ pstmt.addBatch();
+ }
+ pstmt.executeBatch();
+ }
+ pstmt.close();
+
+ assertFalse("prepareThreshold=0, so the statement should not be server-prepared",
+ ((PGStatement) pstmt).isUseServerPrepare());
+ assertEquals("prepareThreshold=0, so the statement should not be server-prepared", 0,
+ getNumberOfServerPreparedStatements("INSERT INTO batch_tab_threshold0 (id, val) VALUES ($1,$2)"));
+ }
+
+ @Test
+ public void testSelectPrepareThreshold0AutoCommitFalseFetchSizeNonZero() throws SQLException {
+ assumeBinaryModeRegular();
+ Assume.assumeTrue("simple protocol only does not support prepared statement requests",
+ preferQueryMode != PreferQueryMode.SIMPLE);
+
+ con.setAutoCommit(false);
+ PreparedStatement pstmt = null;
+ ResultSet rs = null;
+ try {
+ pstmt = con.prepareStatement("SELECT 42");
+ ((PgStatement) pstmt).setPrepareThreshold(0);
+ pstmt.setFetchSize(1);
+ rs = pstmt.executeQuery();
+ rs.next();
+ assertEquals(42, rs.getInt(1));
+ } finally {
+ TestUtil.closeQuietly(rs);
+ TestUtil.closeQuietly(pstmt);
+ }
+
+ assertFalse("prepareThreshold=0, so the statement should not be server-prepared",
+ ((PGStatement) pstmt).isUseServerPrepare());
+
+ assertEquals("prepareThreshold=0, so the statement should not be server-prepared", 0,
+ getNumberOfServerPreparedStatements("SELECT 42"));
+ }
+
+ @Test
+ public void testInappropriateStatementSharing() throws SQLException {
+ PreparedStatement ps = con.prepareStatement("SELECT ?::timestamp");
+ try {
+ Timestamp ts = new Timestamp(1474997614836L);
+ // Since PreparedStatement isn't cached immediately, we need to some warm up
+ for (int i = 0; i < 3; ++i) {
+ ResultSet rs;
+
+ // Flip statement to use Oid.DATE
+ ps.setNull(1, Types.DATE);
+ rs = ps.executeQuery();
+ try {
+ assertTrue(rs.next());
+ assertNull("NULL DATE converted to TIMESTAMP should return NULL value on getObject",
+ rs.getObject(1));
+ } finally {
+ rs.close();
+ }
+
+ // Flop statement to use Oid.UNSPECIFIED
+ ps.setTimestamp(1, ts);
+ rs = ps.executeQuery();
+ try {
+ assertTrue(rs.next());
+ assertEquals(
+ "Looks like we got a narrowing of the data (TIMESTAMP -> DATE). It might caused by inappropriate caching of the statement.",
+ ts, rs.getObject(1));
+ } finally {
+ rs.close();
+ }
+ }
+ } finally {
+ ps.close();
+ }
+ }
+
+ @Test
+ public void testAlternatingBindType() throws SQLException {
+ assumeBinaryModeForce();
+ PreparedStatement ps = con.prepareStatement("SELECT /*testAlternatingBindType*/ ?");
+ ResultSet rs;
+ Logger log = Logger.getLogger("org.postgresql.core.v3.SimpleQuery");
+ Level prevLevel = log.getLevel();
+ if (prevLevel == null || prevLevel.intValue() > Level.FINER.intValue()) {
+ log.setLevel(Level.FINER);
+ }
+ final AtomicInteger numOfReParses = new AtomicInteger();
+ Handler handler = new Handler() {
+ @Override
+ public void publish(LogRecord record) {
+ if (record.getMessage().contains("un-prepare it and parse")) {
+ numOfReParses.incrementAndGet();
+ }
+ }
+
+ @Override
+ public void flush() {
+ }
+
+ @Override
+ public void close() throws SecurityException {
+ }
+ };
+ log.addHandler(handler);
+ try {
+ ps.setString(1, "42");
+ rs = ps.executeQuery();
+ rs.next();
+ Assert.assertEquals("setString(1, \"42\") -> \"42\" expected", "42", rs.getObject(1));
+ rs.close();
+
+ // The bind type is flipped from VARCHAR to INTEGER, and it causes the driver to prepare statement again
+ ps.setNull(1, Types.INTEGER);
+ rs = ps.executeQuery();
+ rs.next();
+ Assert.assertNull("setNull(1, Types.INTEGER) -> null expected", rs.getObject(1));
+ Assert.assertEquals("A re-parse was expected, so the number of parses should be 1",
+ 1, numOfReParses.get());
+ rs.close();
+
+ // The bind type is flipped from INTEGER to VARCHAR, and it causes the driver to prepare statement again
+ ps.setString(1, "42");
+ rs = ps.executeQuery();
+ rs.next();
+ Assert.assertEquals("setString(1, \"42\") -> \"42\" expected", "42", rs.getObject(1));
+ Assert.assertEquals("One more re-parse is expected, so the number of parses should be 2",
+ 2, numOfReParses.get());
+ rs.close();
+
+ // Types.OTHER null is sent as UNSPECIFIED, and pgjdbc does not re-parse on UNSPECIFIED nulls
+ // Note: do not rely on absence of re-parse on using Types.OTHER. Try using consistent data types
+ ps.setNull(1, Types.OTHER);
+ rs = ps.executeQuery();
+ rs.next();
+ Assert.assertNull("setNull(1, Types.OTHER) -> null expected", rs.getObject(1));
+ Assert.assertEquals("setNull(, Types.OTHER) should not cause re-parse",
+ 2, numOfReParses.get());
+
+ // Types.INTEGER null is sent as int4 null, and it leads to re-parse
+ ps.setNull(1, Types.INTEGER);
+ rs = ps.executeQuery();
+ rs.next();
+ Assert.assertNull("setNull(1, Types.INTEGER) -> null expected", rs.getObject(1));
+ Assert.assertEquals("setNull(, Types.INTEGER) causes re-parse",
+ 3, numOfReParses.get());
+ rs.close();
+ } finally {
+ TestUtil.closeQuietly(ps);
+ log.removeHandler(handler);
+ log.setLevel(prevLevel);
+ }
+ }
}
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/QuotationTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/QuotationTest.java
index 985f88b..73fb3fb 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/QuotationTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/QuotationTest.java
@@ -21,7 +21,9 @@ import java.util.Collection;
@RunWith(Parameterized.class)
public class QuotationTest extends BaseTest4 {
private enum QuoteStyle {
- SIMPLE("'"), DOLLAR_NOTAG("$$"), DOLLAR_A("$a$"), DOLLAR_DEF("$DEF$");
+ SIMPLE("'"), DOLLAR_NOTAG("$$"), DOLLAR_A("$a$"), DOLLAR_DEF("$DEF$"),
+ SMILING_FACE("$o‿o$")
+ ;
private final String quote;
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/RefCursorTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/RefCursorTest.java
index c1926cb..4f273c1 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/RefCursorTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/RefCursorTest.java
@@ -6,6 +6,7 @@
package org.postgresql.test.jdbc2;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
@@ -34,7 +35,7 @@ import java.util.Arrays;
@RunWith(Parameterized.class)
public class RefCursorTest extends BaseTest4 {
- final int cursorType;
+ private final int cursorType;
public RefCursorTest(String typeName, int cursorType) {
this.cursorType = cursorType;
@@ -96,24 +97,24 @@ public class RefCursorTest extends BaseTest4 {
ResultSet rs = (ResultSet) call.getObject(1);
assertTrue(rs.next());
- assertTrue(rs.getInt(1) == 1);
+ assertEquals(1, rs.getInt(1));
assertTrue(rs.next());
- assertTrue(rs.getInt(1) == 2);
+ assertEquals(2, rs.getInt(1));
assertTrue(rs.next());
- assertTrue(rs.getInt(1) == 3);
+ assertEquals(3, rs.getInt(1));
assertTrue(rs.next());
- assertTrue(rs.getInt(1) == 4);
+ assertEquals(4, rs.getInt(1));
assertTrue(rs.next());
- assertTrue(rs.getInt(1) == 6);
+ assertEquals(6, rs.getInt(1));
assertTrue(rs.next());
- assertTrue(rs.getInt(1) == 9);
+ assertEquals(9, rs.getInt(1));
- assertTrue(!rs.next());
+ assertFalse(rs.next());
rs.close();
call.close();
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/ResultSetMetaDataTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/ResultSetMetaDataTest.java
index 9d0b7dd..98f9b78 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/ResultSetMetaDataTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/ResultSetMetaDataTest.java
@@ -10,9 +10,11 @@ import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import org.postgresql.PGResultSetMetaData;
+import org.postgresql.core.ServerVersion;
import org.postgresql.jdbc.PreferQueryMode;
import org.postgresql.test.TestUtil;
+import org.junit.Assert;
import org.junit.Assume;
import org.junit.Test;
@@ -38,6 +40,11 @@ public class ResultSetMetaDataTest extends BaseTest4 {
TestUtil.dropSequence(conn, "serialtest_a_seq");
TestUtil.dropSequence(conn, "serialtest_b_seq");
+
+ if (TestUtil.haveMinimumServerVersion(conn, ServerVersion.v10)) {
+ TestUtil.createTable(conn, "identitytest", "id int GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY");
+ }
+
TestUtil.createTable(conn, "serialtest", "a serial, b bigserial, c int");
TestUtil.createTable(conn, "alltypes",
"bool boolean, i2 int2, i4 int4, i8 int8, num numeric(10,2), re real, fl float, ch char(3), vc varchar(3), tx text, d date, t time without time zone, tz time with time zone, ts timestamp without time zone, tsz timestamp with time zone, bt bytea");
@@ -52,6 +59,9 @@ public class ResultSetMetaDataTest extends BaseTest4 {
TestUtil.dropTable(conn, "rsmd1");
TestUtil.dropTable(conn, "timetest");
TestUtil.dropTable(conn, "serialtest");
+ if (TestUtil.haveMinimumServerVersion(conn, ServerVersion.v10)) {
+ TestUtil.dropTable(conn, "identitytest");
+ }
TestUtil.dropTable(conn, "alltypes");
TestUtil.dropTable(conn, "sizetest");
TestUtil.dropSequence(conn, "serialtest_a_seq");
@@ -88,10 +98,8 @@ public class ResultSetMetaDataTest extends BaseTest4 {
assertEquals("a", rsmd.getColumnName(1));
assertEquals("oid", rsmd.getColumnName(5));
- if (TestUtil.isProtocolVersion(conn, 3)) {
- assertEquals("", pgrsmd.getBaseColumnName(4));
- assertEquals("b", pgrsmd.getBaseColumnName(6));
- }
+ assertEquals("", pgrsmd.getBaseColumnName(4));
+ assertEquals("b", pgrsmd.getBaseColumnName(6));
assertEquals(Types.INTEGER, rsmd.getColumnType(1));
assertEquals(Types.VARCHAR, rsmd.getColumnType(2));
@@ -105,25 +113,17 @@ public class ResultSetMetaDataTest extends BaseTest4 {
assertEquals("", rsmd.getSchemaName(1));
assertEquals("", rsmd.getSchemaName(4));
- if (TestUtil.isProtocolVersion(conn, 3)) {
- assertEquals("public", pgrsmd.getBaseSchemaName(1));
- assertEquals("", pgrsmd.getBaseSchemaName(4));
- }
+ assertEquals("public", pgrsmd.getBaseSchemaName(1));
+ assertEquals("", pgrsmd.getBaseSchemaName(4));
assertEquals("rsmd1", rsmd.getTableName(1));
assertEquals("", rsmd.getTableName(4));
- if (TestUtil.isProtocolVersion(conn, 3)) {
- assertEquals("rsmd1", pgrsmd.getBaseTableName(1));
- assertEquals("", pgrsmd.getBaseTableName(4));
- }
+ assertEquals("rsmd1", pgrsmd.getBaseTableName(1));
+ assertEquals("", pgrsmd.getBaseTableName(4));
- if (TestUtil.isProtocolVersion(conn, 3)) {
- assertEquals(ResultSetMetaData.columnNoNulls, rsmd.isNullable(1));
- assertEquals(ResultSetMetaData.columnNullable, rsmd.isNullable(2));
- assertEquals(ResultSetMetaData.columnNullableUnknown, rsmd.isNullable(4));
- } else {
- assertEquals(ResultSetMetaData.columnNullableUnknown, rsmd.isNullable(1));
- }
+ assertEquals(ResultSetMetaData.columnNoNulls, rsmd.isNullable(1));
+ assertEquals(ResultSetMetaData.columnNullable, rsmd.isNullable(2));
+ assertEquals(ResultSetMetaData.columnNullableUnknown, rsmd.isNullable(4));
}
// verify that a prepared update statement returns no metadata and doesn't execute.
@@ -205,12 +205,10 @@ public class ResultSetMetaDataTest extends BaseTest4 {
ResultSetMetaData rsmd = rs.getMetaData();
assertTrue(!rsmd.isAutoIncrement(1));
- if (TestUtil.isProtocolVersion(conn, 3)) {
- assertTrue(rsmd.isAutoIncrement(2));
- assertTrue(rsmd.isAutoIncrement(3));
- assertEquals("bigserial", rsmd.getColumnTypeName(2));
- assertEquals("serial", rsmd.getColumnTypeName(3));
- }
+ assertTrue(rsmd.isAutoIncrement(2));
+ assertTrue(rsmd.isAutoIncrement(3));
+ assertEquals("bigserial", rsmd.getColumnTypeName(2));
+ assertEquals("serial", rsmd.getColumnTypeName(3));
rs.close();
stmt.close();
@@ -260,6 +258,16 @@ public class ResultSetMetaDataTest extends BaseTest4 {
assertEquals("rsmd1", rsmd.getColumnTypeName(1));
}
+ @Test
+ public void testIdentityColumn() throws Exception {
+ assumeMinimumServerVersion(ServerVersion.v10);
+ assumePreparedStatementMetadataSupported();
+ PreparedStatement pstmt = conn.prepareStatement("SELECT id FROM identitytest");
+ ResultSet rs = pstmt.executeQuery();
+ ResultSetMetaData rsmd = pstmt.getMetaData();
+ Assert.assertTrue(rsmd.isAutoIncrement(1));
+ }
+
private void assumePreparedStatementMetadataSupported() {
Assume.assumeTrue("prepared statement metadata is not supported for simple protocol",
preferQueryMode.compareTo(PreferQueryMode.EXTENDED_FOR_PREPARED) >= 0);
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/ResultSetTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/ResultSetTest.java
index 6411309..f144e7e 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/ResultSetTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/ResultSetTest.java
@@ -10,12 +10,13 @@ import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
+import static org.junit.Assume.assumeTrue;
+import org.postgresql.core.ServerVersion;
import org.postgresql.jdbc.PreferQueryMode;
import org.postgresql.test.TestUtil;
import org.postgresql.util.PGobject;
-import org.junit.Assume;
import org.junit.Test;
import java.lang.reflect.Field;
@@ -50,21 +51,47 @@ public class ResultSetTest extends BaseTest4 {
TestUtil.createTable(con, "testint", "a int");
stmt.executeUpdate("INSERT INTO testint VALUES (12345)");
- TestUtil.createTable(con, "testbool", "a boolean");
+ // Boolean Tests
+ TestUtil.createTable(con, "testboolstring", "a varchar(30), b boolean");
+ stmt.executeUpdate("INSERT INTO testboolstring VALUES('1 ', true)");
+ stmt.executeUpdate("INSERT INTO testboolstring VALUES('0', false)");
+ stmt.executeUpdate("INSERT INTO testboolstring VALUES(' t', true)");
+ stmt.executeUpdate("INSERT INTO testboolstring VALUES('f', false)");
+ stmt.executeUpdate("INSERT INTO testboolstring VALUES('True', true)");
+ stmt.executeUpdate("INSERT INTO testboolstring VALUES(' False ', false)");
+ stmt.executeUpdate("INSERT INTO testboolstring VALUES('yes', true)");
+ stmt.executeUpdate("INSERT INTO testboolstring VALUES(' no ', false)");
+ stmt.executeUpdate("INSERT INTO testboolstring VALUES('y', true)");
+ stmt.executeUpdate("INSERT INTO testboolstring VALUES('n', false)");
+ stmt.executeUpdate("INSERT INTO testboolstring VALUES('oN', true)");
+ stmt.executeUpdate("INSERT INTO testboolstring VALUES('oFf', false)");
+ stmt.executeUpdate("INSERT INTO testboolstring VALUES('OK', null)");
+ stmt.executeUpdate("INSERT INTO testboolstring VALUES('NOT', null)");
+ stmt.executeUpdate("INSERT INTO testboolstring VALUES('not a boolean', null)");
+ stmt.executeUpdate("INSERT INTO testboolstring VALUES('1.0', null)");
+ stmt.executeUpdate("INSERT INTO testboolstring VALUES('0.0', null)");
+
+ TestUtil.createTable(con, "testboolfloat", "a float4, b boolean");
+ stmt.executeUpdate("INSERT INTO testboolfloat VALUES('1.0'::real, true)");
+ stmt.executeUpdate("INSERT INTO testboolfloat VALUES('0.0'::real, false)");
+ stmt.executeUpdate("INSERT INTO testboolfloat VALUES(1.000::real, true)");
+ stmt.executeUpdate("INSERT INTO testboolfloat VALUES(0.000::real, false)");
+ stmt.executeUpdate("INSERT INTO testboolfloat VALUES('1.001'::real, null)");
+ stmt.executeUpdate("INSERT INTO testboolfloat VALUES('-1.001'::real, null)");
+ stmt.executeUpdate("INSERT INTO testboolfloat VALUES(123.4::real, null)");
+ stmt.executeUpdate("INSERT INTO testboolfloat VALUES(1.234e2::real, null)");
+ stmt.executeUpdate("INSERT INTO testboolfloat VALUES(100.00e-2::real, true)");
+
+ TestUtil.createTable(con, "testboolint", "a bigint, b boolean");
+ stmt.executeUpdate("INSERT INTO testboolint VALUES(1, true)");
+ stmt.executeUpdate("INSERT INTO testboolint VALUES(0, false)");
+ stmt.executeUpdate("INSERT INTO testboolint VALUES(-1, null)");
+ stmt.executeUpdate("INSERT INTO testboolint VALUES(9223372036854775807, null)");
+ stmt.executeUpdate("INSERT INTO testboolint VALUES(-9223372036854775808, null)");
+ // End Boolean Tests
// TestUtil.createTable(con, "testbit", "a bit");
- TestUtil.createTable(con, "testboolstring", "a varchar(30)");
-
- stmt.executeUpdate("INSERT INTO testboolstring VALUES('true')");
- stmt.executeUpdate("INSERT INTO testboolstring VALUES('false')");
- stmt.executeUpdate("INSERT INTO testboolstring VALUES('t')");
- stmt.executeUpdate("INSERT INTO testboolstring VALUES('f')");
- stmt.executeUpdate("INSERT INTO testboolstring VALUES('1.0')");
- stmt.executeUpdate("INSERT INTO testboolstring VALUES('0.0')");
- stmt.executeUpdate("INSERT INTO testboolstring VALUES('TRUE')");
- stmt.executeUpdate("INSERT INTO testboolstring VALUES('this is not true')");
-
TestUtil.createTable(con, "testnumeric", "a numeric");
stmt.executeUpdate("INSERT INTO testnumeric VALUES('1.0')");
stmt.executeUpdate("INSERT INTO testnumeric VALUES('0.0')");
@@ -105,9 +132,10 @@ public class ResultSetTest extends BaseTest4 {
TestUtil.dropTable(con, "testrs");
TestUtil.dropTable(con, "teststring");
TestUtil.dropTable(con, "testint");
- TestUtil.dropTable(con, "testbool");
// TestUtil.dropTable(con, "testbit");
TestUtil.dropTable(con, "testboolstring");
+ TestUtil.dropTable(con, "testboolfloat");
+ TestUtil.dropTable(con, "testboolint");
TestUtil.dropTable(con, "testnumeric");
TestUtil.dropTable(con, "testpgobject");
super.tearDown();
@@ -186,63 +214,118 @@ public class ResultSetTest extends BaseTest4 {
assertEquals("12", new String(rs.getBytes(1)));
}
- public void booleanTests(boolean useServerPrepare) throws SQLException {
- java.sql.PreparedStatement pstmt = con.prepareStatement("insert into testbool values (?)");
- if (useServerPrepare) {
- ((org.postgresql.PGStatement) pstmt).setUseServerPrepare(true);
- }
-
- pstmt.setObject(1, new Float(0), java.sql.Types.BIT);
- pstmt.executeUpdate();
-
- pstmt.setObject(1, new Float(1), java.sql.Types.BIT);
- pstmt.executeUpdate();
+ @Test
+ public void testBooleanString() throws SQLException {
+ testBoolean("testboolstring", 0);
+ testBoolean("testboolstring", 1);
+ testBoolean("testboolstring", 5);
+ testBoolean("testboolstring", -1);
+ }
- pstmt.setObject(1, "False", java.sql.Types.BIT);
- pstmt.executeUpdate();
+ @Test
+ public void testBooleanFloat() throws SQLException {
+ testBoolean("testboolfloat", 0);
+ testBoolean("testboolfloat", 1);
+ testBoolean("testboolfloat", 5);
+ testBoolean("testboolfloat", -1);
+ }
- pstmt.setObject(1, "True", java.sql.Types.BIT);
- pstmt.executeUpdate();
+ @Test
+ public void testBooleanInt() throws SQLException {
+ testBoolean("testboolint", 0);
+ testBoolean("testboolint", 1);
+ testBoolean("testboolint", 5);
+ testBoolean("testboolint", -1);
+ }
- ResultSet rs = con.createStatement().executeQuery("select * from testbool");
- for (int i = 0; i < 2; i++) {
- assertTrue(rs.next());
- assertEquals(false, rs.getBoolean(1));
- assertTrue(rs.next());
- assertEquals(true, rs.getBoolean(1));
+ public void testBoolean(String table, int prepareThreshold) throws SQLException {
+ PreparedStatement pstmt = con.prepareStatement("select a, b from " + table);
+ ((org.postgresql.PGStatement) pstmt).setPrepareThreshold(prepareThreshold);
+ ResultSet rs = pstmt.executeQuery();
+ while (rs.next()) {
+ rs.getBoolean(2);
+ Boolean expected = rs.wasNull() ? null : rs.getBoolean(2); // Hack to get SQL NULL
+ if (expected != null) {
+ assertEquals(expected, rs.getBoolean(1));
+ } else {
+ // expected value with null are bad values
+ try {
+ rs.getBoolean(1);
+ fail();
+ } catch (SQLException e) {
+ assertEquals(org.postgresql.util.PSQLState.CANNOT_COERCE.getState(), e.getSQLState());
+ }
+ }
}
+ rs.close();
+ pstmt.close();
+ }
- /*
- * pstmt = con.prepareStatement("insert into testbit values (?)");
- *
- * pstmt.setObject(1, new Float(0), java.sql.Types.BIT); pstmt.executeUpdate();
- *
- * pstmt.setObject(1, new Float(1), java.sql.Types.BIT); pstmt.executeUpdate();
- *
- * pstmt.setObject(1, "false", java.sql.Types.BIT); pstmt.executeUpdate();
- *
- * pstmt.setObject(1, "true", java.sql.Types.BIT); pstmt.executeUpdate();
- *
- * rs = con.createStatement().executeQuery("select * from testbit");
- *
- * for (int i = 0;i<2; i++) { assertTrue(rs.next()); assertEquals(false, rs.getBoolean(1));
- * assertTrue(rs.next()); assertEquals(true, rs.getBoolean(1)); }
- */
+ @Test
+ public void testgetBooleanJDBCCompliance() throws SQLException {
+ // The JDBC specification in Table B-6 "Use of ResultSet getter Methods to Retrieve JDBC Data Types"
+ // the getBoolean have this Supported JDBC Type: TINYINT, SMALLINT, INTEGER, BIGINT, REAL, FLOAT,
+ // DOUBLE, DECIAML, NUMERIC, BIT, BOOLEAN, CHAR, VARCHAR, LONGVARCHAR
+
+ // There is no TINYINT in PostgreSQL
+ testgetBoolean("int2"); // SMALLINT
+ testgetBoolean("int4"); // INTEGER
+ testgetBoolean("int8"); // BIGINT
+ testgetBoolean("float4"); // REAL
+ testgetBoolean("float8"); // FLOAT, DOUBLE
+ testgetBoolean("numeric"); // DECIMAL, NUMERIC
+ testgetBoolean("bpchar"); // CHAR
+ testgetBoolean("varchar"); // VARCHAR
+ testgetBoolean("text"); // LONGVARCHAR?
+ }
- rs = con.createStatement().executeQuery("select * from testboolstring");
+ public void testgetBoolean(String dataType) throws SQLException {
+ Statement stmt = con.createStatement();
+ ResultSet rs = stmt.executeQuery("select 1::" + dataType + ", 0::" + dataType + ", 2::" + dataType);
+ assertTrue(rs.next());
+ assertEquals(true, rs.getBoolean(1));
+ assertEquals(false, rs.getBoolean(2));
- for (int i = 0; i < 4; i++) {
- assertTrue(rs.next());
- assertEquals(true, rs.getBoolean(1));
- assertTrue(rs.next());
- assertEquals(false, rs.getBoolean(1));
+ try {
+ // The JDBC ResultSet JavaDoc states that only 1 and 0 are valid values, so 2 should return error.
+ rs.getBoolean(3);
+ fail();
+ } catch (SQLException e) {
+ assertEquals(org.postgresql.util.PSQLState.CANNOT_COERCE.getState(), e.getSQLState());
+ assertEquals("Cannot cast to boolean: \"2\"", e.getMessage());
}
+ rs.close();
+ stmt.close();
+ }
+
+ @Test
+ public void testgetBadBoolean() throws SQLException {
+ testBadBoolean("'2017-03-13 14:25:48.130861'::timestamp", "2017-03-13 14:25:48.130861");
+ testBadBoolean("'2017-03-13'::date", "2017-03-13");
+ testBadBoolean("'2017-03-13 14:25:48.130861'::time", "14:25:48.130861");
+ testBadBoolean("ARRAY[[1,0],[0,1]]", "{{1,0},{0,1}}");
+ testBadBoolean("29::bit(4)", "1101");
}
@Test
- public void testBoolean() throws SQLException {
- booleanTests(true);
- booleanTests(false);
+ public void testGetBadUuidBoolean() throws SQLException {
+ assumeTrue(TestUtil.haveMinimumServerVersion(con, ServerVersion.v8_3));
+ testBadBoolean("'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11'::uuid", "a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11");
+ }
+
+ public void testBadBoolean(String select, String value) throws SQLException {
+ Statement stmt = con.createStatement();
+ ResultSet rs = stmt.executeQuery("select " + select);
+ assertTrue(rs.next());
+ try {
+ rs.getBoolean(1);
+ fail();
+ } catch (SQLException e) {
+ assertEquals(org.postgresql.util.PSQLState.CANNOT_COERCE.getState(), e.getSQLState());
+ assertEquals("Cannot cast to boolean: \"" + value + "\"", e.getMessage());
+ }
+ rs.close();
+ stmt.close();
}
@Test
@@ -800,7 +883,7 @@ public class ResultSetTest extends BaseTest4 {
*/
@Test
public void testNamedPreparedStatementResultSetColumnMappingCache() throws SQLException {
- Assume.assumeTrue("Simple protocol only mode does not support server-prepared statements",
+ assumeTrue("Simple protocol only mode does not support server-prepared statements",
preferQueryMode != PreferQueryMode.SIMPLE);
PreparedStatement pstmt = con.prepareStatement("SELECT id FROM testrs");
ResultSet rs;
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/SearchPathLookupTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/SearchPathLookupTest.java
index c6382d8..c18fdc9 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/SearchPathLookupTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/SearchPathLookupTest.java
@@ -5,11 +5,15 @@
package org.postgresql.test.jdbc2;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
import org.postgresql.core.BaseConnection;
import org.postgresql.core.TypeInfo;
import org.postgresql.test.TestUtil;
-import junit.framework.TestCase;
+import org.junit.Before;
+import org.junit.Test;
import java.sql.ResultSet;
import java.sql.Statement;
@@ -18,16 +22,12 @@ import java.sql.Statement;
* TestCase to test the internal functionality of org.postgresql.jdbc2.DatabaseMetaData
*
*/
-
-public class SearchPathLookupTest extends TestCase {
-
+public class SearchPathLookupTest {
private BaseConnection con;
- /*
- * Constructor
- */
- public SearchPathLookupTest(String name) {
- super(name);
+ @Before
+ public void setUp() throws Exception {
+ con = (BaseConnection) TestUtil.openDB();
}
// TODO: make @getMetaData() consider search_path as well
@@ -36,8 +36,8 @@ public class SearchPathLookupTest extends TestCase {
* This usecase is most common, here the object we are searching for is in the current_schema (the
* first schema in the search_path)
*/
+ @Test
public void testSearchPathNormalLookup() throws Exception {
- con = (BaseConnection) TestUtil.openDB();
Statement stmt = con.createStatement();
try {
TestUtil.createSchema(con, "first_schema");
@@ -72,8 +72,8 @@ public class SearchPathLookupTest extends TestCase {
* search_path, but not in the current_schema, for example a public schema or some kind of schema,
* that is used for keeping utility objects.
*/
+ @Test
public void testSearchPathHiddenLookup() throws Exception {
- con = (BaseConnection) TestUtil.openDB();
Statement stmt = con.createStatement();
try {
TestUtil.createSchema(con, "first_schema");
@@ -103,8 +103,8 @@ public class SearchPathLookupTest extends TestCase {
}
}
+ @Test
public void testSearchPathBackwardsCompatibleLookup() throws Exception {
- con = (BaseConnection) TestUtil.openDB();
Statement stmt = con.createStatement();
try {
TestUtil.createSchema(con, "first_schema");
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/ServerErrorTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/ServerErrorTest.java
index b5811c2..df03bfa 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/ServerErrorTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/ServerErrorTest.java
@@ -5,29 +5,29 @@
package org.postgresql.test.jdbc2;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.fail;
+
+import org.postgresql.core.ServerVersion;
import org.postgresql.test.TestUtil;
import org.postgresql.util.PSQLException;
import org.postgresql.util.ServerErrorMessage;
-import junit.framework.TestCase;
+import org.junit.Test;
-import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
/*
* Test that enhanced error reports return the correct origin for constraint violation errors.
*/
-public class ServerErrorTest extends TestCase {
-
- private Connection con;
-
- public ServerErrorTest(String name) {
- super(name);
- }
+public class ServerErrorTest extends BaseTest4 {
- protected void setUp() throws Exception {
- con = TestUtil.openDB();
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+ assumeMinimumServerVersion(ServerVersion.v9_3);
Statement stmt = con.createStatement();
stmt.execute("CREATE DOMAIN testdom AS int4 CHECK (value < 10)");
@@ -36,14 +36,16 @@ public class ServerErrorTest extends TestCase {
stmt.close();
}
- protected void tearDown() throws Exception {
+ @Override
+ public void tearDown() throws SQLException {
TestUtil.dropTable(con, "testerr");
Statement stmt = con.createStatement();
- stmt.execute("DROP DOMAIN testdom");
+ stmt.execute("DROP DOMAIN IF EXISTS testdom");
stmt.close();
- TestUtil.closeDB(con);
+ super.tearDown();
}
+ @Test
public void testPrimaryKey() throws Exception {
Statement stmt = con.createStatement();
stmt.executeUpdate("INSERT INTO testerr (id, val) VALUES (1, 1)");
@@ -61,6 +63,7 @@ public class ServerErrorTest extends TestCase {
stmt.close();
}
+ @Test
public void testColumn() throws Exception {
Statement stmt = con.createStatement();
try {
@@ -77,6 +80,7 @@ public class ServerErrorTest extends TestCase {
stmt.close();
}
+ @Test
public void testDatatype() throws Exception {
Statement stmt = con.createStatement();
try {
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/StatementTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/StatementTest.java
index 1a67854..013622f 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/StatementTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/StatementTest.java
@@ -5,59 +5,81 @@
package org.postgresql.test.jdbc2;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import org.postgresql.core.ServerVersion;
import org.postgresql.jdbc.PgStatement;
import org.postgresql.test.TestUtil;
+import org.postgresql.util.PSQLState;
-import junit.framework.TestCase;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
+import java.sql.SQLWarning;
import java.sql.Statement;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Random;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicReference;
+
/*
* Test for getObject
*/
+public class StatementTest {
+ private Connection con;
-public class StatementTest extends TestCase {
- Connection con = null;
-
- public StatementTest(String name) {
- super(name);
- }
-
- protected void setUp() throws Exception {
- super.setUp();
-
+ @Before
+ public void setUp() throws Exception {
con = TestUtil.openDB();
TestUtil.createTempTable(con, "test_statement", "i int");
TestUtil.createTempTable(con, "escapetest",
"ts timestamp, d date, t time, \")\" varchar(5), \"\"\"){a}'\" text ");
TestUtil.createTempTable(con, "comparisontest", "str1 varchar(5), str2 varchar(15)");
+ TestUtil.createTable(con, "test_lock", "name text");
Statement stmt = con.createStatement();
stmt.executeUpdate(TestUtil.insertSQL("comparisontest", "str1,str2", "'_abcd','_found'"));
stmt.executeUpdate(TestUtil.insertSQL("comparisontest", "str1,str2", "'%abcd','%found'"));
stmt.close();
}
- protected void tearDown() throws Exception {
- super.tearDown();
+ @After
+ public void tearDown() throws Exception {
TestUtil.dropTable(con, "test_statement");
TestUtil.dropTable(con, "escapetest");
TestUtil.dropTable(con, "comparisontest");
+ TestUtil.dropTable(con, "test_lock");
+ con.createStatement().execute("DROP FUNCTION IF EXISTS notify_loop()");
+ con.createStatement().execute("DROP FUNCTION IF EXISTS notify_then_sleep()");
con.close();
}
+ @Test
public void testClose() throws SQLException {
Statement stmt = con.createStatement();
stmt.close();
try {
stmt.getResultSet();
- this.fail("statements should not be re-used after close");
+ fail("statements should not be re-used after close");
} catch (SQLException ex) {
}
}
@@ -65,12 +87,14 @@ public class StatementTest extends TestCase {
/**
* Closing a Statement twice is not an error.
*/
+ @Test
public void testDoubleClose() throws SQLException {
Statement stmt = con.createStatement();
stmt.close();
stmt.close();
}
+ @Test
public void testMultiExecute() throws SQLException {
Statement stmt = con.createStatement();
assertTrue(stmt.execute("SELECT 1 as a; UPDATE test_statement SET i=1; SELECT 2 as b, 3 as c"));
@@ -94,6 +118,7 @@ public class StatementTest extends TestCase {
stmt.close();
}
+ @Test
public void testEmptyQuery() throws SQLException {
Statement stmt = con.createStatement();
stmt.execute("");
@@ -101,6 +126,7 @@ public class StatementTest extends TestCase {
assertTrue(!stmt.getMoreResults());
}
+ @Test
public void testUpdateCount() throws SQLException {
Statement stmt = con.createStatement();
int count;
@@ -115,8 +141,14 @@ public class StatementTest extends TestCase {
count = stmt.executeUpdate("CREATE TEMP TABLE another_table (a int)");
assertEquals(0, count);
+
+ if (TestUtil.haveMinimumServerVersion(con, ServerVersion.v9_0)) {
+ count = stmt.executeUpdate("CREATE TEMP TABLE yet_another_table AS SELECT x FROM generate_series(1,10) x");
+ assertEquals(10, count);
+ }
}
+ @Test
public void testEscapeProcessing() throws SQLException {
Statement stmt = con.createStatement();
int count;
@@ -169,6 +201,7 @@ public class StatementTest extends TestCase {
}
+ @Test
public void testPreparedFunction() throws SQLException {
PreparedStatement pstmt = con.prepareStatement("SELECT {fn concat('a', ?)}");
pstmt.setInt(1, 5);
@@ -177,6 +210,7 @@ public class StatementTest extends TestCase {
assertEquals("a5", rs.getString(1));
}
+ @Test
public void testDollarInComment() throws SQLException {
PreparedStatement pstmt = con.prepareStatement("SELECT /* $ */ {fn curdate()}");
ResultSet rs = pstmt.executeQuery();
@@ -184,6 +218,7 @@ public class StatementTest extends TestCase {
assertNotNull("{fn curdate()} should be not null", rs.getString(1));
}
+ @Test
public void testDollarInCommentTwoComments() throws SQLException {
PreparedStatement pstmt = con.prepareStatement("SELECT /* $ *//* $ */ {fn curdate()}");
ResultSet rs = pstmt.executeQuery();
@@ -191,6 +226,7 @@ public class StatementTest extends TestCase {
assertNotNull("{fn curdate()} should be not null", rs.getString(1));
}
+ @Test
public void testNumericFunctions() throws SQLException {
Statement stmt = con.createStatement();
@@ -254,9 +290,11 @@ public class StatementTest extends TestCase {
assertEquals(3.12, rs.getDouble(5), 0.00001);
}
+ @Test
public void testStringFunctions() throws SQLException {
Statement stmt = con.createStatement();
- ResultSet rs = stmt.executeQuery("select {fn ascii(' test')},{fn char(32)}"
+ ResultSet rs = stmt.executeQuery(
+ "select {fn ascii(' test')},{fn char(32)}"
+ ",{fn concat('ab','cd')}"
+ ",{fn lcase('aBcD')},{fn left('1234',2)},{fn length('123 ')}"
+ ",{fn locate('bc','abc')},{fn locate('bc','abc',3)}");
@@ -270,20 +308,18 @@ public class StatementTest extends TestCase {
assertEquals(2, rs.getInt(7));
assertEquals(0, rs.getInt(8));
- if (TestUtil.haveMinimumServerVersion(con, "7.3")) {
- rs = stmt.executeQuery(
- "SELECT {fn insert('abcdef',3,2,'xxxx')}"
- + ",{fn replace('abcdbc','bc','x')}");
- assertTrue(rs.next());
- assertEquals("abxxxxef", rs.getString(1));
- assertEquals("axdx", rs.getString(2));
- }
+ rs = stmt.executeQuery(
+ "SELECT {fn insert('abcdef',3,2,'xxxx')}"
+ + ",{fn replace('abcdbc','bc','x')}");
+ assertTrue(rs.next());
+ assertEquals("abxxxxef", rs.getString(1));
+ assertEquals("axdx", rs.getString(2));
rs = stmt.executeQuery(
"select {fn ltrim(' ab')},{fn repeat('ab',2)}"
- + ",{fn right('abcde',2)},{fn rtrim('ab ')}"
- + ",{fn space(3)},{fn substring('abcd',2,2)}"
- + ",{fn ucase('aBcD')}");
+ + ",{fn right('abcde',2)},{fn rtrim('ab ')}"
+ + ",{fn space(3)},{fn substring('abcd',2,2)}"
+ + ",{fn ucase('aBcD')}");
assertTrue(rs.next());
assertEquals("ab", rs.getString(1));
assertEquals("abab", rs.getString(2));
@@ -294,13 +330,11 @@ public class StatementTest extends TestCase {
assertEquals("ABCD", rs.getString(7));
}
+ @Test
public void testDateFuncWithParam() throws SQLException {
// Prior to 8.0 there is not an interval + timestamp operator,
// so timestampadd does not work.
//
- if (!TestUtil.haveMinimumServerVersion(con, "8.0")) {
- return;
- }
PreparedStatement ps = con.prepareStatement(
"SELECT {fn timestampadd(SQL_TSI_QUARTER, ? ,{fn now()})}, {fn timestampadd(SQL_TSI_MONTH, ?, {fn now()})} ");
@@ -311,6 +345,7 @@ public class StatementTest extends TestCase {
assertEquals(rs.getTimestamp(1), rs.getTimestamp(2));
}
+ @Test
public void testDateFunctions() throws SQLException {
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("select {fn curdate()},{fn curtime()}"
@@ -328,9 +363,6 @@ public class StatementTest extends TestCase {
// Prior to 8.0 there is not an interval + timestamp operator,
// so timestampadd does not work.
//
- if (!TestUtil.haveMinimumServerVersion(con, "8.0")) {
- return;
- }
// second
rs = stmt.executeQuery(
@@ -351,7 +383,25 @@ public class StatementTest extends TestCase {
rs = stmt.executeQuery(
"select {fn timestampdiff(SQL_TSI_DAY,{fn now()},{fn timestampadd(SQL_TSI_DAY,-3,{fn now()})})} ");
assertTrue(rs.next());
- assertEquals(-3, rs.getInt(1));
+ int res = rs.getInt(1);
+ if (res != -3 && res != -2) {
+ // set TimeZone='America/New_York';
+ // select CAST(-3 || ' day' as interval);
+ // interval
+ //----------
+ // -3 days
+ //
+ // select CAST(-3 || ' day' as interval)+now();
+ // ?column?
+ //-------------------------------
+ // 2018-03-08 07:59:13.586895-05
+ //
+ // select CAST(-3 || ' day' as interval)+now()-now();
+ // ?column?
+ //-------------------
+ // -2 days -23:00:00
+ fail("CAST(-3 || ' day' as interval)+now()-now() is expected to return -3 or -2. Actual value is " + res);
+ }
// WEEK => extract week from interval is not supported by backend
// rs = stmt.executeQuery("select {fn timestampdiff(SQL_TSI_WEEK,{fn now()},{fn
// timestampadd(SQL_TSI_WEEK,3,{fn now()})})} ");
@@ -374,22 +424,22 @@ public class StatementTest extends TestCase {
// assertEquals(3,rs.getInt(1));
}
+ @Test
public void testSystemFunctions() throws SQLException {
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(
"select {fn ifnull(null,'2')}"
- + ",{fn user()} ");
+ + ",{fn user()} ");
assertTrue(rs.next());
assertEquals("2", rs.getString(1));
assertEquals(TestUtil.getUser(), rs.getString(2));
- if (TestUtil.haveMinimumServerVersion(con, "7.3")) {
- rs = stmt.executeQuery("select {fn database()} ");
- assertTrue(rs.next());
- assertEquals(TestUtil.getDatabase(), rs.getString(1));
- }
+ rs = stmt.executeQuery("select {fn database()} ");
+ assertTrue(rs.next());
+ assertEquals(TestUtil.getDatabase(), rs.getString(1));
}
+ @Test
public void testWarningsAreCleared() throws SQLException {
Statement stmt = con.createStatement();
// Will generate a NOTICE: for primary key index creation
@@ -400,11 +450,142 @@ public class StatementTest extends TestCase {
stmt.close();
}
+ @Test
+ public void testWarningsAreAvailableAsap()
+ throws Exception {
+ final Connection outerLockCon = TestUtil.openDB();
+ outerLockCon.setAutoCommit(false);
+ //Acquire an exclusive lock so we can block the notice generating statement
+ outerLockCon.createStatement().execute("LOCK TABLE test_lock IN ACCESS EXCLUSIVE MODE;");
+ con.createStatement()
+ .execute("CREATE OR REPLACE FUNCTION notify_then_sleep() RETURNS VOID AS "
+ + "$BODY$ "
+ + "BEGIN "
+ + "RAISE NOTICE 'Test 1'; "
+ + "RAISE NOTICE 'Test 2'; "
+ + "LOCK TABLE test_lock IN ACCESS EXCLUSIVE MODE; "
+ + "END "
+ + "$BODY$ "
+ + "LANGUAGE plpgsql;");
+ con.createStatement().execute("SET SESSION client_min_messages = 'NOTICE'");
+ //If we never receive the two warnings the statement will just hang, so set a low timeout
+ con.createStatement().execute("SET SESSION statement_timeout = 1000");
+ final PreparedStatement preparedStatement = con.prepareStatement("SELECT notify_then_sleep()");
+ final Callable<Void> warningReader = new Callable<Void>() {
+ @Override
+ public Void call() throws SQLException, InterruptedException {
+ while (true) {
+ SQLWarning warning = preparedStatement.getWarnings();
+ if (warning != null) {
+ assertEquals("First warning received not first notice raised",
+ "Test 1", warning.getMessage());
+ SQLWarning next = warning.getNextWarning();
+ if (next != null) {
+ assertEquals("Second warning received not second notice raised",
+ "Test 2", next.getMessage());
+ //Release the lock so that the notice generating statement can end.
+ outerLockCon.commit();
+ return null;
+ }
+ }
+ //Break the loop on InterruptedException
+ Thread.sleep(0);
+ }
+ }
+ };
+ ExecutorService executorService = Executors.newSingleThreadExecutor();
+ try {
+ Future<Void> future = executorService.submit(warningReader);
+ //Statement should only finish executing once we have
+ //received the two notices and released the outer lock.
+ preparedStatement.execute();
+
+ //If test takes longer than 2 seconds its a failure.
+ future.get(2, TimeUnit.SECONDS);
+ } finally {
+ executorService.shutdownNow();
+ }
+ }
+
+
+ /**
+ * Demonstrates a safe approach to concurrently reading the latest
+ * warnings while periodically clearing them.
+ *
+ * One drawback of this approach is that it requires the reader to make it to the end of the
+ * warning chain before clearing it, so long as your warning processing step is not very slow,
+ * this should happen more or less instantaneously even if you receive a lot of warnings.
+ */
+ @Test
+ public void testConcurrentWarningReadAndClear()
+ throws SQLException, InterruptedException, ExecutionException, TimeoutException {
+ final int iterations = 1000;
+ con.createStatement()
+ .execute("CREATE OR REPLACE FUNCTION notify_loop() RETURNS VOID AS "
+ + "$BODY$ "
+ + "BEGIN "
+ + "FOR i IN 1.. " + iterations + " LOOP "
+ + " RAISE NOTICE 'Warning %', i; "
+ + "END LOOP; "
+ + "END "
+ + "$BODY$ "
+ + "LANGUAGE plpgsql;");
+ con.createStatement().execute("SET SESSION client_min_messages = 'NOTICE'");
+ final PreparedStatement statement = con.prepareStatement("SELECT notify_loop()");
+ final Callable<Void> warningReader = new Callable<Void>() {
+ @Override
+ public Void call() throws SQLException, InterruptedException {
+ SQLWarning lastProcessed = null;
+ int warnings = 0;
+ //For production code replace this with some condition that
+ //ends after the statement finishes execution
+ while (warnings < iterations) {
+ SQLWarning warn = statement.getWarnings();
+ //if next linked warning has value use that, otherwise keep using latest head
+ if (lastProcessed != null && lastProcessed.getNextWarning() != null) {
+ warn = lastProcessed.getNextWarning();
+ }
+ if (warn != null) {
+ warnings++;
+ //System.out.println("Processing " + warn.getMessage());
+ assertEquals("Received warning out of expected order",
+ "Warning " + warnings, warn.getMessage());
+ lastProcessed = warn;
+ //If the processed warning was the head of the chain clear
+ if (warn == statement.getWarnings()) {
+ //System.out.println("Clearing warnings");
+ statement.clearWarnings();
+ }
+ } else {
+ //Not required for this test, but a good idea adding some delay for production code
+ //to avoid high cpu usage while the query is running and no warnings are coming in.
+ //Alternatively use JDK9's Thread.onSpinWait()
+ Thread.sleep(10);
+ }
+ }
+ assertEquals("Didn't receive expected last warning",
+ "Warning " + iterations, lastProcessed.getMessage());
+ return null;
+ }
+ };
+
+ final ExecutorService executor = Executors.newSingleThreadExecutor();
+ try {
+ final Future warningReaderThread = executor.submit(warningReader);
+ statement.execute();
+ //If the reader doesn't return after 2 seconds, it failed.
+ warningReaderThread.get(2, TimeUnit.SECONDS);
+ } finally {
+ executor.shutdownNow();
+ }
+ }
+
/**
* The parser tries to break multiple statements into individual queries as required by the V3
* extended query protocol. It can be a little overzealous sometimes and this test ensures we keep
* multiple rule actions together in one statement.
*/
+ @Test
public void testParsingSemiColons() throws SQLException {
Statement stmt = con.createStatement();
stmt.execute(
@@ -418,12 +599,9 @@ public class StatementTest extends TestCase {
assertTrue(!rs.next());
}
+ @Test
public void testParsingDollarQuotes() throws SQLException {
// dollar-quotes are supported in the backend since version 8.0
- if (!TestUtil.haveMinimumServerVersion(con, "8.0")) {
- return;
- }
-
Statement st = con.createStatement();
ResultSet rs;
@@ -465,6 +643,7 @@ public class StatementTest extends TestCase {
st.close();
}
+ @Test
public void testUnbalancedParensParseError() throws SQLException {
Statement stmt = con.createStatement();
try {
@@ -474,6 +653,7 @@ public class StatementTest extends TestCase {
}
}
+ @Test
public void testExecuteUpdateFailsOnSelect() throws SQLException {
Statement stmt = con.createStatement();
try {
@@ -483,6 +663,7 @@ public class StatementTest extends TestCase {
}
}
+ @Test
public void testExecuteUpdateFailsOnMultiStatementSelect() throws SQLException {
Statement stmt = con.createStatement();
try {
@@ -492,6 +673,7 @@ public class StatementTest extends TestCase {
}
}
+ @Test
public void testSetQueryTimeout() throws SQLException {
Statement stmt = con.createStatement();
long start = 0;
@@ -517,6 +699,7 @@ public class StatementTest extends TestCase {
* Test executes two queries one after another. The first one has timeout of 1ms, and the second
* one does not. The timeout of the first query should not impact the second one.
*/
+ @Test
public void testShortQueryTimeout() throws SQLException {
long deadLine = System.currentTimeMillis() + 10000;
Statement stmt = con.createStatement();
@@ -532,6 +715,7 @@ public class StatementTest extends TestCase {
}
}
+ @Test
public void testSetQueryTimeoutWithSleep() throws SQLException, InterruptedException {
// check that the timeout starts ticking at execute, not at the
// setQueryTimeout call.
@@ -540,7 +724,7 @@ public class StatementTest extends TestCase {
stmt.setQueryTimeout(1);
Thread.sleep(3000);
stmt.execute("select pg_sleep(5)");
- this.fail("statement should have been canceled by query timeout");
+ fail("statement should have been canceled by query timeout");
} catch (SQLException sqle) {
// state for cancel
if (sqle.getSQLState().compareTo("57014") != 0) {
@@ -549,6 +733,7 @@ public class StatementTest extends TestCase {
}
}
+ @Test
public void testSetQueryTimeoutOnPrepared() throws SQLException, InterruptedException {
// check that a timeout set on a prepared statement works on every
// execution.
@@ -567,6 +752,7 @@ public class StatementTest extends TestCase {
}
}
+ @Test
public void testSetQueryTimeoutWithoutExecute() throws SQLException, InterruptedException {
// check that a timeout set on one statement doesn't affect another
Statement stmt1 = con.createStatement();
@@ -576,6 +762,7 @@ public class StatementTest extends TestCase {
ResultSet rs = stmt2.executeQuery("SELECT pg_sleep(2)");
}
+ @Test
public void testResultSetTwice() throws SQLException {
Statement stmt = con.createStatement();
@@ -586,6 +773,7 @@ public class StatementTest extends TestCase {
assertNotNull(rsOther);
}
+ @Test
public void testMultipleCancels() throws Exception {
org.postgresql.util.SharedTimer sharedTimer = org.postgresql.Driver.getSharedTimer();
@@ -625,10 +813,123 @@ public class StatementTest extends TestCase {
assertEquals(0, sharedTimer.getRefCount());
}
+ @Test(timeout = 10000)
+ public void testCloseInProgressStatement() throws Exception {
+ ExecutorService executor = Executors.newSingleThreadExecutor();
+ final Connection outerLockCon = TestUtil.openDB();
+ outerLockCon.setAutoCommit(false);
+ //Acquire an exclusive lock so we can block the notice generating statement
+ outerLockCon.createStatement().execute("LOCK TABLE test_lock IN ACCESS EXCLUSIVE MODE;");
+
+ try {
+ con.createStatement().execute("SET SESSION client_min_messages = 'NOTICE'");
+ con.createStatement()
+ .execute("CREATE OR REPLACE FUNCTION notify_then_sleep() RETURNS VOID AS "
+ + "$BODY$ "
+ + "BEGIN "
+ + "RAISE NOTICE 'start';"
+ + "LOCK TABLE test_lock IN ACCESS EXCLUSIVE MODE;"
+ + "END "
+ + "$BODY$ "
+ + "LANGUAGE plpgsql;");
+ int cancels = 0;
+ for (int i = 0; i < 100; i++) {
+ final Statement st = con.createStatement();
+ executor.submit(new Callable<Void>() {
+ @Override
+ public Void call() throws Exception {
+ long start = System.currentTimeMillis();
+ while (st.getWarnings() == null) {
+ long dt = System.currentTimeMillis() - start;
+ if (dt > 10000) {
+ throw new IllegalStateException("Expected to receive a notice within 10 seconds");
+ }
+ }
+ st.close();
+ return null;
+ }
+ });
+ st.setQueryTimeout(120);
+ try {
+ st.execute("select notify_then_sleep()");
+ } catch (SQLException e) {
+ Assert.assertEquals(
+ "Query is expected to be cancelled via st.close(), got " + e.getMessage(),
+ PSQLState.QUERY_CANCELED.getState(),
+ e.getSQLState()
+ );
+ cancels++;
+ } finally {
+ TestUtil.closeQuietly(st);
+ }
+ }
+ Assert.assertNotEquals("At least one QUERY_CANCELED state is expected", 0, cancels);
+ } finally {
+ executor.shutdown();
+ TestUtil.closeQuietly(outerLockCon);
+ }
+ }
+
+ @Test(timeout = 20000)
+ public void testFastCloses() throws SQLException {
+ ExecutorService executor = Executors.newSingleThreadExecutor();
+ con.createStatement().execute("SET SESSION client_min_messages = 'NOTICE'");
+ con.createStatement()
+ .execute("CREATE OR REPLACE FUNCTION notify_then_sleep() RETURNS VOID AS "
+ + "$BODY$ "
+ + "BEGIN "
+ + "RAISE NOTICE 'start';"
+ + "EXECUTE pg_sleep(1);" // Note: timeout value does not matter here, we just test if test crashes or locks somehow
+ + "END "
+ + "$BODY$ "
+ + "LANGUAGE plpgsql;");
+ Map<String, Integer> cnt = new HashMap<String, Integer>();
+ final Random rnd = new Random();
+ for (int i = 0; i < 1000; i++) {
+ final Statement st = con.createStatement();
+ executor.submit(new Callable<Void>() {
+ @Override
+ public Void call() throws Exception {
+ int s = rnd.nextInt(10);
+ if (s > 8) {
+ Thread.sleep(s - 9);
+ }
+ st.close();
+ return null;
+ }
+ });
+ ResultSet rs = null;
+ String sqlState = "0";
+ try {
+ rs = st.executeQuery("select 1");
+ // Acceptable
+ } catch (SQLException e) {
+ sqlState = e.getSQLState();
+ if (!PSQLState.OBJECT_NOT_IN_STATE.getState().equals(sqlState)
+ && !PSQLState.QUERY_CANCELED.getState().equals(sqlState)) {
+ Assert.assertEquals(
+ "Query is expected to be cancelled via st.close(), got " + e.getMessage(),
+ PSQLState.QUERY_CANCELED.getState(),
+ e.getSQLState()
+ );
+ }
+ } finally {
+ TestUtil.closeQuietly(rs);
+ TestUtil.closeQuietly(st);
+ }
+ Integer val = cnt.get(sqlState);
+ val = (val == null ? 0 : val) + 1;
+ cnt.put(sqlState, val);
+ }
+ System.out.println("[testFastCloses] total counts for each sql state: " + cnt);
+ executor.shutdown();
+ }
+
/**
* Tests that calling {@code java.sql.Statement#close()} from a concurrent thread does not result
* in {@link java.util.ConcurrentModificationException}
*/
+ @Test
public void testSideStatementFinalizers() throws SQLException {
long deadline = System.currentTimeMillis() + TimeUnit.SECONDS.toMillis(2);
@@ -665,6 +966,7 @@ public class StatementTest extends TestCase {
* Test that $JAVASCRIPT$ protects curly braces from JDBC {fn now()} kind of syntax.
* @throws SQLException if something goes wrong
*/
+ @Test
public void testJavascriptFunction() throws SQLException {
String str = " var _modules = {};\n"
+ " var _current_stack = [];\n"
@@ -686,4 +988,48 @@ public class StatementTest extends TestCase {
TestUtil.closeQuietly(ps);
}
}
+
+ @Test
+ public void testUnterminatedDollarQuotes() throws SQLException {
+ ensureSyntaxException("dollar quotes", "CREATE OR REPLACE FUNCTION update_on_change() RETURNS TRIGGER AS $$\n"
+ + "BEGIN");
+ }
+
+ @Test
+ public void testUnterminatedNamedDollarQuotes() throws SQLException {
+ ensureSyntaxException("dollar quotes", "CREATE OR REPLACE FUNCTION update_on_change() RETURNS TRIGGER AS $ABC$\n"
+ + "BEGIN");
+ }
+
+ @Test
+ public void testUnterminatedComment() throws SQLException {
+ ensureSyntaxException("block comment", "CREATE OR REPLACE FUNCTION update_on_change() RETURNS TRIGGER AS /* $$\n"
+ + "BEGIN $$");
+ }
+
+ @Test
+ public void testUnterminatedLiteral() throws SQLException {
+ ensureSyntaxException("string literal", "CREATE OR REPLACE FUNCTION update_on_change() 'RETURNS TRIGGER AS $$\n"
+ + "BEGIN $$");
+ }
+
+ @Test
+ public void testUnterminatedIdentifier() throws SQLException {
+ ensureSyntaxException("string literal", "CREATE OR REPLACE FUNCTION \"update_on_change() RETURNS TRIGGER AS $$\n"
+ + "BEGIN $$");
+ }
+
+ private void ensureSyntaxException(String errorType, String sql) throws SQLException {
+ PreparedStatement ps = null;
+ try {
+ ps = con.prepareStatement(sql);
+ ps.executeUpdate();
+ fail("Query with unterminated " + errorType + " should fail");
+ } catch (SQLException e) {
+ assertEquals("Query should fail with unterminated " + errorType,
+ PSQLState.SYNTAX_ERROR.getState(), e.getSQLState());
+ } finally {
+ TestUtil.closeQuietly(ps);
+ }
+ }
}
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/StringTypeUnspecifiedArrayTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/StringTypeUnspecifiedArrayTest.java
new file mode 100644
index 0000000..81b7bf7
--- /dev/null
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/StringTypeUnspecifiedArrayTest.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 2007, PostgreSQL Global Development Group
+ * See the LICENSE file in the project root for more information.
+ */
+
+package org.postgresql.test.jdbc2;
+
+import org.postgresql.PGProperty;
+import org.postgresql.geometric.PGbox;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+import java.sql.Array;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Properties;
+
+ at RunWith(Parameterized.class)
+public class StringTypeUnspecifiedArrayTest extends BaseTest4 {
+ public StringTypeUnspecifiedArrayTest(BinaryMode binaryMode) {
+ setBinaryMode(binaryMode);
+ }
+
+ @Parameterized.Parameters(name = "binary = {0}")
+ public static Iterable<Object[]> data() {
+ Collection<Object[]> ids = new ArrayList<Object[]>();
+ for (BinaryMode binaryMode : BinaryMode.values()) {
+ ids.add(new Object[]{binaryMode});
+ }
+ return ids;
+ }
+
+ @Override
+ protected void updateProperties(Properties props) {
+ PGProperty.STRING_TYPE.set(props, "unspecified");
+ super.updateProperties(props);
+ }
+
+ @Test
+ public void testCreateArrayWithNonCachedType() throws Exception {
+ PGbox[] in = new PGbox[0];
+ Array a = con.createArrayOf("box", in);
+ Assert.assertEquals(1111, a.getBaseType());
+ }
+}
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/TestACL.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/TestACL.java
index fe689c7..715803f 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/TestACL.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/TestACL.java
@@ -8,22 +8,11 @@ package org.postgresql.test.jdbc2;
import org.postgresql.jdbc.PgConnection;
import org.postgresql.jdbc.PgDatabaseMetaData;
-import junit.framework.TestCase;
+import org.junit.Test;
-public class TestACL extends TestCase {
-
- @Override
- protected void setUp() throws Exception {
- // TODO Auto-generated method stub
- super.setUp();
- }
-
- @Override
- protected void tearDown() throws Exception {
- // TODO Auto-generated method stub
- super.tearDown();
- }
+public class TestACL {
+ @Test
public void testParseACL() {
PgConnection _a = null;
PgDatabaseMetaData a = new PgDatabaseMetaData(_a) {
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/TimeTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/TimeTest.java
index 10f0d64..6441214 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/TimeTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/TimeTest.java
@@ -5,9 +5,15 @@
package org.postgresql.test.jdbc2;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
import org.postgresql.test.TestUtil;
-import junit.framework.TestCase;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
import java.sql.Connection;
import java.sql.PreparedStatement;
@@ -24,21 +30,18 @@ import java.util.TimeZone;
* problems from re-occurring ;-)
*
*/
-public class TimeTest extends TestCase {
-
+public class TimeTest {
private Connection con;
private boolean testSetTime = false;
- public TimeTest(String name) {
- super(name);
- }
-
- protected void setUp() throws Exception {
+ @Before
+ public void setUp() throws Exception {
con = TestUtil.openDB();
TestUtil.createTempTable(con, "testtime", "tm time, tz time with time zone");
}
- protected void tearDown() throws Exception {
+ @After
+ public void tearDown() throws Exception {
TestUtil.dropTable(con, "testtime");
TestUtil.closeDB(con);
}
@@ -51,6 +54,7 @@ public class TimeTest extends TestCase {
*
* Test use of calendar
*/
+ @Test
public void testGetTimeZone() throws Exception {
final Time midnight = new Time(0, 0, 0);
Statement stmt = con.createStatement();
@@ -91,13 +95,8 @@ public class TimeTest extends TestCase {
timestamp = rs.getTimestamp(1);
assertNotNull(timestamp);
- // Pre 1.4 JVM's considered the nanos field completely separate
- // and wouldn't return it in getTime()
- if (TestUtil.haveMinimumJVMVersion("1.4")) {
- assertEquals(100, extractMillis(timestamp.getTime()));
- } else {
- assertEquals(100, extractMillis(timestamp.getTime() + timestamp.getNanos() / 1000000));
- }
+ assertEquals(100, extractMillis(timestamp.getTime()));
+
assertEquals(100000000, timestamp.getNanos());
Time timetz = rs.getTime(2);
@@ -105,14 +104,8 @@ public class TimeTest extends TestCase {
assertEquals(10, extractMillis(timetz.getTime()));
timestamptz = rs.getTimestamp(2);
assertNotNull(timestamptz);
+ assertEquals(10, extractMillis(timestamptz.getTime()));
- // Pre 1.4 JVM's considered the nanos field completely separate
- // and wouldn't return it in getTime()
- if (TestUtil.haveMinimumJVMVersion("1.4")) {
- assertEquals(10, extractMillis(timestamptz.getTime()));
- } else {
- assertEquals(10, extractMillis(timestamptz.getTime() + timestamptz.getNanos() / 1000000));
- }
assertEquals(10000000, timestamptz.getNanos());
assertTrue(rs.next());
@@ -131,6 +124,7 @@ public class TimeTest extends TestCase {
/*
* Tests the time methods in ResultSet
*/
+ @Test
public void testGetTime() throws SQLException {
Statement stmt = con.createStatement();
@@ -154,6 +148,7 @@ public class TimeTest extends TestCase {
/*
* Tests the time methods in PreparedStatement
*/
+ @Test
public void testSetTime() throws SQLException {
PreparedStatement ps = con.prepareStatement(TestUtil.insertSQL("testtime", "?"));
Statement stmt = con.createStatement();
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/TimestampTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/TimestampTest.java
index 0519b4f..c8d9766 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/TimestampTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/TimestampTest.java
@@ -5,14 +5,22 @@
package org.postgresql.test.jdbc2;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+import static org.junit.Assume.assumeTrue;
+
import org.postgresql.PGStatement;
import org.postgresql.core.BaseConnection;
+import org.postgresql.core.ServerVersion;
import org.postgresql.jdbc.TimestampUtils;
import org.postgresql.test.TestUtil;
-import junit.framework.TestCase;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
-import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
@@ -22,7 +30,9 @@ import java.sql.Time;
import java.sql.Timestamp;
import java.sql.Types;
import java.text.SimpleDateFormat;
+import java.util.ArrayList;
import java.util.Calendar;
+import java.util.Collection;
import java.util.GregorianCalendar;
import java.util.TimeZone;
@@ -30,31 +40,42 @@ import java.util.TimeZone;
* Test get/setTimestamp for both timestamp with time zone and timestamp without time zone datatypes
*
*/
-public class TimestampTest extends TestCase {
+ at RunWith(Parameterized.class)
+public class TimestampTest extends BaseTest4 {
- private Connection con;
+ public TimestampTest(BinaryMode binaryMode) {
+ setBinaryMode(binaryMode);
+ }
- public TimestampTest(String name) {
- super(name);
+ @Parameterized.Parameters(name = "binary = {0}")
+ public static Iterable<Object[]> data() {
+ Collection<Object[]> ids = new ArrayList<Object[]>();
+ for (BinaryMode binaryMode : BinaryMode.values()) {
+ ids.add(new Object[]{binaryMode});
+ }
+ return ids;
}
- protected void setUp() throws Exception {
- con = TestUtil.openDB();
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
TestUtil.createTable(con, TSWTZ_TABLE, "ts timestamp with time zone");
TestUtil.createTable(con, TSWOTZ_TABLE, "ts timestamp without time zone");
TestUtil.createTable(con, DATE_TABLE, "ts date");
}
- protected void tearDown() throws Exception {
+ @Override
+ public void tearDown() throws SQLException {
TestUtil.dropTable(con, TSWTZ_TABLE);
TestUtil.dropTable(con, TSWOTZ_TABLE);
TestUtil.dropTable(con, DATE_TABLE);
- TestUtil.closeDB(con);
+ super.tearDown();
}
/**
* Ensure the driver doesn't modify a Calendar that is passed in.
*/
+ @Test
public void testCalendarModification() throws SQLException {
Calendar cal = Calendar.getInstance();
Calendar origCal = (Calendar) cal.clone();
@@ -92,12 +113,13 @@ public class TimestampTest extends TestCase {
stmt.close();
}
+ @Test
public void testInfinity() throws SQLException {
runInfinityTests(TSWTZ_TABLE, PGStatement.DATE_POSITIVE_INFINITY);
runInfinityTests(TSWTZ_TABLE, PGStatement.DATE_NEGATIVE_INFINITY);
runInfinityTests(TSWOTZ_TABLE, PGStatement.DATE_POSITIVE_INFINITY);
runInfinityTests(TSWOTZ_TABLE, PGStatement.DATE_NEGATIVE_INFINITY);
- if (TestUtil.haveMinimumServerVersion(con, "8.4")) {
+ if (TestUtil.haveMinimumServerVersion(con, ServerVersion.v8_4)) {
runInfinityTests(DATE_TABLE, PGStatement.DATE_POSITIVE_INFINITY);
runInfinityTests(DATE_TABLE, PGStatement.DATE_NEGATIVE_INFINITY);
}
@@ -151,7 +173,10 @@ public class TimestampTest extends TestCase {
* Tests the timestamp methods in ResultSet on timestamp with time zone we insert a known string
* value (don't use setTimestamp) then see that we get back the same value from getTimestamp
*/
+ @Test
public void testGetTimestampWTZ() throws SQLException {
+ assumeTrue(TestUtil.haveIntegerDateTimes(con));
+
Statement stmt = con.createStatement();
TimestampUtils tsu = ((BaseConnection) con).getTimestampUtils();
@@ -211,7 +236,10 @@ public class TimestampTest extends TestCase {
* using setTimestamp then see that we get back the same value from getTimestamp (which we know
* works as it was tested independently of setTimestamp
*/
+ @Test
public void testSetTimestampWTZ() throws SQLException {
+ assumeTrue(TestUtil.haveIntegerDateTimes(con));
+
Statement stmt = con.createStatement();
PreparedStatement pstmt = con.prepareStatement(TestUtil.insertSQL(TSWTZ_TABLE, "?"));
@@ -280,7 +308,12 @@ public class TimestampTest extends TestCase {
* string value (don't use setTimestamp) then see that we get back the same value from
* getTimestamp
*/
+ @Test
public void testGetTimestampWOTZ() throws SQLException {
+ assumeTrue(TestUtil.haveIntegerDateTimes(con));
+ //Refer to #896
+ assumeMinimumServerVersion(ServerVersion.v8_4);
+
Statement stmt = con.createStatement();
TimestampUtils tsu = ((BaseConnection) con).getTimestampUtils();
@@ -298,6 +331,13 @@ public class TimestampTest extends TestCase {
assertEquals(1,
stmt.executeUpdate(TestUtil.insertSQL(TSWOTZ_TABLE, "'" + TS6WOTZ_PGFORMAT + "'")));
assertEquals(1,
+ stmt.executeUpdate(TestUtil.insertSQL(TSWOTZ_TABLE, "'" + TS7WOTZ_PGFORMAT + "'")));
+ assertEquals(1,
+ stmt.executeUpdate(TestUtil.insertSQL(TSWOTZ_TABLE, "'" + TS8WOTZ_PGFORMAT + "'")));
+ assertEquals(1,
+ stmt.executeUpdate(TestUtil.insertSQL(TSWOTZ_TABLE, "'" + TS9WOTZ_PGFORMAT + "'")));
+
+ assertEquals(1,
stmt.executeUpdate(TestUtil.insertSQL(TSWOTZ_TABLE, "'" + TS1WOTZ_PGFORMAT + "'")));
assertEquals(1,
stmt.executeUpdate(TestUtil.insertSQL(TSWOTZ_TABLE, "'" + TS2WOTZ_PGFORMAT + "'")));
@@ -310,6 +350,13 @@ public class TimestampTest extends TestCase {
assertEquals(1,
stmt.executeUpdate(TestUtil.insertSQL(TSWOTZ_TABLE, "'" + TS6WOTZ_PGFORMAT + "'")));
assertEquals(1,
+ stmt.executeUpdate(TestUtil.insertSQL(TSWOTZ_TABLE, "'" + TS7WOTZ_PGFORMAT + "'")));
+ assertEquals(1,
+ stmt.executeUpdate(TestUtil.insertSQL(TSWOTZ_TABLE, "'" + TS8WOTZ_PGFORMAT + "'")));
+ assertEquals(1,
+ stmt.executeUpdate(TestUtil.insertSQL(TSWOTZ_TABLE, "'" + TS9WOTZ_PGFORMAT + "'")));
+
+ assertEquals(1,
stmt.executeUpdate(TestUtil.insertSQL(TSWOTZ_TABLE, "'" + TS1WOTZ_PGFORMAT + "'")));
assertEquals(1,
stmt.executeUpdate(TestUtil.insertSQL(TSWOTZ_TABLE, "'" + TS2WOTZ_PGFORMAT + "'")));
@@ -321,6 +368,13 @@ public class TimestampTest extends TestCase {
stmt.executeUpdate(TestUtil.insertSQL(TSWOTZ_TABLE, "'" + TS5WOTZ_PGFORMAT + "'")));
assertEquals(1,
stmt.executeUpdate(TestUtil.insertSQL(TSWOTZ_TABLE, "'" + TS6WOTZ_PGFORMAT + "'")));
+ assertEquals(1,
+ stmt.executeUpdate(TestUtil.insertSQL(TSWOTZ_TABLE, "'" + TS7WOTZ_PGFORMAT + "'")));
+ assertEquals(1,
+ stmt.executeUpdate(TestUtil.insertSQL(TSWOTZ_TABLE, "'" + TS8WOTZ_PGFORMAT + "'")));
+ assertEquals(1,
+ stmt.executeUpdate(TestUtil.insertSQL(TSWOTZ_TABLE, "'" + TS9WOTZ_PGFORMAT + "'")));
+
assertEquals(1, stmt.executeUpdate(TestUtil.insertSQL(TSWOTZ_TABLE,
"'" + tsu.toString(null, new java.sql.Timestamp(tmpDate1WOTZ.getTime())) + "'")));
assertEquals(1, stmt.executeUpdate(TestUtil.insertSQL(TSWOTZ_TABLE,
@@ -334,6 +388,11 @@ public class TimestampTest extends TestCase {
assertEquals(1, stmt.executeUpdate(TestUtil.insertSQL(TSWOTZ_TABLE,
"'" + tsu.toString(null, new java.sql.Timestamp(tmpDate6WOTZ.getTime())) + "'")));
assertEquals(1, stmt.executeUpdate(TestUtil.insertSQL(TSWOTZ_TABLE,
+ "'" + tsu.toString(null, new java.sql.Timestamp(tmpDate7WOTZ.getTime())) + "'")));
+ assertEquals(1, stmt.executeUpdate(TestUtil.insertSQL(TSWOTZ_TABLE,
+ "'" + tsu.toString(null, new java.sql.Timestamp(tmpDate8WOTZ.getTime())) + "'")));
+
+ assertEquals(1, stmt.executeUpdate(TestUtil.insertSQL(TSWOTZ_TABLE,
"'" + tsu.toString(null, new java.sql.Timestamp(tmpTime1WOTZ.getTime())) + "'")));
assertEquals(1, stmt.executeUpdate(TestUtil.insertSQL(TSWOTZ_TABLE,
"'" + tsu.toString(null, new java.sql.Timestamp(tmpTime2WOTZ.getTime())) + "'")));
@@ -345,11 +404,15 @@ public class TimestampTest extends TestCase {
"'" + tsu.toString(null, new java.sql.Timestamp(tmpTime5WOTZ.getTime())) + "'")));
assertEquals(1, stmt.executeUpdate(TestUtil.insertSQL(TSWOTZ_TABLE,
"'" + tsu.toString(null, new java.sql.Timestamp(tmpTime6WOTZ.getTime())) + "'")));
+ assertEquals(1, stmt.executeUpdate(TestUtil.insertSQL(TSWOTZ_TABLE,
+ "'" + tsu.toString(null, new java.sql.Timestamp(tmpTime7WOTZ.getTime())) + "'")));
+ assertEquals(1, stmt.executeUpdate(TestUtil.insertSQL(TSWOTZ_TABLE,
+ "'" + tsu.toString(null, new java.sql.Timestamp(tmpTime8WOTZ.getTime())) + "'")));
// Fall through helper
timestampTestWOTZ();
- assertEquals(30, stmt.executeUpdate("DELETE FROM " + TSWOTZ_TABLE));
+ assertEquals(43, stmt.executeUpdate("DELETE FROM " + TSWOTZ_TABLE));
stmt.close();
}
@@ -359,7 +422,12 @@ public class TimestampTest extends TestCase {
* value using setTimestamp then see that we get back the same value from getTimestamp (which we
* know works as it was tested independently of setTimestamp
*/
+ @Test
public void testSetTimestampWOTZ() throws SQLException {
+ assumeTrue(TestUtil.haveIntegerDateTimes(con));
+ //Refer to #896
+ assumeMinimumServerVersion(ServerVersion.v8_4);
+
Statement stmt = con.createStatement();
PreparedStatement pstmt = con.prepareStatement(TestUtil.insertSQL(TSWOTZ_TABLE, "?"));
@@ -381,6 +449,15 @@ public class TimestampTest extends TestCase {
pstmt.setTimestamp(1, TS6WOTZ);
assertEquals(1, pstmt.executeUpdate());
+ pstmt.setTimestamp(1, TS7WOTZ);
+ assertEquals(1, pstmt.executeUpdate());
+
+ pstmt.setTimestamp(1, TS8WOTZ);
+ assertEquals(1, pstmt.executeUpdate());
+
+ pstmt.setTimestamp(1, TS9WOTZ);
+ assertEquals(1, pstmt.executeUpdate());
+
// With java.sql.Timestamp
pstmt.setObject(1, TS1WOTZ, Types.TIMESTAMP);
assertEquals(1, pstmt.executeUpdate());
@@ -394,6 +471,12 @@ public class TimestampTest extends TestCase {
assertEquals(1, pstmt.executeUpdate());
pstmt.setObject(1, TS6WOTZ, Types.TIMESTAMP);
assertEquals(1, pstmt.executeUpdate());
+ pstmt.setObject(1, TS7WOTZ, Types.TIMESTAMP);
+ assertEquals(1, pstmt.executeUpdate());
+ pstmt.setObject(1, TS8WOTZ, Types.TIMESTAMP);
+ assertEquals(1, pstmt.executeUpdate());
+ pstmt.setObject(1, TS9WOTZ, Types.TIMESTAMP);
+ assertEquals(1, pstmt.executeUpdate());
// With Strings
pstmt.setObject(1, TS1WOTZ_PGFORMAT, Types.TIMESTAMP);
@@ -408,6 +491,12 @@ public class TimestampTest extends TestCase {
assertEquals(1, pstmt.executeUpdate());
pstmt.setObject(1, TS6WOTZ_PGFORMAT, Types.TIMESTAMP);
assertEquals(1, pstmt.executeUpdate());
+ pstmt.setObject(1, TS7WOTZ_PGFORMAT, Types.TIMESTAMP);
+ assertEquals(1, pstmt.executeUpdate());
+ pstmt.setObject(1, TS8WOTZ_PGFORMAT, Types.TIMESTAMP);
+ assertEquals(1, pstmt.executeUpdate());
+ pstmt.setObject(1, TS9WOTZ_PGFORMAT, Types.TIMESTAMP);
+ assertEquals(1, pstmt.executeUpdate());
// With java.sql.Date
pstmt.setObject(1, tmpDate1WOTZ, Types.TIMESTAMP);
@@ -422,6 +511,10 @@ public class TimestampTest extends TestCase {
assertEquals(1, pstmt.executeUpdate());
pstmt.setObject(1, tmpDate6WOTZ, Types.TIMESTAMP);
assertEquals(1, pstmt.executeUpdate());
+ pstmt.setObject(1, tmpDate7WOTZ, Types.TIMESTAMP);
+ assertEquals(1, pstmt.executeUpdate());
+ pstmt.setObject(1, tmpDate8WOTZ, Types.TIMESTAMP);
+ assertEquals(1, pstmt.executeUpdate());
// With java.sql.Time
pstmt.setObject(1, tmpTime1WOTZ, Types.TIMESTAMP);
@@ -436,10 +529,14 @@ public class TimestampTest extends TestCase {
assertEquals(1, pstmt.executeUpdate());
pstmt.setObject(1, tmpTime6WOTZ, Types.TIMESTAMP);
assertEquals(1, pstmt.executeUpdate());
+ pstmt.setObject(1, tmpTime7WOTZ, Types.TIMESTAMP);
+ assertEquals(1, pstmt.executeUpdate());
+ pstmt.setObject(1, tmpTime8WOTZ, Types.TIMESTAMP);
+ assertEquals(1, pstmt.executeUpdate());
// Fall through helper
timestampTestWOTZ();
- assertEquals(30, stmt.executeUpdate("DELETE FROM " + TSWOTZ_TABLE));
+ assertEquals(43, stmt.executeUpdate("DELETE FROM " + TSWOTZ_TABLE));
pstmt.close();
stmt.close();
@@ -531,42 +628,93 @@ public class TimestampTest extends TestCase {
*/
private void timestampTestWOTZ() throws SQLException {
Statement stmt = con.createStatement();
- ResultSet rs;
java.sql.Timestamp t;
+ String tString;
- rs = stmt.executeQuery("select ts from " + TSWOTZ_TABLE); // removed the order by ts
+ ResultSet rs = stmt.executeQuery("select ts from " + TSWOTZ_TABLE); // removed the order by ts
assertNotNull(rs);
for (int i = 0; i < 3; i++) {
assertTrue(rs.next());
t = rs.getTimestamp(1);
assertNotNull(t);
- assertTrue(t.equals(TS1WOTZ));
+ assertEquals(TS1WOTZ, t);
+
+ tString = rs.getString(1);
+ assertNotNull(tString);
+ assertEquals(TS1WOTZ_PGFORMAT, tString);
assertTrue(rs.next());
t = rs.getTimestamp(1);
assertNotNull(t);
- assertTrue(t.equals(TS2WOTZ));
+ assertEquals(TS2WOTZ, t);
+
+ tString = rs.getString(1);
+ assertNotNull(tString);
+ assertEquals(TS2WOTZ_PGFORMAT, tString);
assertTrue(rs.next());
t = rs.getTimestamp(1);
assertNotNull(t);
- assertTrue(t.equals(TS3WOTZ));
+ assertEquals(TS3WOTZ, t);
+
+ tString = rs.getString(1);
+ assertNotNull(tString);
+ assertEquals(TS3WOTZ_PGFORMAT, tString);
assertTrue(rs.next());
t = rs.getTimestamp(1);
assertNotNull(t);
- assertTrue(t.equals(TS4WOTZ));
+ assertEquals(TS4WOTZ, t);
+
+ tString = rs.getString(1);
+ assertNotNull(tString);
+ assertEquals(TS4WOTZ_PGFORMAT, tString);
assertTrue(rs.next());
t = rs.getTimestamp(1);
assertNotNull(t);
- assertTrue(t.equals(TS5WOTZ));
+ assertEquals(TS5WOTZ, t);
+
+ tString = rs.getString(1);
+ assertNotNull(tString);
+ assertEquals(TS5WOTZ_PGFORMAT, tString);
assertTrue(rs.next());
t = rs.getTimestamp(1);
assertNotNull(t);
- assertTrue(t.equals(TS6WOTZ));
+ assertEquals(TS6WOTZ, t);
+
+ tString = rs.getString(1);
+ assertNotNull(tString);
+ assertEquals(TS6WOTZ_PGFORMAT, tString);
+
+ assertTrue(rs.next());
+ t = rs.getTimestamp(1);
+ assertNotNull(t);
+ assertEquals(TS7WOTZ, t);
+
+ tString = rs.getString(1);
+ assertNotNull(tString);
+ assertEquals(TS7WOTZ_PGFORMAT, tString);
+
+ assertTrue(rs.next());
+ t = rs.getTimestamp(1);
+ assertNotNull(t);
+ assertEquals(TS8WOTZ, t);
+
+ tString = rs.getString(1);
+ assertNotNull(tString);
+ assertEquals(TS8WOTZ_PGFORMAT, tString);
+
+ assertTrue(rs.next());
+ t = rs.getTimestamp(1);
+ assertNotNull(t);
+ assertEquals(TS9WOTZ_ROUNDED, t);
+
+ tString = rs.getString(1);
+ assertNotNull(tString);
+ assertEquals(TS9WOTZ_ROUNDED_PGFORMAT, tString);
}
// Testing for Date
@@ -600,6 +748,16 @@ public class TimestampTest extends TestCase {
assertNotNull(t);
assertEquals(tmpDate6WOTZ.getTime(), t.getTime());
+ assertTrue(rs.next());
+ t = rs.getTimestamp(1);
+ assertNotNull(t);
+ assertEquals(tmpDate7WOTZ.getTime(), t.getTime());
+
+ assertTrue(rs.next());
+ t = rs.getTimestamp(1);
+ assertNotNull(t);
+ assertEquals(tmpDate8WOTZ.getTime(), t.getTime());
+
// Testing for Time
assertTrue(rs.next());
t = rs.getTimestamp(1);
@@ -631,6 +789,16 @@ public class TimestampTest extends TestCase {
assertNotNull(t);
assertEquals(tmpTime6WOTZ.getTime(), t.getTime());
+ assertTrue(rs.next());
+ t = rs.getTimestamp(1);
+ assertNotNull(t);
+ assertEquals(tmpTime7WOTZ.getTime(), t.getTime());
+
+ assertTrue(rs.next());
+ t = rs.getTimestamp(1);
+ assertNotNull(t);
+ assertEquals(tmpTime8WOTZ.getTime(), t.getTime());
+
assertTrue(!rs.next()); // end of table. Fail if more entries exist.
rs.close();
@@ -706,6 +874,21 @@ public class TimestampTest extends TestCase {
new Timestamp(PGStatement.DATE_POSITIVE_INFINITY);
private static final String TS6WOTZ_PGFORMAT = "infinity";
+ private static final java.sql.Timestamp TS7WOTZ =
+ getTimestamp(2000, 7, 7, 15, 0, 0, 0, null);
+ private static final String TS7WOTZ_PGFORMAT = "2000-07-07 15:00:00";
+
+ private static final java.sql.Timestamp TS8WOTZ =
+ getTimestamp(2000, 7, 7, 15, 0, 0, 20400000, null);
+ private static final String TS8WOTZ_PGFORMAT = "2000-07-07 15:00:00.0204";
+
+ private static final java.sql.Timestamp TS9WOTZ =
+ getTimestamp(2000, 2, 7, 15, 0, 0, 789, null);
+ private static final String TS9WOTZ_PGFORMAT = "2000-02-07 15:00:00.000000789";
+ private static final java.sql.Timestamp TS9WOTZ_ROUNDED =
+ getTimestamp(2000, 2, 7, 15, 0, 0, 1000, null);
+ private static final String TS9WOTZ_ROUNDED_PGFORMAT = "2000-02-07 15:00:00.000001";
+
private static final String TSWTZ_TABLE = "testtimestampwtz";
private static final String TSWOTZ_TABLE = "testtimestampwotz";
private static final String DATE_TABLE = "testtimestampdate";
@@ -731,6 +914,9 @@ public class TimestampTest extends TestCase {
private static final java.sql.Date tmpTime5WOTZ = new java.sql.Date(TS5WOTZ.getTime());
private static final java.sql.Date tmpDate6WOTZ = new java.sql.Date(TS6WOTZ.getTime());
private static final java.sql.Date tmpTime6WOTZ = new java.sql.Date(TS6WOTZ.getTime());
-
+ private static final java.sql.Date tmpDate7WOTZ = new java.sql.Date(TS7WOTZ.getTime());
+ private static final java.sql.Time tmpTime7WOTZ = new java.sql.Time(TS7WOTZ.getTime());
+ private static final java.sql.Date tmpDate8WOTZ = new java.sql.Date(TS8WOTZ.getTime());
+ private static final java.sql.Time tmpTime8WOTZ = new java.sql.Time(TS8WOTZ.getTime());
}
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/TimezoneTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/TimezoneTest.java
index a470777..e660f05 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/TimezoneTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/TimezoneTest.java
@@ -5,10 +5,16 @@
package org.postgresql.test.jdbc2;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
import org.postgresql.PGProperty;
import org.postgresql.test.TestUtil;
-import junit.framework.TestCase;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
import java.sql.Connection;
import java.sql.Date;
@@ -46,7 +52,7 @@ import java.util.TimeZone;
*
* (this matches what we must support per JDBC 3.0, tables B-5 and B-6)
*/
-public class TimezoneTest extends TestCase {
+public class TimezoneTest {
private static final int DAY = 24 * 3600 * 1000;
private static final TimeZone saveTZ = TimeZone.getDefault();
private static final int PREPARE_THRESHOLD = 2;
@@ -65,12 +71,7 @@ public class TimezoneTest extends TestCase {
private Calendar cGMT05;
private Calendar cGMT13;
- private boolean min73;
- private boolean min74;
-
- public TimezoneTest(String name) {
- super(name);
-
+ public TimezoneTest() {
TimeZone UTC = TimeZone.getTimeZone("UTC"); // +0000 always
TimeZone GMT03 = TimeZone.getTimeZone("GMT+03"); // +0300 always
TimeZone GMT05 = TimeZone.getTimeZone("GMT-05"); // -0500 always
@@ -82,7 +83,8 @@ public class TimezoneTest extends TestCase {
cGMT13 = Calendar.getInstance(GMT13);
}
- protected void setUp() throws Exception {
+ @Before
+ public void setUp() throws Exception {
// We must change the default TZ before establishing the connection.
// Arbitrary timezone that doesn't match our test timezones
TimeZone.setDefault(TimeZone.getTimeZone("GMT+01"));
@@ -95,9 +97,6 @@ public class TimezoneTest extends TestCase {
// so will produce +03 timestamptz output
con.createStatement().executeUpdate("set timezone = 'gmt-3'");
- min73 = TestUtil.haveMinimumServerVersion(con, "7.3");
- min74 = TestUtil.haveMinimumServerVersion(con, "7.4");
-
// System.err.println("++++++ TESTS START (" + getName() + ") ++++++");
}
@@ -107,7 +106,8 @@ public class TimezoneTest extends TestCase {
con = TestUtil.openDB(p);
}
- protected void tearDown() throws Exception {
+ @After
+ public void tearDown() throws Exception {
// System.err.println("++++++ TESTS END (" + getName() + ") ++++++");
TimeZone.setDefault(saveTZ);
@@ -115,6 +115,7 @@ public class TimezoneTest extends TestCase {
TestUtil.closeDB(con);
}
+ @Test
public void testGetTimestamp() throws Exception {
con.createStatement().executeUpdate(
"INSERT INTO testtimezone(tstz,ts,t,tz,d) VALUES('2005-01-01 15:00:00 +0300', '2005-01-01 15:00:00', '15:00:00', '15:00:00 +0300', '2005-01-01')");
@@ -188,10 +189,10 @@ public class TimezoneTest extends TestCase {
// 1970-01-01 15:00:00 +0300 -> 1970-01-01 07:00:00 -0500
assertEquals(43200000L, ts.getTime());
ts = rs.getTimestamp(4, cGMT13);
- // 1970-01-01 15:00:00 +0300 -> 1970-01-02 01:00:00 +1300 (CHECK ME)
- assertEquals(-43200000L, ts.getTime());
- str = rs.getString(3);
- assertEquals("timetz -> getString" + format, "15:00:00", str);
+ // 1970-01-01 15:00:00 +0300 -> 1970-01-02 01:00:00 +1300
+ assertEquals(43200000L, ts.getTime());
+ str = rs.getString(4);
+ assertEquals("timetz -> getString" + format, "15:00:00+03", str);
// date: 2005-01-01
ts = rs.getTimestamp(5);
@@ -212,6 +213,7 @@ public class TimezoneTest extends TestCase {
}
}
+ @Test
public void testGetDate() throws Exception {
con.createStatement().executeUpdate(
"INSERT INTO testtimezone(tstz,ts,d) VALUES('2005-01-01 15:00:00 +0300', '2005-01-01 15:00:00', '2005-01-01')");
@@ -267,8 +269,8 @@ public class TimezoneTest extends TestCase {
}
}
+ @Test
public void testGetTime() throws Exception {
-
con.createStatement().executeUpdate(
"INSERT INTO testtimezone(tstz,ts,t,tz) VALUES('2005-01-01 15:00:00 +0300', '2005-01-01 15:00:00', '15:00:00', '15:00:00 +0300')");
@@ -297,7 +299,7 @@ public class TimezoneTest extends TestCase {
assertEquals(43200000L, t.getTime());
t = rs.getTime(1, cGMT13);
// 2005-01-02 01:00:00 +1300 -> 1970-01-01 01:00:00 +1300
- assertEquals(-43200000L, t.getTime());
+ assertEquals(43200000L, t.getTime());
// timestamp: 2005-01-01 15:00:00
t = rs.getTime(2);
@@ -333,7 +335,7 @@ public class TimezoneTest extends TestCase {
t = rs.getTime(4, cGMT05);
assertEquals(43200000L, t.getTime()); // 1970-01-01 07:00:00 -0500
t = rs.getTime(4, cGMT13);
- assertEquals(-43200000L, t.getTime()); // 1970-01-01 01:00:00 +1300
+ assertEquals(43200000L, t.getTime()); // 1970-01-01 01:00:00 +1300
rs.close();
}
}
@@ -343,12 +345,9 @@ public class TimezoneTest extends TestCase {
* putting tons of conditionals in that test makes it largely unreadable. The time data type does
* not accept timestamp with time zone style input on these servers.
*/
+ @Test
public void testSetTimestampOnTime() throws Exception {
// Pre-7.4 servers cannot convert timestamps with timezones to times.
- if (!min74) {
- return;
- }
-
for (int i = 0; i < PREPARE_THRESHOLD; i++) {
con.createStatement().execute("delete from testtimezone");
PreparedStatement insertTimestamp =
@@ -378,12 +377,10 @@ public class TimezoneTest extends TestCase {
insertTimestamp.setTimestamp(2, instant, cGMT05); // 07:00:00
insertTimestamp.executeUpdate();
- if (min73) {
- // +1300
- insertTimestamp.setInt(1, seq++);
- insertTimestamp.setTimestamp(2, instant, cGMT13); // 01:00:00
- insertTimestamp.executeUpdate();
- }
+ // +1300
+ insertTimestamp.setInt(1, seq++);
+ insertTimestamp.setTimestamp(2, instant, cGMT13); // 01:00:00
+ insertTimestamp.executeUpdate();
insertTimestamp.close();
@@ -422,6 +419,7 @@ public class TimezoneTest extends TestCase {
}
+ @Test
public void testSetTimestamp() throws Exception {
for (int i = 0; i < PREPARE_THRESHOLD; i++) {
con.createStatement().execute("delete from testtimezone");
@@ -474,15 +472,13 @@ public class TimezoneTest extends TestCase {
insertTimestamp.setTimestamp(5, instant, cGMT05); // 2005-01-01
insertTimestamp.executeUpdate();
- if (min73) {
- // +1300
- insertTimestamp.setInt(1, seq++);
- insertTimestamp.setTimestamp(2, instant, cGMT13); // 2005-01-02 01:00:00 +1300
- insertTimestamp.setTimestamp(3, instant, cGMT13); // 2005-01-02 01:00:00
- insertTimestamp.setTimestamp(4, instant, cGMT13); // 01:00:00 +1300
- insertTimestamp.setTimestamp(5, instant, cGMT13); // 2005-01-02
- insertTimestamp.executeUpdate();
- }
+ // +1300
+ insertTimestamp.setInt(1, seq++);
+ insertTimestamp.setTimestamp(2, instant, cGMT13); // 2005-01-02 01:00:00 +1300
+ insertTimestamp.setTimestamp(3, instant, cGMT13); // 2005-01-02 01:00:00
+ insertTimestamp.setTimestamp(4, instant, cGMT13); // 01:00:00 +1300
+ insertTimestamp.setTimestamp(5, instant, cGMT13); // 2005-01-02
+ insertTimestamp.executeUpdate();
insertTimestamp.close();
@@ -538,20 +534,19 @@ public class TimezoneTest extends TestCase {
assertEquals(instantTime, rs.getTimestamp(4, cGMT05));
assertEquals(instantDateGMT05, rs.getTimestamp(5, cGMT05));
- if (min73) {
- assertTrue(rs.next());
- assertEquals(seq++, rs.getInt(1));
- assertEquals(instant, rs.getTimestamp(2, cGMT13));
- assertEquals(instant, rs.getTimestamp(3, cGMT13));
- assertEquals(normalizeTimeOfDayPart(instantTime, cGMT13), rs.getTimestamp(4, cGMT13));
- assertEquals(instantDateGMT13, rs.getTimestamp(5, cGMT13));
- }
+ assertTrue(rs.next());
+ assertEquals(seq++, rs.getInt(1));
+ assertEquals(instant, rs.getTimestamp(2, cGMT13));
+ assertEquals(instant, rs.getTimestamp(3, cGMT13));
+ assertEquals(normalizeTimeOfDayPart(instantTime, cGMT13), rs.getTimestamp(4, cGMT13));
+ assertEquals(instantDateGMT13, rs.getTimestamp(5, cGMT13));
assertTrue(!rs.next());
ps.close();
}
}
+ @Test
public void testSetDate() throws Exception {
for (int i = 0; i < PREPARE_THRESHOLD; i++) {
con.createStatement().execute("delete from testtimezone");
@@ -598,15 +593,13 @@ public class TimezoneTest extends TestCase {
insertTimestamp.setDate(4, dGMT05, cGMT05); // 2005-01-01
insertTimestamp.executeUpdate();
- if (min73) {
- // +1300
- dGMT13 = new Date(1104490800000L); // 2005-01-01 00:00:00 +1300
- insertTimestamp.setInt(1, seq++);
- insertTimestamp.setDate(2, dGMT13, cGMT13); // 2005-01-01 00:00:00 +1300
- insertTimestamp.setDate(3, dGMT13, cGMT13); // 2005-01-01 00:00:00
- insertTimestamp.setDate(4, dGMT13, cGMT13); // 2005-01-01
- insertTimestamp.executeUpdate();
- }
+ // +1300
+ dGMT13 = new Date(1104490800000L); // 2005-01-01 00:00:00 +1300
+ insertTimestamp.setInt(1, seq++);
+ insertTimestamp.setDate(2, dGMT13, cGMT13); // 2005-01-01 00:00:00 +1300
+ insertTimestamp.setDate(3, dGMT13, cGMT13); // 2005-01-01 00:00:00
+ insertTimestamp.setDate(4, dGMT13, cGMT13); // 2005-01-01
+ insertTimestamp.executeUpdate();
insertTimestamp.close();
@@ -652,26 +645,19 @@ public class TimezoneTest extends TestCase {
assertEquals(dGMT05, rs.getDate(3, cGMT05));
assertEquals(dGMT05, rs.getDate(4, cGMT05));
- if (min73) {
- assertTrue(rs.next());
- assertEquals(seq++, rs.getInt(1));
- assertEquals(dGMT13, rs.getDate(2, cGMT13));
- assertEquals(dGMT13, rs.getDate(3, cGMT13));
- assertEquals(dGMT13, rs.getDate(4, cGMT13));
- }
+ assertTrue(rs.next());
+ assertEquals(seq++, rs.getInt(1));
+ assertEquals(dGMT13, rs.getDate(2, cGMT13));
+ assertEquals(dGMT13, rs.getDate(3, cGMT13));
+ assertEquals(dGMT13, rs.getDate(4, cGMT13));
assertTrue(!rs.next());
ps.close();
}
}
+ @Test
public void testSetTime() throws Exception {
- if (!min74) {
- // We can't do timezones properly for time/timetz values before 7.4
- System.err.println("Skipping TimezoneTest.testSetTime on a pre-7.4 server");
- return;
- }
-
for (int i = 0; i < PREPARE_THRESHOLD; i++) {
con.createStatement().execute("delete from testtimezone");
PreparedStatement insertTimestamp =
@@ -746,28 +732,29 @@ public class TimezoneTest extends TestCase {
assertTrue(rs.next());
assertEquals(seq++, rs.getInt(1));
assertEquals(tUTC, rs.getTime(2, cUTC));
- assertEquals(tUTC, rs.getTime(2, cUTC));
+ assertEquals(tUTC, rs.getTime(3, cUTC));
assertTrue(rs.next());
assertEquals(seq++, rs.getInt(1));
assertEquals(tGMT03, rs.getTime(2, cGMT03));
- assertEquals(tGMT03, rs.getTime(2, cGMT03));
+ assertEquals(tGMT03, rs.getTime(3, cGMT03));
assertTrue(rs.next());
assertEquals(seq++, rs.getInt(1));
assertEquals(tGMT05, rs.getTime(2, cGMT05));
- assertEquals(tGMT05, rs.getTime(2, cGMT05));
+ assertEquals(tGMT05, rs.getTime(3, cGMT05));
assertTrue(rs.next());
assertEquals(seq++, rs.getInt(1));
assertEquals(tGMT13, rs.getTime(2, cGMT13));
- assertEquals(tGMT13, rs.getTime(2, cGMT13));
+ assertEquals(tGMT13, rs.getTime(3, cGMT13));
assertTrue(!rs.next());
ps.close();
}
}
+ @Test
public void testHalfHourTimezone() throws Exception {
Statement stmt = con.createStatement();
stmt.execute("SET TimeZone = 'GMT+3:30'");
@@ -780,11 +767,8 @@ public class TimezoneTest extends TestCase {
}
}
+ @Test
public void testTimezoneWithSeconds() throws SQLException {
- if (!TestUtil.haveMinimumServerVersion(con, "8.2")) {
- return;
- }
-
Statement stmt = con.createStatement();
stmt.execute("SET TimeZone = 'Europe/Paris'");
for (int i = 0; i < PREPARE_THRESHOLD; i++) {
@@ -798,32 +782,39 @@ public class TimezoneTest extends TestCase {
}
}
+ @Test
public void testLocalTimestampsInNonDSTZones() throws Exception {
for (int i = -12; i <= 13; i++) {
localTimestamps(String.format("GMT%02d", i));
}
}
+ @Test
public void testLocalTimestampsInAfricaCasablanca() throws Exception {
localTimestamps("Africa/Casablanca"); // It is something like GMT+0..GMT+1
}
+ @Test
public void testLocalTimestampsInAtlanticAzores() throws Exception {
localTimestamps("Atlantic/Azores"); // It is something like GMT-1..GMT+0
}
+ @Test
public void testLocalTimestampsInEuropeMoscow() throws Exception {
localTimestamps("Europe/Moscow"); // It is something like GMT+3..GMT+4 for 2000s
}
+ @Test
public void testLocalTimestampsInPacificApia() throws Exception {
localTimestamps("Pacific/Apia"); // It is something like GMT+13..GMT+14
}
+ @Test
public void testLocalTimestampsInPacificNiue() throws Exception {
localTimestamps("Pacific/Niue"); // It is something like GMT-11..GMT-11
}
+ @Test
public void testLocalTimestampsInAmericaAdak() throws Exception {
localTimestamps("America/Adak"); // It is something like GMT-10..GMT-9
}
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/TypeCacheDLLStressTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/TypeCacheDLLStressTest.java
index 62f9afd..1402f8a 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/TypeCacheDLLStressTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/TypeCacheDLLStressTest.java
@@ -24,7 +24,7 @@ import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
public class TypeCacheDLLStressTest extends BaseTest4 {
- private final static int DURATION = Integer.getInteger("TypeCacheDLLStressTest.DURATION", 5);
+ private static final int DURATION = Integer.getInteger("TypeCacheDLLStressTest.DURATION", 5);
private Connection con2;
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/UpdateableResultTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/UpdateableResultTest.java
index 3be137b..3463160 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/UpdateableResultTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/UpdateableResultTest.java
@@ -5,14 +5,18 @@
package org.postgresql.test.jdbc2;
-import static junit.framework.TestCase.assertNull;
+import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
+import org.postgresql.PGConnection;
import org.postgresql.test.TestUtil;
+import org.junit.Assert;
+import org.junit.Assume;
import org.junit.Test;
import java.io.ByteArrayInputStream;
@@ -25,7 +29,6 @@ import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Timestamp;
import java.sql.Types;
-import java.util.Arrays;
import java.util.TimeZone;
public class UpdateableResultTest extends BaseTest4 {
@@ -244,21 +247,21 @@ public class UpdateableResultTest extends BaseTest4 {
assertEquals(2, rs.getInt(1));
assertEquals(string, rs.getString(2));
assertEquals(string, rs.getString(3));
- assertTrue(Arrays.equals(bytes, rs.getBytes(4)));
+ assertArrayEquals(bytes, rs.getBytes(4));
rs.refreshRow();
assertEquals(2, rs.getInt(1));
assertEquals(string, rs.getString(2));
assertEquals(string, rs.getString(3));
- assertTrue(Arrays.equals(bytes, rs.getBytes(4)));
+ assertArrayEquals(bytes, rs.getBytes(4));
rs.next();
assertEquals(3, rs.getInt(1));
assertEquals(string, rs.getString(2));
assertEquals(string, rs.getString(3));
- assertTrue(Arrays.equals(bytes, rs.getBytes(4)));
+ assertArrayEquals(bytes, rs.getBytes(4));
rs.close();
stmt.close();
@@ -474,7 +477,7 @@ public class UpdateableResultTest extends BaseTest4 {
Array arr = rs.getArray(2);
assertEquals(Types.INTEGER, arr.getBaseType());
- Integer intarr[] = (Integer[]) arr.getArray();
+ Integer[] intarr = (Integer[]) arr.getArray();
assertEquals(3, intarr.length);
assertEquals(1, intarr[0].intValue());
assertEquals(2, intarr[1].intValue());
@@ -529,4 +532,49 @@ public class UpdateableResultTest extends BaseTest4 {
st.close();
}
+ @Test
+ public void simpleAndUpdateableSameQuery() throws Exception {
+ PGConnection unwrap = con.unwrap(PGConnection.class);
+ Assume.assumeNotNull(unwrap);
+ int prepareThreshold = unwrap.getPrepareThreshold();
+ String sql = "select * from second where id1=?";
+ for (int i = 0; i <= prepareThreshold; i++) {
+ PreparedStatement ps = null;
+ ResultSet rs = null;
+ try {
+ ps = con.prepareStatement(sql);
+ ps.setInt(1, 1);
+ rs = ps.executeQuery();
+ rs.next();
+ String name1 = rs.getString("name1");
+ Assert.assertEquals("anyvalue", name1);
+ int id1 = rs.getInt("id1");
+ Assert.assertEquals(1, id1);
+ } finally {
+ TestUtil.closeQuietly(rs);
+ TestUtil.closeQuietly(ps);
+ }
+ }
+ // The same SQL, and use updateable ResultSet
+ {
+ PreparedStatement ps = null;
+ ResultSet rs = null;
+ try {
+ ps = con.prepareStatement(sql, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE);
+ ps.setInt(1, 1);
+ rs = ps.executeQuery();
+ rs.next();
+ String name1 = rs.getString("name1");
+ Assert.assertEquals("anyvalue", name1);
+ int id1 = rs.getInt("id1");
+ Assert.assertEquals(1, id1);
+ rs.updateString("name1", "updatedValue");
+ rs.updateRow();
+ } finally {
+ TestUtil.closeQuietly(rs);
+ TestUtil.closeQuietly(ps);
+ }
+ }
+ }
+
}
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/UpsertBinaryTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/UpsertBinaryTest.java
deleted file mode 100644
index 17c8faa..0000000
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/UpsertBinaryTest.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright (c) 2004, PostgreSQL Global Development Group
- * See the LICENSE file in the project root for more information.
- */
-
-package org.postgresql.test.jdbc2;
-
-import java.util.Properties;
-
-/**
- * Tests {@code INSERT .. ON CONFLICT} in binary mode.
- */
-public class UpsertBinaryTest extends UpsertTest {
- public UpsertBinaryTest(String name) {
- super(name);
- }
-
- @Override
- protected void updateProperties(Properties props) {
- forceBinary(props);
- }
-}
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/UpsertTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/UpsertTest.java
index f786c71..05934f4 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/UpsertTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/UpsertTest.java
@@ -5,32 +5,58 @@
package org.postgresql.test.jdbc2;
+import static org.junit.Assert.assertEquals;
+
+import org.postgresql.core.ServerVersion;
import org.postgresql.test.TestUtil;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
import java.sql.PreparedStatement;
+import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
+import java.util.ArrayList;
+import java.util.Collection;
+
/**
* Tests {@code INSERT .. ON CONFLICT} introduced in PostgreSQL 9.5.
*/
-public class UpsertTest extends BaseTest {
- Statement stmt;
+ at RunWith(Parameterized.class)
+public class UpsertTest extends BaseTest4 {
+ public UpsertTest(BinaryMode binaryMode, ReWriteBatchedInserts rewrite) {
+ setBinaryMode(binaryMode);
+ setReWriteBatchedInserts(rewrite);
+ }
- public UpsertTest(String name) {
- super(name);
+ @Parameterized.Parameters(name = "binary = {0}, reWriteBatchedInserts = {1}")
+ public static Iterable<Object[]> data() {
+ Collection<Object[]> ids = new ArrayList<Object[]>();
+ for (BinaryMode binaryMode : BinaryMode.values()) {
+ for (ReWriteBatchedInserts rewrite : ReWriteBatchedInserts.values()) {
+ ids.add(new Object[]{binaryMode, rewrite});
+ }
+ }
+ return ids;
}
- protected void setUp() throws Exception {
+ @Override
+ public void setUp() throws Exception {
super.setUp();
+ assumeMinimumServerVersion(ServerVersion.v9_5);
TestUtil.createTempTable(con, "test_statement", "i int primary key, t varchar(5)");
- stmt = con.createStatement();
+ Statement stmt = con.createStatement();
stmt.executeUpdate("INSERT INTO test_statement(i, t) VALUES (42, '42')");
+ TestUtil.closeQuietly(stmt);
}
- protected void tearDown() throws SQLException {
- stmt.close();
+ @Override
+ public void tearDown() throws SQLException {
TestUtil.dropTable(con, "test_statement");
super.tearDown();
}
@@ -42,6 +68,7 @@ public class UpsertTest extends BaseTest {
return count;
}
+ @Test
public void testUpsertDoNothingConflict() throws SQLException {
int count = executeUpdate(
"INSERT INTO test_statement(i, t) VALUES (42, '42') ON CONFLICT DO NOTHING");
@@ -49,6 +76,7 @@ public class UpsertTest extends BaseTest {
0, count);
}
+ @Test
public void testUpsertDoNothingNoConflict() throws SQLException {
int count = executeUpdate(
"INSERT INTO test_statement(i, t) VALUES (43, '43') ON CONFLICT DO NOTHING");
@@ -56,6 +84,7 @@ public class UpsertTest extends BaseTest {
1, count);
}
+ @Test
public void testUpsertDoUpdateConflict() throws SQLException {
int count = executeUpdate(
"INSERT INTO test_statement(i, t) VALUES (42, '42') ON CONFLICT(i) DO UPDATE SET t='43'");
@@ -63,10 +92,102 @@ public class UpsertTest extends BaseTest {
1, count);
}
+ @Test
public void testUpsertDoUpdateNoConflict() throws SQLException {
int count = executeUpdate(
"INSERT INTO test_statement(i, t) VALUES (43, '43') ON CONFLICT(i) DO UPDATE SET t='43'");
assertEquals("insert on conflict do update should report 1 modified row on plain insert",
1, count);
}
+
+ @Test
+ public void testSingleValuedUpsertBatch() throws SQLException {
+ PreparedStatement ps = null;
+ try {
+ ps = con.prepareStatement(
+ "insert into test_statement(i, t) values (?,?) ON CONFLICT (i) DO NOTHING");
+ ps.setInt(1, 50);
+ ps.setString(2, "50");
+ ps.addBatch();
+ ps.setInt(1, 53);
+ ps.setString(2, "53");
+ ps.addBatch();
+ int[] actual = ps.executeBatch();
+ BatchExecuteTest.assertSimpleInsertBatch(2, actual);
+ } finally {
+ TestUtil.closeQuietly(ps);
+ }
+ }
+
+ @Test
+ public void testMultiValuedUpsertBatch() throws SQLException {
+ PreparedStatement ps = null;
+ try {
+ ps = con.prepareStatement(
+ "insert into test_statement(i, t) values (?,?),(?,?) ON CONFLICT (i) DO NOTHING");
+ ps.setInt(1, 50);
+ ps.setString(2, "50");
+ ps.setInt(3, 51);
+ ps.setString(4, "51");
+ ps.addBatch();
+ ps.setInt(1, 52);
+ ps.setString(2, "52");
+ ps.setInt(3, 53);
+ ps.setString(4, "53");
+ ps.addBatch();
+ int[] actual = ps.executeBatch();
+
+ BatchExecuteTest.assertBatchResult("2 batched rows, 2-values each", new int[]{2, 2}, actual);
+
+ Statement st = con.createStatement();
+ ResultSet rs =
+ st.executeQuery("select count(*) from test_statement where i between 50 and 53");
+ rs.next();
+ Assert.assertEquals("test_statement should have 4 rows with 'i' of 50..53", 4, rs.getInt(1));
+ } finally {
+ TestUtil.closeQuietly(ps);
+ }
+ }
+
+ @Test
+ public void testSingleValuedUpsertUpdateBatch() throws SQLException {
+ PreparedStatement ps = null;
+ try {
+ ps = con.prepareStatement(
+ "insert into test_statement(i, t) values (?,?) ON CONFLICT (i) DO update set t=?");
+ ps.setInt(1, 50);
+ ps.setString(2, "50U");
+ ps.setString(3, "50U");
+ ps.addBatch();
+ ps.setInt(1, 53);
+ ps.setString(2, "53U");
+ ps.setString(3, "53U");
+ ps.addBatch();
+ int[] actual = ps.executeBatch();
+ BatchExecuteTest.assertSimpleInsertBatch(2, actual);
+ } finally {
+ TestUtil.closeQuietly(ps);
+ }
+ }
+
+ @Test
+ public void testSingleValuedUpsertUpdateConstantBatch() throws SQLException {
+ PreparedStatement ps = null;
+ try {
+ // For reWriteBatchedInserts=YES the following is expected
+ // FE=> Parse(stmt=null,query="insert into test_statement(i, t) values ($1,$2),($3,$4) ON CONFLICT (i) DO update set t='DEF'",oids={23,1043,23,1043})
+ ps = con.prepareStatement(
+ "insert into test_statement(i, t) values (?,?) ON CONFLICT (i) DO update set t='DEF'");
+ ps.setInt(1, 50);
+ ps.setString(2, "50");
+ ps.addBatch();
+ ps.setInt(1, 53);
+ ps.setString(2, "53");
+ ps.addBatch();
+ int[] actual = ps.executeBatch();
+ BatchExecuteTest.assertSimpleInsertBatch(2, actual);
+ } finally {
+ TestUtil.closeQuietly(ps);
+ }
+ }
}
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/optional/BaseDataSourceTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/optional/BaseDataSourceTest.java
index a4281ba..36e970b 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/optional/BaseDataSourceTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/optional/BaseDataSourceTest.java
@@ -5,12 +5,20 @@
package org.postgresql.test.jdbc2.optional;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNotSame;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.fail;
+
import org.postgresql.PGConnection;
import org.postgresql.ds.common.BaseDataSource;
import org.postgresql.test.TestUtil;
import org.postgresql.test.util.MiniJndiContextFactory;
-import junit.framework.TestCase;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
import java.sql.Connection;
import java.sql.ResultSet;
@@ -29,22 +37,16 @@ import javax.naming.NamingException;
*
* @author Aaron Mulder (ammulder at chariotsolutions.com)
*/
-public abstract class BaseDataSourceTest extends TestCase {
+public abstract class BaseDataSourceTest {
public static String DATA_SOURCE_JNDI = "BaseDataSource";
protected Connection con;
protected BaseDataSource bds;
/**
- * Constructor required by JUnit
- */
- public BaseDataSourceTest(String name) {
- super(name);
- }
-
- /**
* Creates a test table using a standard connection (not from a DataSource).
*/
- protected void setUp() throws Exception {
+ @Before
+ public void setUp() throws Exception {
con = TestUtil.openDB();
TestUtil.createTable(con, "poolingtest", "id int4 not null primary key, name varchar(50)");
Statement stmt = con.createStatement();
@@ -56,7 +58,8 @@ public abstract class BaseDataSourceTest extends TestCase {
/**
* Removes the test table using a standard connection (not from a DataSource)
*/
- protected void tearDown() throws Exception {
+ @After
+ public void tearDown() throws Exception {
TestUtil.closeDB(con);
con = TestUtil.openDB();
TestUtil.dropTable(con, "poolingtest");
@@ -86,13 +89,15 @@ public abstract class BaseDataSourceTest extends TestCase {
bds.setUser(TestUtil.getUser());
bds.setPassword(TestUtil.getPassword());
bds.setPrepareThreshold(TestUtil.getPrepareThreshold());
- bds.setLogLevel(TestUtil.getLogLevel());
+ bds.setLoggerLevel(TestUtil.getLogLevel());
+ bds.setLoggerFile(TestUtil.getLogFile());
bds.setProtocolVersion(TestUtil.getProtocolVersion());
}
/**
* Test to make sure you can instantiate and configure the appropriate DataSource
*/
+ @Test
public void testCreateDataSource() {
initializeDataSource();
}
@@ -101,6 +106,7 @@ public abstract class BaseDataSourceTest extends TestCase {
* Test to make sure you can get a connection from the DataSource, which in turn means the
* DataSource was able to open it.
*/
+ @Test
public void testGetConnection() {
try {
con = getDataSourceConnection();
@@ -113,6 +119,7 @@ public abstract class BaseDataSourceTest extends TestCase {
/**
* A simple test to make sure you can execute SQL using the Connection from the DataSource
*/
+ @Test
public void testUseConnection() {
try {
con = getDataSourceConnection();
@@ -140,6 +147,7 @@ public abstract class BaseDataSourceTest extends TestCase {
/**
* A test to make sure you can execute DDL SQL using the Connection from the DataSource.
*/
+ @Test
public void testDdlOverConnection() {
try {
con = getDataSourceConnection();
@@ -154,6 +162,7 @@ public abstract class BaseDataSourceTest extends TestCase {
* A test to make sure the connections are not being pooled by the current DataSource. Obviously
* need to be overridden in the case of a pooling Datasource.
*/
+ @Test
public void testNotPooledConnection() throws SQLException {
con = getDataSourceConnection();
String name = con.toString();
@@ -161,12 +170,13 @@ public abstract class BaseDataSourceTest extends TestCase {
con = getDataSourceConnection();
String name2 = con.toString();
con.close();
- assertTrue(!name.equals(name2));
+ assertNotEquals(name, name2);
}
/**
* Test to make sure that PGConnection methods can be called on the pooled Connection.
*/
+ @Test
public void testPGConnection() {
try {
con = getDataSourceConnection();
@@ -179,24 +189,11 @@ public abstract class BaseDataSourceTest extends TestCase {
}
/**
- * Uses the mini-JNDI implementation for testing purposes
- */
- protected InitialContext getInitialContext() {
- Hashtable<String, Object> env = new Hashtable<String, Object>();
- env.put(Context.INITIAL_CONTEXT_FACTORY, MiniJndiContextFactory.class.getName());
- try {
- return new InitialContext(env);
- } catch (NamingException e) {
- fail("Unable to create InitialContext: " + e.getMessage());
- return null;
- }
- }
-
- /**
* Eventually, we must test stuffing the DataSource in JNDI and then getting it back out and make
* sure it's still usable. This should ideally test both Serializable and Referenceable
* mechanisms. Will probably be multiple tests when implemented.
*/
+ @Test
public void testJndi() {
initializeDataSource();
BaseDataSource oldbds = bds;
@@ -204,22 +201,35 @@ public abstract class BaseDataSourceTest extends TestCase {
try {
ic.rebind(DATA_SOURCE_JNDI, bds);
bds = (BaseDataSource) ic.lookup(DATA_SOURCE_JNDI);
- assertTrue("Got null looking up DataSource from JNDI!", bds != null);
+ assertNotNull("Got null looking up DataSource from JNDI!", bds);
compareJndiDataSource(oldbds, bds);
} catch (NamingException e) {
fail(e.getMessage());
}
oldbds = bds;
testUseConnection();
- assertTrue("Test should not have changed DataSource (" + bds + " != " + oldbds + ")!",
- bds == oldbds);
+ assertSame("Test should not have changed DataSource (" + bds + " != " + oldbds + ")!",
+ oldbds , bds);
+ }
+
+ /**
+ * Uses the mini-JNDI implementation for testing purposes
+ */
+ protected InitialContext getInitialContext() {
+ Hashtable<String, Object> env = new Hashtable<String, Object>();
+ env.put(Context.INITIAL_CONTEXT_FACTORY, MiniJndiContextFactory.class.getName());
+ try {
+ return new InitialContext(env);
+ } catch (NamingException e) {
+ fail("Unable to create InitialContext: " + e.getMessage());
+ return null;
+ }
}
/**
* Check whether a DS was dereferenced from JNDI or recreated.
*/
protected void compareJndiDataSource(BaseDataSource oldbds, BaseDataSource bds) {
- assertTrue("DataSource was dereferenced, should have been serialized or recreated",
- bds != oldbds);
+ assertNotSame("DataSource was dereferenced, should have been serialized or recreated", oldbds, bds);
}
}
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/optional/CaseOptimiserDataSourceTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/optional/CaseOptimiserDataSourceTest.java
index 63a41b2..1e02ebe 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/optional/CaseOptimiserDataSourceTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/optional/CaseOptimiserDataSourceTest.java
@@ -5,12 +5,17 @@
package org.postgresql.test.jdbc2.optional;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
import org.postgresql.core.BaseConnection;
import org.postgresql.ds.common.BaseDataSource;
import org.postgresql.jdbc2.optional.SimpleDataSource;
import org.postgresql.test.TestUtil;
-import junit.framework.TestCase;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
import java.sql.Connection;
import java.sql.PreparedStatement;
@@ -20,18 +25,11 @@ import java.sql.Statement;
/*
* DataSource test to ensure the BaseConnection is configured with column sanitiser disabled.
*/
-public class CaseOptimiserDataSourceTest extends TestCase {
+public class CaseOptimiserDataSourceTest {
private BaseDataSource bds;
protected Connection conn;
- protected void initializeDataSource() {
- if (bds == null) {
- bds = new SimpleDataSource();
- setupDataSource(bds);
- bds.setDisableColumnSanitiser(true);
- }
- }
-
+ @Before
public void setUp() throws SQLException {
Connection conn = getDataSourceConnection();
assertTrue(conn instanceof BaseConnection);
@@ -46,7 +44,7 @@ public class CaseOptimiserDataSourceTest extends TestCase {
conn.close();
}
- @Override
+ @After
public void tearDown() throws SQLException {
Connection conn = getDataSourceConnection();
Statement drop = conn.createStatement();
@@ -61,6 +59,7 @@ public class CaseOptimiserDataSourceTest extends TestCase {
* checks for a side effect of the sanitiser being disabled. The column is not expected to be
* found.
*/
+ @Test
public void testDataSourceDisabledSanitiserPropertySucceeds() throws SQLException {
String label = "FOO";
Connection conn = getDataSourceConnection();
@@ -83,6 +82,14 @@ public class CaseOptimiserDataSourceTest extends TestCase {
return bds.getConnection();
}
+ protected void initializeDataSource() {
+ if (bds == null) {
+ bds = new SimpleDataSource();
+ setupDataSource(bds);
+ bds.setDisableColumnSanitiser(true);
+ }
+ }
+
public static void setupDataSource(BaseDataSource bds) {
bds.setServerName(TestUtil.getServer());
bds.setPortNumber(TestUtil.getPort());
@@ -90,11 +97,8 @@ public class CaseOptimiserDataSourceTest extends TestCase {
bds.setUser(TestUtil.getUser());
bds.setPassword(TestUtil.getPassword());
bds.setPrepareThreshold(TestUtil.getPrepareThreshold());
- bds.setLogLevel(TestUtil.getLogLevel());
+ bds.setLoggerLevel(TestUtil.getLogLevel());
+ bds.setLoggerFile(TestUtil.getLogFile());
bds.setProtocolVersion(TestUtil.getProtocolVersion());
}
-
- public CaseOptimiserDataSourceTest(String name) {
- super(name);
- }
}
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/optional/ConnectionPoolTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/optional/ConnectionPoolTest.java
index ea0c167..5d90e1e 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/optional/ConnectionPoolTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/optional/ConnectionPoolTest.java
@@ -5,11 +5,19 @@
package org.postgresql.test.jdbc2.optional;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
import org.postgresql.PGConnection;
+import org.postgresql.core.ServerVersion;
import org.postgresql.ds.PGConnectionPoolDataSource;
import org.postgresql.jdbc2.optional.ConnectionPool;
import org.postgresql.test.TestUtil;
+import org.junit.Assume;
+import org.junit.Test;
+
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
@@ -36,15 +44,9 @@ public class ConnectionPoolTest extends BaseDataSourceTest {
private ArrayList<PooledConnection> connections = new ArrayList<PooledConnection>();
/**
- * Constructor required by JUnit
- */
- public ConnectionPoolTest(String name) {
- super(name);
- }
-
- /**
* Creates and configures a ConnectionPool
*/
+ @Override
protected void initializeDataSource() {
if (bds == null) {
bds = new ConnectionPool();
@@ -52,7 +54,8 @@ public class ConnectionPoolTest extends BaseDataSourceTest {
}
}
- protected void tearDown() throws Exception {
+ @Override
+ public void tearDown() throws Exception {
for (PooledConnection c : connections) {
try {
c.close();
@@ -64,26 +67,12 @@ public class ConnectionPoolTest extends BaseDataSourceTest {
}
/**
- * Though the normal client interface is to grab a Connection, in order to test the
- * middleware/server interface, we need to deal with PooledConnections. Some tests use each.
- */
- protected PooledConnection getPooledConnection() throws SQLException {
- initializeDataSource();
- // we need to recast to PGConnectionPool rather than
- // jdbc.optional.ConnectionPool because our ObjectFactory
- // returns only the top level class, not the specific
- // jdbc2/jdbc3 implementations.
- PooledConnection c = ((PGConnectionPoolDataSource) bds).getPooledConnection();
- connections.add(c);
- return c;
- }
-
- /**
* Instead of just fetching a Connection from the ConnectionPool, get a PooledConnection, add a
* listener to close it when the Connection is closed, and then get the Connection. Without the
* listener the PooledConnection (and thus the physical connection) would never by closed.
* Probably not a disaster during testing, but you never know.
*/
+ @Override
protected Connection getDataSourceConnection() throws SQLException {
initializeDataSource();
final PooledConnection pc = getPooledConnection();
@@ -105,10 +94,26 @@ public class ConnectionPoolTest extends BaseDataSourceTest {
}
/**
+ * Though the normal client interface is to grab a Connection, in order to test the
+ * middleware/server interface, we need to deal with PooledConnections. Some tests use each.
+ */
+ protected PooledConnection getPooledConnection() throws SQLException {
+ initializeDataSource();
+ // we need to recast to PGConnectionPool rather than
+ // jdbc.optional.ConnectionPool because our ObjectFactory
+ // returns only the top level class, not the specific
+ // jdbc2/jdbc3 implementations.
+ PooledConnection c = ((PGConnectionPoolDataSource) bds).getPooledConnection();
+ connections.add(c);
+ return c;
+ }
+
+ /**
* Makes sure that if you get a connection from a PooledConnection, close it, and then get another
* one, you're really using the same physical connection. Depends on the implementation of
* toString for the connection handle.
*/
+ @Test
public void testPoolReuse() {
try {
PooledConnection pc = getPooledConnection();
@@ -130,6 +135,7 @@ public class ConnectionPoolTest extends BaseDataSourceTest {
* Makes sure that when you request a connection from the PooledConnection, and previous
* connection it might have given out is closed. See JDBC 2.0 Optional Package spec section 6.2.3
*/
+ @Test
public void testPoolCloseOldWrapper() {
try {
PooledConnection pc = getPooledConnection();
@@ -153,6 +159,7 @@ public class ConnectionPoolTest extends BaseDataSourceTest {
* different, even though the represent the same physical connection. See JDBC 2.0 Optional
* Pacakge spec section 6.2.2
*/
+ @Test
public void testPoolNewWrapper() {
try {
PooledConnection pc = getPooledConnection();
@@ -172,27 +179,28 @@ public class ConnectionPoolTest extends BaseDataSourceTest {
* Makes sure that exactly one close event is fired for each time a connection handle is closed.
* Also checks that events are not fired after a given handle has been closed once.
*/
+ @Test
public void testCloseEvent() {
try {
PooledConnection pc = getPooledConnection();
CountClose cc = new CountClose();
pc.addConnectionEventListener(cc);
con = pc.getConnection();
- assertTrue(cc.getCount() == 0);
- assertTrue(cc.getErrorCount() == 0);
+ assertEquals(0, cc.getCount());
+ assertEquals(0, cc.getErrorCount());
con.close();
- assertTrue(cc.getCount() == 1);
- assertTrue(cc.getErrorCount() == 0);
+ assertEquals(1, cc.getCount());
+ assertEquals(0, cc.getErrorCount());
con = pc.getConnection();
- assertTrue(cc.getCount() == 1);
- assertTrue(cc.getErrorCount() == 0);
+ assertEquals(1, cc.getCount());
+ assertEquals(0, cc.getErrorCount());
con.close();
- assertTrue(cc.getCount() == 2);
- assertTrue(cc.getErrorCount() == 0);
+ assertEquals(2, cc.getCount());
+ assertEquals(0, cc.getErrorCount());
// a double close shouldn't fire additional events
con.close();
- assertTrue(cc.getCount() == 2);
- assertTrue(cc.getErrorCount() == 0);
+ assertEquals(2, cc.getCount());
+ assertEquals(0, cc.getErrorCount());
pc.close();
} catch (SQLException e) {
fail(e.getMessage());
@@ -202,24 +210,25 @@ public class ConnectionPoolTest extends BaseDataSourceTest {
/**
* Makes sure that close events are not fired after a listener has been removed.
*/
+ @Test
public void testNoCloseEvent() {
try {
PooledConnection pc = getPooledConnection();
CountClose cc = new CountClose();
pc.addConnectionEventListener(cc);
con = pc.getConnection();
- assertTrue(cc.getCount() == 0);
- assertTrue(cc.getErrorCount() == 0);
+ assertEquals(0, cc.getCount());
+ assertEquals(0, cc.getErrorCount());
con.close();
- assertTrue(cc.getCount() == 1);
- assertTrue(cc.getErrorCount() == 0);
+ assertEquals(1, cc.getCount());
+ assertEquals(0, cc.getErrorCount());
pc.removeConnectionEventListener(cc);
con = pc.getConnection();
- assertTrue(cc.getCount() == 1);
- assertTrue(cc.getErrorCount() == 0);
+ assertEquals(1, cc.getCount());
+ assertEquals(0, cc.getErrorCount());
con.close();
- assertTrue(cc.getCount() == 1);
- assertTrue(cc.getErrorCount() == 0);
+ assertEquals(1, cc.getCount());
+ assertEquals(0, cc.getErrorCount());
} catch (SQLException e) {
fail(e.getMessage());
}
@@ -229,6 +238,7 @@ public class ConnectionPoolTest extends BaseDataSourceTest {
* Makes sure that a listener can be removed while dispatching events. Sometimes this causes a
* ConcurrentModificationException or something.
*/
+ @Test
public void testInlineCloseEvent() {
try {
PooledConnection pc = getPooledConnection();
@@ -252,28 +262,29 @@ public class ConnectionPoolTest extends BaseDataSourceTest {
* to a new connection handle being opened for the same PooledConnection. See JDBC 2.0 Optional
* Package spec section 6.3
*/
+ @Test
public void testAutomaticCloseEvent() {
try {
PooledConnection pc = getPooledConnection();
CountClose cc = new CountClose();
pc.addConnectionEventListener(cc);
con = pc.getConnection();
- assertTrue(cc.getCount() == 0);
- assertTrue(cc.getErrorCount() == 0);
+ assertEquals(0, cc.getCount());
+ assertEquals(0, cc.getErrorCount());
con.close();
- assertTrue(cc.getCount() == 1);
- assertTrue(cc.getErrorCount() == 0);
+ assertEquals(1, cc.getCount());
+ assertEquals(0, cc.getErrorCount());
con = pc.getConnection();
- assertTrue(cc.getCount() == 1);
- assertTrue(cc.getErrorCount() == 0);
+ assertEquals(1, cc.getCount());
+ assertEquals(0, cc.getErrorCount());
// Open a 2nd connection, causing the first to be closed. No even should be generated.
Connection con2 = pc.getConnection();
assertTrue("Connection handle was not closed when new handle was opened", con.isClosed());
- assertTrue(cc.getCount() == 1);
- assertTrue(cc.getErrorCount() == 0);
+ assertEquals(1, cc.getCount());
+ assertEquals(0, cc.getErrorCount());
con2.close();
- assertTrue(cc.getCount() == 2);
- assertTrue(cc.getErrorCount() == 0);
+ assertEquals(2, cc.getCount());
+ assertEquals(0, cc.getErrorCount());
pc.close();
} catch (SQLException e) {
fail(e.getMessage());
@@ -284,6 +295,7 @@ public class ConnectionPoolTest extends BaseDataSourceTest {
* Makes sure the isClosed method on a connection wrapper does what you'd expect. Checks the usual
* case, as well as automatic closure when a new handle is opened on the same physical connection.
*/
+ @Test
public void testIsClosed() {
try {
PooledConnection pc = getPooledConnection();
@@ -307,11 +319,16 @@ public class ConnectionPoolTest extends BaseDataSourceTest {
* Make sure that close status of pooled connection reflect the one of the underlying physical
* connection.
*/
+ @Test
public void testBackendIsClosed() throws Exception {
try {
PooledConnection pc = getPooledConnection();
con = pc.getConnection();
assertTrue(!con.isClosed());
+
+ Assume.assumeTrue("pg_terminate_backend requires PostgreSQL 8.4+",
+ TestUtil.haveMinimumServerVersion(con, ServerVersion.v8_4));
+
int pid = ((PGConnection) con).getBackendPID();
Connection adminCon = TestUtil.openPrivilegedDB();
@@ -338,6 +355,7 @@ public class ConnectionPoolTest extends BaseDataSourceTest {
* Ensures that a statement generated by a proxied connection returns the proxied connection from
* getConnection() [not the physical connection].
*/
+ @Test
public void testStatementConnection() {
try {
PooledConnection pc = getPooledConnection();
@@ -345,8 +363,8 @@ public class ConnectionPoolTest extends BaseDataSourceTest {
Statement s = con.createStatement();
Connection conRetrieved = s.getConnection();
- assertTrue(con.getClass().equals(conRetrieved.getClass()));
- assertTrue(con.equals(conRetrieved));
+ assertEquals(con.getClass(), conRetrieved.getClass());
+ assertEquals(con, conRetrieved);
} catch (SQLException e) {
fail(e.getMessage());
}
@@ -356,6 +374,7 @@ public class ConnectionPoolTest extends BaseDataSourceTest {
* Ensures that the Statement proxy generated by the Connection handle throws the correct kind of
* exception.
*/
+ @Test
public void testStatementProxy() {
Statement s = null;
try {
@@ -379,6 +398,7 @@ public class ConnectionPoolTest extends BaseDataSourceTest {
* Ensures that a prepared statement generated by a proxied connection returns the proxied
* connection from getConnection() [not the physical connection].
*/
+ @Test
public void testPreparedStatementConnection() {
try {
PooledConnection pc = getPooledConnection();
@@ -386,8 +406,8 @@ public class ConnectionPoolTest extends BaseDataSourceTest {
PreparedStatement s = con.prepareStatement("select 'x'");
Connection conRetrieved = s.getConnection();
- assertTrue(con.getClass().equals(conRetrieved.getClass()));
- assertTrue(con.equals(conRetrieved));
+ assertEquals(con.getClass(), conRetrieved.getClass());
+ assertEquals(con, conRetrieved);
} catch (SQLException e) {
fail(e.getMessage());
}
@@ -397,6 +417,7 @@ public class ConnectionPoolTest extends BaseDataSourceTest {
* Ensures that a callable statement generated by a proxied connection returns the proxied
* connection from getConnection() [not the physical connection].
*/
+ @Test
public void testCallableStatementConnection() {
try {
PooledConnection pc = getPooledConnection();
@@ -404,8 +425,8 @@ public class ConnectionPoolTest extends BaseDataSourceTest {
CallableStatement s = con.prepareCall("select 'x'");
Connection conRetrieved = s.getConnection();
- assertTrue(con.getClass().equals(conRetrieved.getClass()));
- assertTrue(con.equals(conRetrieved));
+ assertEquals(con.getClass(), conRetrieved.getClass());
+ assertEquals(con, conRetrieved);
} catch (SQLException e) {
fail(e.getMessage());
}
@@ -415,6 +436,7 @@ public class ConnectionPoolTest extends BaseDataSourceTest {
* Ensure that a statement created from a pool can be used like any other statement in regard to
* pg extensions.
*/
+ @Test
public void testStatementsProxyPGStatement() {
try {
PooledConnection pc = getPooledConnection();
@@ -438,10 +460,12 @@ public class ConnectionPoolTest extends BaseDataSourceTest {
* Helper class to remove a listener during event dispatching.
*/
private class RemoveClose implements ConnectionEventListener {
+ @Override
public void connectionClosed(ConnectionEvent event) {
((PooledConnection) event.getSource()).removeConnectionEventListener(this);
}
+ @Override
public void connectionErrorOccurred(ConnectionEvent event) {
((PooledConnection) event.getSource()).removeConnectionEventListener(this);
}
@@ -455,10 +479,12 @@ public class ConnectionPoolTest extends BaseDataSourceTest {
private int count = 0;
private int errorCount = 0;
+ @Override
public void connectionClosed(ConnectionEvent event) {
count++;
}
+ @Override
public void connectionErrorOccurred(ConnectionEvent event) {
errorCount++;
}
@@ -476,6 +502,7 @@ public class ConnectionPoolTest extends BaseDataSourceTest {
}
}
+ @Test
public void testSerializable() throws IOException, ClassNotFoundException {
ConnectionPool pool = new ConnectionPool();
pool.setDefaultAutoCommit(false);
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/optional/OptionalTestSuite.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/optional/OptionalTestSuite.java
index 0e2a035..00c5d1a 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/optional/OptionalTestSuite.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/optional/OptionalTestSuite.java
@@ -5,7 +5,8 @@
package org.postgresql.test.jdbc2.optional;
-import junit.framework.TestSuite;
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
/**
* Test suite for the JDBC 2.0 Optional Package implementation. This includes the DataSource,
@@ -13,18 +14,13 @@ import junit.framework.TestSuite;
*
* @author Aaron Mulder (ammulder at chariotsolutions.com)
*/
-public class OptionalTestSuite extends TestSuite {
- /**
- * Gets the test suite for the entire JDBC 2.0 Optional Package implementation.
- */
- public static TestSuite suite() throws Exception {
- Class.forName("org.postgresql.Driver");
- TestSuite suite = new TestSuite();
- suite.addTestSuite(SimpleDataSourceTest.class);
- suite.addTestSuite(SimpleDataSourceWithUrlTest.class);
- suite.addTestSuite(ConnectionPoolTest.class);
- suite.addTestSuite(PoolingDataSourceTest.class);
- suite.addTestSuite(CaseOptimiserDataSourceTest.class);
- return suite;
- }
+ at RunWith(Suite.class)
+ at Suite.SuiteClasses({SimpleDataSourceTest.class,
+ SimpleDataSourceWithUrlTest.class,
+ SimpleDataSourceWithSetURLTest.class,
+ ConnectionPoolTest.class,
+ PoolingDataSourceTest.class,
+ CaseOptimiserDataSourceTest.class})
+public class OptionalTestSuite {
+
}
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/optional/PoolingDataSourceTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/optional/PoolingDataSourceTest.java
index c866037..73a9824 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/optional/PoolingDataSourceTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/optional/PoolingDataSourceTest.java
@@ -5,9 +5,15 @@
package org.postgresql.test.jdbc2.optional;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.fail;
+
import org.postgresql.ds.common.BaseDataSource;
import org.postgresql.jdbc2.optional.PoolingDataSource;
+import org.junit.Test;
+
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
@@ -19,16 +25,10 @@ import java.sql.Statement;
* @author Aaron Mulder (ammulder at chariotsolutions.com)
*/
public class PoolingDataSourceTest extends BaseDataSourceTest {
- private final static String DS_NAME = "JDBC 2 SE Test DataSource";
-
- /**
- * Constructor required by JUnit
- */
- public PoolingDataSourceTest(String name) {
- super(name);
- }
+ private static final String DS_NAME = "JDBC 2 SE Test DataSource";
- protected void tearDown() throws Exception {
+ @Override
+ public void tearDown() throws Exception {
if (bds instanceof PoolingDataSource) {
((PoolingDataSource) bds).close();
}
@@ -38,6 +38,7 @@ public class PoolingDataSourceTest extends BaseDataSourceTest {
/**
* Creates and configures a new SimpleDataSource.
*/
+ @Override
protected void initializeDataSource() {
if (bds == null) {
bds = new PoolingDataSource();
@@ -51,6 +52,7 @@ public class PoolingDataSourceTest extends BaseDataSourceTest {
/**
* In this case, we *do* want it to be pooled.
*/
+ @Override
public void testNotPooledConnection() throws SQLException {
con = getDataSourceConnection();
String name = con.toString();
@@ -58,20 +60,22 @@ public class PoolingDataSourceTest extends BaseDataSourceTest {
con = getDataSourceConnection();
String name2 = con.toString();
con.close();
- assertTrue("Pooled DS doesn't appear to be pooling connections!", name.equals(name2));
+ assertEquals("Pooled DS doesn't appear to be pooling connections!", name, name2);
}
/**
* In this case, the desired behavior is dereferencing.
*/
+ @Override
protected void compareJndiDataSource(BaseDataSource oldbds, BaseDataSource bds) {
- assertTrue("DataSource was serialized or recreated, should have been dereferenced",
- bds == oldbds);
+ assertSame("DataSource was serialized or recreated, should have been dereferenced",
+ bds, oldbds);
}
/**
* Check that 2 DS instances can't use the same name.
*/
+ @Test
public void testCantReuseName() {
initializeDataSource();
PoolingDataSource pds = new PoolingDataSource();
@@ -85,6 +89,7 @@ public class PoolingDataSourceTest extends BaseDataSourceTest {
/**
* Closing a Connection twice is not an error.
*/
+ @Test
public void testDoubleConnectionClose() throws SQLException {
con = getDataSourceConnection();
con.close();
@@ -94,6 +99,7 @@ public class PoolingDataSourceTest extends BaseDataSourceTest {
/**
* Closing a Statement twice is not an error.
*/
+ @Test
public void testDoubleStatementClose() throws SQLException {
con = getDataSourceConnection();
Statement stmt = con.createStatement();
@@ -102,6 +108,7 @@ public class PoolingDataSourceTest extends BaseDataSourceTest {
con.close();
}
+ @Test
public void testConnectionObjectMethods() throws SQLException {
con = getDataSourceConnection();
@@ -116,6 +123,7 @@ public class PoolingDataSourceTest extends BaseDataSourceTest {
assertEquals(hc1, hc2);
}
+ @Test
public void testStatementObjectMethods() throws SQLException {
con = getDataSourceConnection();
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/optional/SimpleDataSourceTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/optional/SimpleDataSourceTest.java
index 046b6e1..90a7e62 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/optional/SimpleDataSourceTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/optional/SimpleDataSourceTest.java
@@ -13,16 +13,11 @@ import org.postgresql.jdbc2.optional.SimpleDataSource;
* @author Aaron Mulder (ammulder at chariotsolutions.com)
*/
public class SimpleDataSourceTest extends BaseDataSourceTest {
- /**
- * Constructor required by JUnit
- */
- public SimpleDataSourceTest(String name) {
- super(name);
- }
/**
* Creates and configures a new SimpleDataSource.
*/
+ @Override
protected void initializeDataSource() {
if (bds == null) {
bds = new SimpleDataSource();
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/optional/SimpleDataSourceWithSetURLTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/optional/SimpleDataSourceWithSetURLTest.java
new file mode 100644
index 0000000..f9bbd5a
--- /dev/null
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/optional/SimpleDataSourceWithSetURLTest.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 2017, PostgreSQL Global Development Group
+ * See the LICENSE file in the project root for more information.
+ */
+
+package org.postgresql.test.jdbc2.optional;
+
+import static org.junit.Assert.assertEquals;
+import static org.postgresql.Driver.parseURL;
+
+import org.postgresql.PGProperty;
+import org.postgresql.jdbc2.optional.SimpleDataSource;
+import org.postgresql.test.TestUtil;
+
+import org.junit.Test;
+
+import java.util.Properties;
+
+/**
+ * Performs the basic tests defined in the superclass. Just adds the configuration logic.
+ */
+public class SimpleDataSourceWithSetURLTest extends BaseDataSourceTest {
+ /**
+ * Creates and configures a new SimpleDataSource using setURL method.
+ */
+ @Override
+ protected void initializeDataSource() {
+ if (bds == null) {
+ bds = new SimpleDataSource();
+ bds.setURL(String.format("jdbc:postgresql://%s:%d/%s?prepareThreshold=%d&loggerLevel=%s", TestUtil.getServer(), TestUtil.getPort(), TestUtil.getDatabase(), TestUtil.getPrepareThreshold(),
+ TestUtil.getLogLevel()));
+ bds.setUser(TestUtil.getUser());
+ bds.setPassword(TestUtil.getPassword());
+ bds.setProtocolVersion(TestUtil.getProtocolVersion());
+ }
+ }
+
+ @Test
+ public void testGetURL() throws Exception {
+ con = getDataSourceConnection();
+
+ String url = bds.getURL();
+ Properties properties = parseURL(url, null);
+
+ assertEquals(TestUtil.getServer(), properties.getProperty(PGProperty.PG_HOST.getName()));
+ assertEquals(Integer.toString(TestUtil.getPort()), properties.getProperty(PGProperty.PG_PORT.getName()));
+ assertEquals(TestUtil.getDatabase(), properties.getProperty(PGProperty.PG_DBNAME.getName()));
+ assertEquals(Integer.toString(TestUtil.getPrepareThreshold()), properties.getProperty(PGProperty.PREPARE_THRESHOLD.getName()));
+ assertEquals(TestUtil.getLogLevel(), properties.getProperty(PGProperty.LOGGER_LEVEL.getName()));
+ }
+
+ @Test
+ public void testSetURL() throws Exception {
+ initializeDataSource();
+
+ assertEquals(TestUtil.getServer(), bds.getServerName());
+ assertEquals(TestUtil.getPort(), bds.getPortNumber());
+ assertEquals(TestUtil.getDatabase(), bds.getDatabaseName());
+ assertEquals(TestUtil.getPrepareThreshold(), bds.getPrepareThreshold());
+ assertEquals(TestUtil.getLogLevel(), bds.getLoggerLevel());
+ }
+}
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/optional/SimpleDataSourceWithUrlTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/optional/SimpleDataSourceWithUrlTest.java
index d066eca..041900c 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc2/optional/SimpleDataSourceWithUrlTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc2/optional/SimpleDataSourceWithUrlTest.java
@@ -15,15 +15,9 @@ import org.postgresql.test.TestUtil;
*/
public class SimpleDataSourceWithUrlTest extends BaseDataSourceTest {
/**
- * Constructor required by JUnit
- */
- public SimpleDataSourceWithUrlTest(String name) {
- super(name);
- }
-
- /**
* Creates and configures a new SimpleDataSource.
*/
+ @Override
protected void initializeDataSource() {
if (bds == null) {
bds = new SimpleDataSource();
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc3/CompositeQueryParseTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc3/CompositeQueryParseTest.java
index 5a81773..dc4cf8f 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc3/CompositeQueryParseTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc3/CompositeQueryParseTest.java
@@ -5,77 +5,95 @@
package org.postgresql.test.jdbc3;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
import org.postgresql.core.NativeQuery;
import org.postgresql.core.Parser;
import org.postgresql.core.SqlCommandType;
-import junit.framework.TestCase;
+import org.junit.Test;
import java.sql.SQLException;
import java.util.List;
-public class CompositeQueryParseTest extends TestCase {
+public class CompositeQueryParseTest {
+ @Test
public void testEmptyQuery() {
assertEquals("", reparse("", true, false, true));
}
+ @Test
public void testWhitespaceQuery() {
assertEquals("", reparse(" ", true, false, true));
}
+ @Test
public void testOnlyEmptyQueries() {
assertEquals("", reparse(";;;; ; \n;\n", true, false, true));
}
+ @Test
public void testSimpleQuery() {
assertEquals("select 1", reparse("select 1", true, false, true));
}
+ @Test
public void testSimpleBind() {
assertEquals("select $1", reparse("select ?", true, true, true));
}
+ @Test
public void testUnquotedQuestionmark() {
assertEquals("select '{\"key\": \"val\"}'::jsonb ? 'key'",
reparse("select '{\"key\": \"val\"}'::jsonb ? 'key'", true, false, true));
}
+ @Test
public void testRepeatedQuestionmark() {
assertEquals("select '{\"key\": \"val\"}'::jsonb ? 'key'",
reparse("select '{\"key\": \"val\"}'::jsonb ?? 'key'", true, false, true));
}
+ @Test
public void testQuotedQuestionmark() {
assertEquals("select '?'", reparse("select '?'", true, false, true));
}
+ @Test
public void testDoubleQuestionmark() {
assertEquals("select '?', $1 ?=> $2", reparse("select '?', ? ??=> ?", true, true, true));
}
+ @Test
public void testCompositeBasic() {
assertEquals("select 1;/*cut*/\n select 2", reparse("select 1; select 2", true, false, true));
}
+ @Test
public void testCompositeWithBinds() {
assertEquals("select $1;/*cut*/\n select $1", reparse("select ?; select ?", true, true, true));
}
+ @Test
public void testTrailingSemicolon() {
assertEquals("select 1", reparse("select 1;", true, false, true));
}
+ @Test
public void testTrailingSemicolonAndSpace() {
assertEquals("select 1", reparse("select 1; ", true, false, true));
}
+ @Test
public void testMultipleTrailingSemicolons() {
assertEquals("select 1", reparse("select 1;;;", true, false, true));
}
+ @Test
public void testHasReturning() throws SQLException {
-
List<NativeQuery> queries = Parser.parseJdbcSql("insert into foo (a,b,c) values (?,?,?) RetuRning a", true, true, false,
true);
NativeQuery query = queries.get(0);
@@ -91,15 +109,16 @@ public class CompositeQueryParseTest extends TestCase {
assertFalse("The parser should not find the word returning as it is in quotes ", query.command.isReturningKeywordPresent());
}
+ @Test
public void testSelect() throws SQLException {
List<NativeQuery> queries;
- NativeQuery query;
queries = Parser.parseJdbcSql("select 1 as returning from (update table)", true, true, false, true);
- query = queries.get(0);
+ NativeQuery query = queries.get(0);
assertEquals("This is a select ", SqlCommandType.SELECT, query.command.getType());
assertTrue("Returning is OK here as it is not an insert command ", query.command.isReturningKeywordPresent());
}
+ @Test
public void testDelete() throws SQLException {
List<NativeQuery> queries = Parser.parseJdbcSql("DeLeTe from foo where a=1", true, true, false,
true);
@@ -108,12 +127,14 @@ public class CompositeQueryParseTest extends TestCase {
}
+ @Test
public void testMove() throws SQLException {
List<NativeQuery> queries = Parser.parseJdbcSql("MoVe NEXT FROM FOO", true, true, false, true);
NativeQuery query = queries.get(0);
assertEquals("This is a move command", SqlCommandType.MOVE, query.command.getType());
}
+ @Test
public void testUpdate() throws SQLException {
List<NativeQuery> queries;
NativeQuery query;
@@ -122,6 +143,7 @@ public class CompositeQueryParseTest extends TestCase {
assertEquals("This is an UPDATE command", SqlCommandType.UPDATE, query.command.getType());
}
+ @Test
public void testInsert() throws SQLException {
List<NativeQuery> queries = Parser.parseJdbcSql("InSeRt into foo (a,b,c) values (?,?,?) returning a", true, true, false,
true);
@@ -133,19 +155,29 @@ public class CompositeQueryParseTest extends TestCase {
assertEquals("This is a SELECT command", SqlCommandType.SELECT, query.command.getType());
}
- public void testWith() throws SQLException {
+ @Test
+ public void testWithSelect() throws SQLException {
List<NativeQuery> queries;
- NativeQuery query;
- queries = Parser.parseJdbcSql("with update as insert (update foo set (a=?,b=?,c=?)) select * from update", true, true, false, true);
- query = queries.get(0);
- assertEquals("This is a WITH command", SqlCommandType.WITH, query.command.getType());
+ queries = Parser.parseJdbcSql("with update as (update foo set (a=?,b=?,c=?)) select * from update", true, true, false, true);
+ NativeQuery query = queries.get(0);
+ assertEquals("with ... () select", SqlCommandType.SELECT, query.command.getType());
+ }
+
+ @Test
+ public void testWithInsert() throws SQLException {
+ List<NativeQuery> queries;
+ queries = Parser.parseJdbcSql("with update as (update foo set (a=?,b=?,c=?)) insert into table(select) values(1)", true, true, false, true);
+ NativeQuery query = queries.get(0);
+ assertEquals("with ... () insert", SqlCommandType.INSERT, query.command.getType());
}
+ @Test
public void testMultipleEmptyQueries() {
assertEquals("select 1;/*cut*/\n" + "select 2",
reparse("select 1; ;\t;select 2", true, false, true));
}
+ @Test
public void testCompositeWithComments() {
assertEquals("select 1;/*cut*/\n" + "/* noop */;/*cut*/\n" + "select 2",
reparse("select 1;/* noop */;select 2", true, false, true));
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc3/CompositeTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc3/CompositeTest.java
index ba68496..8d623e6 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc3/CompositeTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc3/CompositeTest.java
@@ -5,10 +5,16 @@
package org.postgresql.test.jdbc3;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
import org.postgresql.test.TestUtil;
import org.postgresql.util.PGobject;
-import junit.framework.TestCase;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
import java.sql.Array;
import java.sql.Connection;
@@ -16,15 +22,12 @@ import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
-public class CompositeTest extends TestCase {
+public class CompositeTest {
private Connection _conn;
- public CompositeTest(String name) {
- super(name);
- }
-
- protected void setUp() throws Exception {
+ @Before
+ public void setUp() throws Exception {
_conn = TestUtil.openDB();
TestUtil.createSchema(_conn, "\"Composites\"");
TestUtil.createCompositeType(_conn, "simplecompositetest", "i int, d decimal, u uuid");
@@ -37,7 +40,8 @@ public class CompositeTest extends TestCase {
"s simplecompositetest, cc \"Composites\".\"ComplexCompositeTest\"[]");
}
- protected void tearDown() throws SQLException {
+ @After
+ public void tearDown() throws SQLException {
TestUtil.dropTable(_conn, "\"Composites\".\"Table\"");
TestUtil.dropTable(_conn, "compositetabletest");
TestUtil.dropType(_conn, "\"Composites\".\"ComplexCompositeTest\"");
@@ -47,6 +51,7 @@ public class CompositeTest extends TestCase {
TestUtil.closeDB(_conn);
}
+ @Test
public void testSimpleSelect() throws SQLException {
PreparedStatement pstmt = _conn.prepareStatement("SELECT '(1,2.2,)'::simplecompositetest");
ResultSet rs = pstmt.executeQuery();
@@ -56,6 +61,7 @@ public class CompositeTest extends TestCase {
assertEquals("(1,2.2,)", pgo.getValue());
}
+ @Test
public void testComplexSelect() throws SQLException {
PreparedStatement pstmt = _conn.prepareStatement(
"SELECT '(\"{1,2}\",{},\"(1,2.2,)\")'::\"Composites\".\"ComplexCompositeTest\"");
@@ -66,6 +72,7 @@ public class CompositeTest extends TestCase {
assertEquals("(\"{1,2}\",{},\"(1,2.2,)\")", pgo.getValue());
}
+ @Test
public void testSimpleArgumentSelect() throws SQLException {
PreparedStatement pstmt = _conn.prepareStatement("SELECT ?");
PGobject pgo = new PGobject();
@@ -78,6 +85,7 @@ public class CompositeTest extends TestCase {
assertEquals(pgo, pgo2);
}
+ @Test
public void testComplexArgumentSelect() throws SQLException {
PreparedStatement pstmt = _conn.prepareStatement("SELECT ?");
PGobject pgo = new PGobject();
@@ -90,6 +98,7 @@ public class CompositeTest extends TestCase {
assertEquals(pgo, pgo2);
}
+ @Test
public void testCompositeFromTable() throws SQLException {
PreparedStatement pstmt = _conn.prepareStatement("INSERT INTO compositetabletest VALUES(?, ?)");
PGobject pgo1 = new PGobject();
@@ -124,6 +133,7 @@ public class CompositeTest extends TestCase {
pgo3.getValue());
}
+ @Test
public void testNullArrayElement() throws SQLException {
PreparedStatement pstmt =
_conn.prepareStatement("SELECT array[NULL, NULL]::compositetabletest[]");
@@ -137,6 +147,7 @@ public class CompositeTest extends TestCase {
assertNull(items[1]);
}
+ @Test
public void testTableMetadata() throws SQLException {
PreparedStatement pstmt = _conn.prepareStatement("INSERT INTO compositetabletest VALUES(?, ?)");
PGobject pgo1 = new PGobject();
@@ -156,6 +167,7 @@ public class CompositeTest extends TestCase {
assertEquals("compositetabletest", name);
}
+ @Test
public void testComplexTableNameMetadata() throws SQLException {
PreparedStatement pstmt = _conn.prepareStatement("INSERT INTO \"Composites\".\"Table\" VALUES(?, ?)");
PGobject pgo1 = new PGobject();
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc3/DatabaseMetaDataTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc3/DatabaseMetaDataTest.java
index 212c42e..9c5d889 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc3/DatabaseMetaDataTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc3/DatabaseMetaDataTest.java
@@ -5,9 +5,14 @@
package org.postgresql.test.jdbc3;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
import org.postgresql.test.TestUtil;
-import junit.framework.TestCase;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
@@ -15,37 +20,28 @@ import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.Types;
-public class DatabaseMetaDataTest extends TestCase {
+public class DatabaseMetaDataTest {
private Connection _conn;
- public DatabaseMetaDataTest(String name) {
- super(name);
- }
-
- protected void setUp() throws Exception {
+ @Before
+ public void setUp() throws Exception {
_conn = TestUtil.openDB();
- if (TestUtil.haveMinimumServerVersion(_conn, "7.3")) {
- Statement stmt = _conn.createStatement();
- stmt.execute("CREATE DOMAIN mydom AS int");
- stmt.execute("CREATE TABLE domtab (a mydom)");
- }
+ Statement stmt = _conn.createStatement();
+ stmt.execute("CREATE DOMAIN mydom AS int");
+ stmt.execute("CREATE TABLE domtab (a mydom)");
}
- protected void tearDown() throws Exception {
- if (TestUtil.haveMinimumServerVersion(_conn, "7.3")) {
- Statement stmt = _conn.createStatement();
- stmt.execute("DROP TABLE domtab");
- stmt.execute("DROP DOMAIN mydom");
- }
+ @After
+ public void tearDown() throws Exception {
+ Statement stmt = _conn.createStatement();
+ stmt.execute("DROP TABLE domtab");
+ stmt.execute("DROP DOMAIN mydom");
TestUtil.closeDB(_conn);
}
+ @Test
public void testGetColumnsForDomain() throws Exception {
- if (!TestUtil.haveMinimumServerVersion(_conn, "7.3")) {
- return;
- }
-
DatabaseMetaData dbmd = _conn.getMetaData();
ResultSet rs = dbmd.getColumns("%", "%", "domtab", "%");
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc3/GeneratedKeysTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc3/GeneratedKeysTest.java
index 6e6f74a..7cca349 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc3/GeneratedKeysTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc3/GeneratedKeysTest.java
@@ -12,9 +12,13 @@ import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
+import org.postgresql.PGStatement;
+import org.postgresql.core.ServerVersion;
import org.postgresql.test.TestUtil;
import org.postgresql.test.jdbc2.BaseTest4;
+import org.postgresql.util.PSQLState;
+import org.junit.Assume;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
@@ -66,16 +70,19 @@ public class GeneratedKeysTest extends BaseTest4 {
private final ReturningInQuery returningInQuery;
private final String returningClause;
- public GeneratedKeysTest(ReturningInQuery returningInQuery) throws Exception {
+ public GeneratedKeysTest(ReturningInQuery returningInQuery, BinaryMode binaryMode) throws Exception {
this.returningInQuery = returningInQuery;
this.returningClause = returningInQuery.getClause();
+ setBinaryMode(binaryMode);
}
- @Parameterized.Parameters(name = "returningInQuery = {0}")
+ @Parameterized.Parameters(name = "returningInQuery = {0}, binary = {1}")
public static Iterable<Object[]> data() {
Collection<Object[]> ids = new ArrayList<Object[]>();
for (ReturningInQuery returningInQuery : ReturningInQuery.values()) {
- ids.add(new Object[]{returningInQuery});
+ for (BinaryMode binaryMode : BinaryMode.values()) {
+ ids.add(new Object[]{returningInQuery, binaryMode});
+ }
}
return ids;
}
@@ -83,7 +90,7 @@ public class GeneratedKeysTest extends BaseTest4 {
@Override
public void setUp() throws Exception {
super.setUp();
- TestUtil.createTempTable(con, "genkeys", "a serial, b text, c int");
+ TestUtil.createTempTable(con, "genkeys", "a serial, b varchar(5), c int");
}
@Override
@@ -193,7 +200,7 @@ public class GeneratedKeysTest extends BaseTest4 {
public void testSerialWorks() throws SQLException {
Statement stmt = con.createStatement();
int count = stmt.executeUpdate(
- "INSERT INTO genkeys (b,c) VALUES ('a', 2), ('b', 4)" + returningClause + "; ",
+ "INSERT/*fool parser*/ INTO genkeys (b,c) VALUES ('a', 2), ('b', 4)" + returningClause + "; ",
new String[]{"a"});
assertEquals(2, count);
ResultSet rs = stmt.getGeneratedKeys();
@@ -218,6 +225,37 @@ public class GeneratedKeysTest extends BaseTest4 {
}
@Test
+ public void testWithInsertInsert() throws SQLException {
+ assumeMinimumServerVersion(ServerVersion.v9_1);
+ Statement stmt = con.createStatement();
+ int count = stmt.executeUpdate(
+ "WITH x as (INSERT INTO genkeys (b,c) VALUES ('a', 2) returning c) insert into genkeys(a,b,c) VALUES (1, 'a', 2)" + returningClause + "",
+ new String[]{"c", "b"});
+ assertEquals(1, count);
+ ResultSet rs = stmt.getGeneratedKeys();
+ assertTrue(rs.next());
+ assertCB1(rs);
+ assertTrue(!rs.next());
+ }
+
+ @Test
+ public void testWithInsertSelect() throws SQLException {
+ assumeMinimumServerVersion(ServerVersion.v9_1);
+ Assume.assumeTrue(returningInQuery != ReturningInQuery.NO);
+ Statement stmt = con.createStatement();
+ int count = stmt.executeUpdate(
+ "WITH x as (INSERT INTO genkeys(a,b,c) VALUES (1, 'a', 2) " + returningClause
+ + ") select * from x",
+ new String[]{"c", "b"});
+ assertEquals("rowcount", -1, count);
+ // TODO: should SELECT produce rows through getResultSet or getGeneratedKeys?
+ ResultSet rs = stmt.getResultSet();
+ assertTrue(rs.next());
+ assertCB1(rs);
+ assertTrue(!rs.next());
+ }
+
+ @Test
public void testDelete() throws SQLException {
Statement stmt = con.createStatement();
stmt.executeUpdate("INSERT INTO genkeys VALUES (1, 'a', 2)");
@@ -447,5 +485,36 @@ public class GeneratedKeysTest extends BaseTest4 {
s.close();
}
+ @Test
+ public void breakDescribeOnFirstServerPreparedExecution() throws SQLException {
+ // Test code is adapted from https://github.com/pgjdbc/pgjdbc/issues/811#issuecomment-352468388
+
+ PreparedStatement ps =
+ con.prepareStatement("insert into genkeys(b) values(?)" + returningClause,
+ Statement.RETURN_GENERATED_KEYS);
+ ps.setString(1, "TEST");
+
+ // The below "prepareThreshold - 1" executions ensure that bind failure would happen
+ // exactly on prepareThreshold execution (the first one when server flips to server-prepared)
+ int prepareThreshold = ps.unwrap(PGStatement.class).getPrepareThreshold();
+ for (int i = 0; i < prepareThreshold - 1; i++) {
+ ps.executeUpdate();
+ }
+ try {
+ // Send a value that's too long on the 5th request
+ ps.setString(1, "TESTTESTTEST");
+ ps.executeUpdate();
+ } catch (SQLException e) {
+ // Expected error: org.postgresql.util.PSQLException: ERROR: value
+ // too long for type character varying(10)
+ if (!PSQLState.STRING_DATA_RIGHT_TRUNCATION.getState().equals(e.getSQLState())) {
+ throw e;
+ }
+ }
+ // Send a valid value on the next request
+ ps.setString(1, "TEST");
+ ps.executeUpdate();
+ }
+
}
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc3/Jdbc3BlobTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc3/Jdbc3BlobTest.java
index ed6a841..21f5d27 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc3/Jdbc3BlobTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc3/Jdbc3BlobTest.java
@@ -5,9 +5,16 @@
package org.postgresql.test.jdbc3;
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import org.postgresql.core.ServerVersion;
import org.postgresql.test.TestUtil;
-import junit.framework.TestCase;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
@@ -18,25 +25,23 @@ import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
-import java.util.Arrays;
-public class Jdbc3BlobTest extends TestCase {
- Connection _conn;
- private final static String TABLE = "blobtest";
- private final static String INSERT = "INSERT INTO " + TABLE + " VALUES (1, lo_creat(-1))";
- private final static String SELECT = "SELECT ID, DATA FROM " + TABLE + " WHERE ID = 1";
+public class Jdbc3BlobTest {
+ private static final String TABLE = "blobtest";
+ private static final String INSERT = "INSERT INTO " + TABLE + " VALUES (1, lo_creat(-1))";
+ private static final String SELECT = "SELECT ID, DATA FROM " + TABLE + " WHERE ID = 1";
- public Jdbc3BlobTest(String name) {
- super(name);
- }
+ private Connection _conn;
- protected void setUp() throws Exception {
+ @Before
+ public void setUp() throws Exception {
_conn = TestUtil.openDB();
TestUtil.createTable(_conn, TABLE, "ID INT PRIMARY KEY, DATA OID");
_conn.setAutoCommit(false);
}
- protected void tearDown() throws SQLException {
+ @After
+ public void tearDown() throws SQLException {
_conn.setAutoCommit(true);
try {
Statement stmt = _conn.createStatement();
@@ -57,6 +62,7 @@ public class Jdbc3BlobTest extends TestCase {
/**
* Test the writing and reading of a single byte.
*/
+ @Test
public void test1Byte() throws SQLException {
byte[] data = {(byte) 'a'};
readWrite(data);
@@ -65,6 +71,7 @@ public class Jdbc3BlobTest extends TestCase {
/**
* Test the writing and reading of a few bytes.
*/
+ @Test
public void testManyBytes() throws SQLException {
byte[] data = "aaaaaaaaaa".getBytes();
readWrite(data);
@@ -73,6 +80,7 @@ public class Jdbc3BlobTest extends TestCase {
/**
* Test writing a single byte with an offset.
*/
+ @Test
public void test1ByteOffset() throws SQLException {
byte[] data = {(byte) 'a'};
readWrite(10, data);
@@ -81,6 +89,7 @@ public class Jdbc3BlobTest extends TestCase {
/**
* Test the writing and reading of a few bytes with an offset.
*/
+ @Test
public void testManyBytesOffset() throws SQLException {
byte[] data = "aaaaaaaaaa".getBytes();
readWrite(10, data);
@@ -89,6 +98,7 @@ public class Jdbc3BlobTest extends TestCase {
/**
* Tests all of the byte values from 0 - 255.
*/
+ @Test
public void testAllBytes() throws SQLException {
byte[] data = new byte[256];
for (int i = 0; i < data.length; i++) {
@@ -97,12 +107,13 @@ public class Jdbc3BlobTest extends TestCase {
readWrite(data);
}
+ @Test
public void testTruncate() throws SQLException {
- if (!TestUtil.haveMinimumServerVersion(_conn, "8.3")) {
+ if (!TestUtil.haveMinimumServerVersion(_conn, ServerVersion.v8_3)) {
return;
}
- byte data[] = new byte[100];
+ byte[] data = new byte[100];
for (byte i = 0; i < data.length; i++) {
data[i] = i;
}
@@ -149,7 +160,6 @@ public class Jdbc3BlobTest extends TestCase {
* @throws SQLException if something goes wrong
*/
public void readWrite(int offset, byte[] data) throws SQLException {
-
PreparedStatement ps = _conn.prepareStatement(INSERT);
ps.executeUpdate();
ps.close();
@@ -170,7 +180,7 @@ public class Jdbc3BlobTest extends TestCase {
assertTrue(rs.next());
b = rs.getBlob("DATA");
byte[] rspData = b.getBytes(offset, data.length);
- assertTrue("Request should be the same as the response", Arrays.equals(data, rspData));
+ assertArrayEquals("Request should be the same as the response", data, rspData);
rs.close();
ps.close();
@@ -180,6 +190,7 @@ public class Jdbc3BlobTest extends TestCase {
/**
* Test the writing and reading of a single byte.
*/
+ @Test
public void test1ByteStream() throws SQLException, IOException {
byte[] data = {(byte) 'a'};
readWriteStream(data);
@@ -188,6 +199,7 @@ public class Jdbc3BlobTest extends TestCase {
/**
* Test the writing and reading of a few bytes.
*/
+ @Test
public void testManyBytesStream() throws SQLException, IOException {
byte[] data = "aaaaaaaaaa".getBytes();
readWriteStream(data);
@@ -196,6 +208,7 @@ public class Jdbc3BlobTest extends TestCase {
/**
* Test writing a single byte with an offset.
*/
+ @Test
public void test1ByteOffsetStream() throws SQLException, IOException {
byte[] data = {(byte) 'a'};
readWriteStream(10, data);
@@ -204,6 +217,7 @@ public class Jdbc3BlobTest extends TestCase {
/**
* Test the writing and reading of a few bytes with an offset.
*/
+ @Test
public void testManyBytesOffsetStream() throws SQLException, IOException {
byte[] data = "aaaaaaaaaa".getBytes();
readWriteStream(10, data);
@@ -212,6 +226,7 @@ public class Jdbc3BlobTest extends TestCase {
/**
* Tests all of the byte values from 0 - 255.
*/
+ @Test
public void testAllBytesStream() throws SQLException, IOException {
byte[] data = new byte[256];
for (int i = 0; i < data.length; i++) {
@@ -229,7 +244,6 @@ public class Jdbc3BlobTest extends TestCase {
* Reads then writes data to the blob via a stream.
*/
public void readWriteStream(int offset, byte[] data) throws SQLException, IOException {
-
PreparedStatement ps = _conn.prepareStatement(INSERT);
ps.executeUpdate();
ps.close();
@@ -258,12 +272,13 @@ public class Jdbc3BlobTest extends TestCase {
in.read(rspData);
in.close();
- assertTrue("Request should be the same as the response", Arrays.equals(data, rspData));
+ assertArrayEquals("Request should be the same as the response", data, rspData);
rs.close();
ps.close();
}
+ @Test
public void testPattern() throws SQLException {
byte[] data = "abcdefghijklmnopqrstuvwxyx0123456789".getBytes();
byte[] pattern = "def".getBytes();
@@ -289,10 +304,9 @@ public class Jdbc3BlobTest extends TestCase {
b = rs.getBlob("DATA");
long position = b.position(pattern, 1);
byte[] rspData = b.getBytes(position, pattern.length);
- assertTrue("Request should be the same as the response", Arrays.equals(pattern, rspData));
+ assertArrayEquals("Request should be the same as the response", pattern, rspData);
rs.close();
ps.close();
-
}
}
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc3/Jdbc3CallableStatementTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc3/Jdbc3CallableStatementTest.java
index 539a0e0..10157d4 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc3/Jdbc3CallableStatementTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc3/Jdbc3CallableStatementTest.java
@@ -7,9 +7,11 @@ package org.postgresql.test.jdbc3;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
+import org.postgresql.test.TestUtil;
import org.postgresql.test.jdbc2.BaseTest4;
import org.postgresql.util.PSQLState;
@@ -28,11 +30,7 @@ import java.sql.Types;
*/
public class Jdbc3CallableStatementTest extends BaseTest4 {
- /*
- * (non-Javadoc)
- *
- * @see junit.framework.TestCase#setUp()
- */
+ @Override
public void setUp() throws Exception {
super.setUp();
Statement stmt = con.createStatement();
@@ -45,6 +43,10 @@ public class Jdbc3CallableStatementTest extends BaseTest4 {
"CREATE OR REPLACE FUNCTION myiofunc(a INOUT int, b OUT int) AS 'BEGIN b := a; a := 1; END;' LANGUAGE plpgsql");
stmt.execute(
"CREATE OR REPLACE FUNCTION myif(a INOUT int, b IN int) AS 'BEGIN a := b; END;' LANGUAGE plpgsql");
+ stmt.execute(
+ "CREATE OR REPLACE FUNCTION mynoparams() returns int AS 'BEGIN return 733; END;' LANGUAGE plpgsql");
+ stmt.execute(
+ "CREATE OR REPLACE FUNCTION mynoparamsproc() returns void AS 'BEGIN NULL; END;' LANGUAGE plpgsql");
stmt.execute("create or replace function "
+ "Numeric_Proc( OUT IMAX NUMERIC(30,15), OUT IMIN NUMERIC(30,15), OUT INUL NUMERIC(30,15)) as "
@@ -81,17 +83,10 @@ public class Jdbc3CallableStatementTest extends BaseTest4 {
+ "pc := pa + 1;"
+ "end;'"
+ "LANGUAGE plpgsql VOLATILE;"
-
);
-
-
}
- /*
- * (non-Javadoc)
- *
- * @see junit.framework.TestCase#tearDown()
- */
+ @Override
public void tearDown() throws SQLException {
Statement stmt = con.createStatement();
stmt.execute("drop function Numeric_Proc(out decimal, out decimal, out decimal)");
@@ -100,6 +95,8 @@ public class Jdbc3CallableStatementTest extends BaseTest4 {
stmt.execute("drop function mysum(a int, b int)");
stmt.execute("drop function myiofunc(a INOUT int, b OUT int) ");
stmt.execute("drop function myif(a INOUT int, b IN int)");
+ stmt.execute("drop function mynoparams()");
+ stmt.execute("drop function mynoparamsproc()");
stmt.close();
super.tearDown();
}
@@ -118,7 +115,6 @@ public class Jdbc3CallableStatementTest extends BaseTest4 {
@Test
public void testNotEnoughParameters() throws Throwable {
-
assumeCallableStatementsSupported();
CallableStatement cs = con.prepareCall("{call myiofunc(?,?)}");
cs.setInt(1, 2);
@@ -134,7 +130,6 @@ public class Jdbc3CallableStatementTest extends BaseTest4 {
@Test
public void testTooManyParameters() throws Throwable {
-
CallableStatement cs = con.prepareCall("{call myif(?,?)}");
try {
cs.setInt(1, 1);
@@ -151,7 +146,6 @@ public class Jdbc3CallableStatementTest extends BaseTest4 {
@Test
public void testAllInOut() throws Throwable {
-
CallableStatement call = con.prepareCall("{ call test_allinout(?,?,?) }");
call.registerOutParameter(1, Types.INTEGER);
@@ -178,22 +172,20 @@ public class Jdbc3CallableStatementTest extends BaseTest4 {
call.registerOutParameter(3, Types.NUMERIC, 15);
call.executeUpdate();
- java.math.BigDecimal ret = call.getBigDecimal(1);
+ BigDecimal ret = call.getBigDecimal(1);
assertTrue(
"correct return from getNumeric () should be 999999999999999.000000000000000 but returned "
+ ret.toString(),
- ret.equals(new java.math.BigDecimal("999999999999999.000000000000000")));
+ ret.equals(new BigDecimal("999999999999999.000000000000000")));
ret = call.getBigDecimal(2);
assertTrue("correct return from getNumeric ()",
- ret.equals(new java.math.BigDecimal("0.000000000000001")));
+ ret.equals(new BigDecimal("0.000000000000001")));
try {
ret = call.getBigDecimal(3);
} catch (NullPointerException ex) {
assertTrue("This should be null", call.wasNull());
}
-
-
}
@Test
@@ -226,11 +218,11 @@ public class Jdbc3CallableStatementTest extends BaseTest4 {
cstmt.registerOutParameter(3, Types.DECIMAL);
cstmt.executeUpdate();
BigDecimal val = (BigDecimal) cstmt.getObject(1);
- assertTrue(val.compareTo(new BigDecimal("999999999999999.000000000000000")) == 0);
+ assertEquals(0, val.compareTo(new BigDecimal("999999999999999.000000000000000")));
val = (BigDecimal) cstmt.getObject(2);
- assertTrue(val.compareTo(new BigDecimal("0.000000000000001")) == 0);
+ assertEquals(0, val.compareTo(new BigDecimal("0.000000000000001")));
val = (BigDecimal) cstmt.getObject(3);
- assertTrue(val == null);
+ assertNull(val);
} catch (Exception ex) {
fail(ex.getMessage());
} finally {
@@ -262,7 +254,6 @@ public class Jdbc3CallableStatementTest extends BaseTest4 {
throw ex;
}
try {
- String str = Boolean.TRUE.toString();
CallableStatement cstmt = con.prepareCall("{ call updatevarchar(?,?) }");
cstmt.setObject(1, Boolean.TRUE, Types.VARCHAR);
cstmt.setObject(2, Boolean.FALSE, Types.VARCHAR);
@@ -409,9 +400,9 @@ public class Jdbc3CallableStatementTest extends BaseTest4 {
cstmt.registerOutParameter(2, Types.LONGVARCHAR);
cstmt.executeUpdate();
String val = (String) cstmt.getObject(1);
- assertTrue(val.equals("testdata"));
+ assertEquals("testdata", val);
val = (String) cstmt.getObject(2);
- assertTrue(val == null);
+ assertNull(val);
cstmt.close();
cstmt = con.prepareCall("{ call lvarchar_in_name(?) }");
String maxFloat = "3.4E38";
@@ -468,11 +459,11 @@ public class Jdbc3CallableStatementTest extends BaseTest4 {
cstmt.executeUpdate();
byte[] retval = cstmt.getBytes(1);
for (int i = 0; i < testdata.length; i++) {
- assertTrue(testdata[i] == retval[i]);
+ assertEquals(testdata[i], retval[i]);
}
retval = cstmt.getBytes(2);
- assertTrue(retval == null);
+ assertNull(retval);
} catch (Exception ex) {
fail(ex.getMessage());
} finally {
@@ -641,11 +632,11 @@ public class Jdbc3CallableStatementTest extends BaseTest4 {
cstmt.executeUpdate();
byte[] retval = cstmt.getBytes(1);
for (int i = 0; i < testdata.length; i++) {
- assertTrue(testdata[i] == retval[i]);
+ assertEquals(testdata[i], retval[i]);
}
retval = cstmt.getBytes(2);
- assertTrue(retval == null);
+ assertNull(retval);
} catch (Exception ex) {
fail(ex.getMessage());
} finally {
@@ -803,8 +794,8 @@ public class Jdbc3CallableStatementTest extends BaseTest4 {
cstmt.registerOutParameter(2, java.sql.Types.SMALLINT);
cstmt.registerOutParameter(3, java.sql.Types.SMALLINT);
cstmt.executeUpdate();
- assertTrue(cstmt.getShort(1) == 32767);
- assertTrue(cstmt.getShort(2) == -32768);
+ assertEquals(32767, cstmt.getShort(1));
+ assertEquals(-32768, cstmt.getShort(2));
cstmt.getShort(3);
assertTrue(cstmt.wasNull());
} catch (Exception ex) {
@@ -844,8 +835,8 @@ public class Jdbc3CallableStatementTest extends BaseTest4 {
cstmt.registerOutParameter(2, java.sql.Types.INTEGER);
cstmt.registerOutParameter(3, java.sql.Types.INTEGER);
cstmt.executeUpdate();
- assertTrue(cstmt.getInt(1) == 2147483647);
- assertTrue(cstmt.getInt(2) == -2147483648);
+ assertEquals(2147483647, cstmt.getInt(1));
+ assertEquals(-2147483648, cstmt.getInt(2));
cstmt.getInt(3);
assertTrue(cstmt.wasNull());
} catch (Exception ex) {
@@ -885,8 +876,8 @@ public class Jdbc3CallableStatementTest extends BaseTest4 {
cstmt.registerOutParameter(2, java.sql.Types.BIGINT);
cstmt.registerOutParameter(3, java.sql.Types.BIGINT);
cstmt.executeUpdate();
- assertTrue(cstmt.getLong(1) == 9223372036854775807L);
- assertTrue(cstmt.getLong(2) == -9223372036854775808L);
+ assertEquals(9223372036854775807L, cstmt.getLong(1));
+ assertEquals(-9223372036854775808L, cstmt.getLong(2));
cstmt.getLong(3);
assertTrue(cstmt.wasNull());
} catch (Exception ex) {
@@ -967,8 +958,8 @@ public class Jdbc3CallableStatementTest extends BaseTest4 {
cstmt.registerOutParameter(2, java.sql.Types.TINYINT);
cstmt.registerOutParameter(3, java.sql.Types.TINYINT);
cstmt.executeUpdate();
- assertTrue(cstmt.getByte(1) == 127);
- assertTrue(cstmt.getByte(2) == -128);
+ assertEquals(127, cstmt.getByte(1));
+ assertEquals(-128, cstmt.getByte(2));
cstmt.getByte(3);
assertTrue(cstmt.wasNull());
} catch (Exception ex) {
@@ -1008,4 +999,40 @@ public class Jdbc3CallableStatementTest extends BaseTest4 {
assertEquals("2+3 should be 5 when executed via {?= call mysum(?, ?)}", 5, cs.getInt(1));
}
+ @Test
+ public void testFunctionNoParametersWithParentheses() throws SQLException {
+ assumeCallableStatementsSupported();
+ CallableStatement cs = con.prepareCall("{?= call mynoparams()}");
+ cs.registerOutParameter(1, Types.INTEGER);
+ cs.execute();
+ assertEquals("{?= call mynoparam()} should return 733, but did not.", 733, cs.getInt(1));
+ TestUtil.closeQuietly(cs);
+ }
+
+ @Test
+ public void testFunctionNoParametersWithoutParentheses() throws SQLException {
+ assumeCallableStatementsSupported();
+ CallableStatement cs = con.prepareCall("{?= call mynoparams}");
+ cs.registerOutParameter(1, Types.INTEGER);
+ cs.execute();
+ assertEquals("{?= call mynoparam()} should return 733, but did not.", 733, cs.getInt(1));
+ TestUtil.closeQuietly(cs);
+ }
+
+ @Test
+ public void testProcedureNoParametersWithParentheses() throws SQLException {
+ assumeCallableStatementsSupported();
+ CallableStatement cs = con.prepareCall("{ call mynoparamsproc()}");
+ cs.execute();
+ TestUtil.closeQuietly(cs);
+ }
+
+ @Test
+ public void testProcedureNoParametersWithoutParentheses() throws SQLException {
+ assumeCallableStatementsSupported();
+ CallableStatement cs = con.prepareCall("{ call mynoparamsproc}");
+ cs.execute();
+ TestUtil.closeQuietly(cs);
+ }
+
}
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc3/Jdbc3SavepointTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc3/Jdbc3SavepointTest.java
index 5c4d784..b86026f 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc3/Jdbc3SavepointTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc3/Jdbc3SavepointTest.java
@@ -5,9 +5,14 @@
package org.postgresql.test.jdbc3;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
import org.postgresql.test.TestUtil;
-import junit.framework.TestCase;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
import java.sql.Connection;
import java.sql.PreparedStatement;
@@ -16,28 +21,26 @@ import java.sql.SQLException;
import java.sql.Savepoint;
import java.sql.Statement;
-public class Jdbc3SavepointTest extends TestCase {
+public class Jdbc3SavepointTest {
private Connection _conn;
- public Jdbc3SavepointTest(String name) {
- super(name);
- }
-
- protected void setUp() throws Exception {
+ @Before
+ public void setUp() throws Exception {
_conn = TestUtil.openDB();
TestUtil.createTable(_conn, "savepointtable", "id int primary key");
_conn.setAutoCommit(false);
}
- protected void tearDown() throws SQLException {
+ @After
+ public void tearDown() throws SQLException {
_conn.setAutoCommit(true);
TestUtil.dropTable(_conn, "savepointtable");
TestUtil.closeDB(_conn);
}
private boolean hasSavepoints() throws SQLException {
- return TestUtil.haveMinimumServerVersion(_conn, "8.0");
+ return true;
}
private void addRow(int id) throws SQLException {
@@ -56,6 +59,7 @@ public class Jdbc3SavepointTest extends TestCase {
return count;
}
+ @Test
public void testAutoCommitFails() throws SQLException {
if (!hasSavepoints()) {
return;
@@ -76,6 +80,7 @@ public class Jdbc3SavepointTest extends TestCase {
}
}
+ @Test
public void testCantMixSavepointTypes() throws SQLException {
if (!hasSavepoints()) {
return;
@@ -98,6 +103,7 @@ public class Jdbc3SavepointTest extends TestCase {
}
+ @Test
public void testRollingBackToSavepoints() throws SQLException {
if (!hasSavepoints()) {
return;
@@ -115,6 +121,7 @@ public class Jdbc3SavepointTest extends TestCase {
assertEquals(0, countRows());
}
+ @Test
public void testGlobalRollbackWorks() throws SQLException {
if (!hasSavepoints()) {
return;
@@ -130,6 +137,7 @@ public class Jdbc3SavepointTest extends TestCase {
assertEquals(0, countRows());
}
+ @Test
public void testContinueAfterError() throws SQLException {
if (!hasSavepoints()) {
return;
@@ -149,6 +157,7 @@ public class Jdbc3SavepointTest extends TestCase {
assertEquals(2, countRows());
}
+ @Test
public void testReleaseSavepoint() throws SQLException {
if (!hasSavepoints()) {
return;
@@ -171,6 +180,7 @@ public class Jdbc3SavepointTest extends TestCase {
}
}
+ @Test
public void testComplicatedSavepointName() throws SQLException {
if (!hasSavepoints()) {
return;
@@ -181,6 +191,7 @@ public class Jdbc3SavepointTest extends TestCase {
_conn.releaseSavepoint(savepoint);
}
+ @Test
public void testRollingBackToInvalidSavepointFails() throws SQLException {
if (!hasSavepoints()) {
return;
@@ -197,6 +208,7 @@ public class Jdbc3SavepointTest extends TestCase {
}
}
+ @Test
public void testRollbackMultipleTimes() throws SQLException {
if (!hasSavepoints()) {
return;
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc3/Jdbc3TestSuite.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc3/Jdbc3TestSuite.java
index 6389cd0..a90abf6 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc3/Jdbc3TestSuite.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc3/Jdbc3TestSuite.java
@@ -5,44 +5,26 @@
package org.postgresql.test.jdbc3;
-import org.postgresql.test.TestUtil;
-
-import junit.framework.JUnit4TestAdapter;
-import junit.framework.TestSuite;
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
/*
* Executes all known tests for JDBC3
*/
-public class Jdbc3TestSuite extends TestSuite {
-
- /*
- * The main entry point for JUnit
- */
- public static TestSuite suite() throws Exception {
- Class.forName("org.postgresql.Driver");
- TestSuite suite = new TestSuite();
- try {
- java.sql.Connection con = TestUtil.openDB();
+ at RunWith(Suite.class)
+ at Suite.SuiteClasses({
+ Jdbc3CallableStatementTest.class,
+ GeneratedKeysTest.class,
+ CompositeQueryParseTest.class,
+ SqlCommandParseTest.class,
+ Jdbc3SavepointTest.class,
+ TypesTest.class,
+ ResultSetTest.class,
+ ParameterMetaDataTest.class,
+ Jdbc3BlobTest.class,
+ DatabaseMetaDataTest.class,
+ SendRecvBufferSizeTest.class,
+ StringTypeParameterTest.class})
+public class Jdbc3TestSuite {
- if (TestUtil.haveMinimumServerVersion(con, "8.1") && TestUtil.isProtocolVersion(con, 3)) {
- suite.addTest(new JUnit4TestAdapter(Jdbc3CallableStatementTest.class));
- }
- if (TestUtil.haveMinimumServerVersion(con, "8.2")) {
- suite.addTest(new JUnit4TestAdapter(GeneratedKeysTest.class));
- }
- con.close();
- } catch (Exception ex) {
- ex.printStackTrace();
- }
- suite.addTestSuite(CompositeQueryParseTest.class);
- suite.addTestSuite(Jdbc3SavepointTest.class);
- suite.addTest(new JUnit4TestAdapter(TypesTest.class));
- suite.addTestSuite(ResultSetTest.class);
- suite.addTest(new JUnit4TestAdapter(ParameterMetaDataTest.class));
- suite.addTestSuite(Jdbc3BlobTest.class);
- suite.addTestSuite(DatabaseMetaDataTest.class);
- suite.addTestSuite(SendRecvBufferSizeTest.class);
- suite.addTestSuite(StringTypeParameterTest.class);
- return suite;
- }
}
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc3/ParameterMetaDataTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc3/ParameterMetaDataTest.java
index 90ccbc5..bafd44c 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc3/ParameterMetaDataTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc3/ParameterMetaDataTest.java
@@ -41,10 +41,6 @@ public class ParameterMetaDataTest extends BaseTest4 {
@Test
public void testParameterMD() throws SQLException {
- if (!TestUtil.isProtocolVersion(con, 3)) {
- return;
- }
-
PreparedStatement pstmt =
con.prepareStatement("SELECT a FROM parametertest WHERE b = ? AND c = ? AND d >^ ? ");
ParameterMetaData pmd = pstmt.getParameterMetaData();
@@ -65,10 +61,6 @@ public class ParameterMetaDataTest extends BaseTest4 {
@Test
public void testFailsOnBadIndex() throws SQLException {
- if (!TestUtil.isProtocolVersion(con, 3)) {
- return;
- }
-
PreparedStatement pstmt =
con.prepareStatement("SELECT a FROM parametertest WHERE b = ? AND c = ?");
ParameterMetaData pmd = pstmt.getParameterMetaData();
@@ -87,10 +79,6 @@ public class ParameterMetaDataTest extends BaseTest4 {
// Make sure we work when mashing two queries into a single statement.
@Test
public void testMultiStatement() throws SQLException {
- if (!TestUtil.isProtocolVersion(con, 3)) {
- return;
- }
-
PreparedStatement pstmt = con.prepareStatement(
"SELECT a FROM parametertest WHERE b = ? AND c = ? ; SELECT b FROM parametertest WHERE a = ?");
ParameterMetaData pmd = pstmt.getParameterMetaData();
@@ -113,10 +101,6 @@ public class ParameterMetaDataTest extends BaseTest4 {
//
@Test
public void testTypeChangeWithUnknown() throws SQLException {
- if (!TestUtil.isProtocolVersion(con, 3)) {
- return;
- }
-
PreparedStatement pstmt =
con.prepareStatement("SELECT a FROM parametertest WHERE c = ? AND e = ?");
ParameterMetaData pmd = pstmt.getParameterMetaData();
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc3/ResultSetTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc3/ResultSetTest.java
index 83fe041..47072ac 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc3/ResultSetTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc3/ResultSetTest.java
@@ -5,24 +5,26 @@
package org.postgresql.test.jdbc3;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
import org.postgresql.test.TestUtil;
-import junit.framework.TestCase;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
-public class ResultSetTest extends TestCase {
+public class ResultSetTest {
private Connection _conn;
- public ResultSetTest(String name) {
- super(name);
- }
-
- protected void setUp() throws Exception {
+ @Before
+ public void setUp() throws Exception {
_conn = TestUtil.openDB();
Statement stmt = _conn.createStatement();
stmt.execute("CREATE TEMP TABLE hold(a int)");
@@ -31,13 +33,15 @@ public class ResultSetTest extends TestCase {
stmt.close();
}
- protected void tearDown() throws SQLException {
+ @After
+ public void tearDown() throws SQLException {
Statement stmt = _conn.createStatement();
stmt.execute("DROP TABLE hold");
stmt.close();
TestUtil.closeDB(_conn);
}
+ @Test
public void testHoldableResultSet() throws SQLException {
Statement stmt = _conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY,
ResultSet.HOLD_CURSORS_OVER_COMMIT);
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc3/SendRecvBufferSizeTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc3/SendRecvBufferSizeTest.java
index 9ae8f4b..e2e70e3 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc3/SendRecvBufferSizeTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc3/SendRecvBufferSizeTest.java
@@ -7,21 +7,20 @@ package org.postgresql.test.jdbc3;
import org.postgresql.test.TestUtil;
-import junit.framework.TestCase;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
-public class SendRecvBufferSizeTest extends TestCase {
+public class SendRecvBufferSizeTest {
private Connection _conn;
- public SendRecvBufferSizeTest(String name) {
- super(name);
- }
-
- protected void setUp() throws Exception {
+ @Before
+ public void setUp() throws Exception {
System.setProperty("sendBufferSize", "1024");
System.setProperty("receiveBufferSize", "1024");
@@ -33,7 +32,8 @@ public class SendRecvBufferSizeTest extends TestCase {
stmt.close();
}
- protected void tearDown() throws SQLException {
+ @After
+ public void tearDown() throws SQLException {
Statement stmt = _conn.createStatement();
stmt.execute("DROP TABLE hold");
stmt.close();
@@ -42,6 +42,7 @@ public class SendRecvBufferSizeTest extends TestCase {
// dummy test
+ @Test
public void testSelect() throws SQLException {
Statement stmt = _conn.createStatement();
stmt.execute("select * from hold");
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc3/SqlCommandParseTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc3/SqlCommandParseTest.java
new file mode 100644
index 0000000..ac98e87
--- /dev/null
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc3/SqlCommandParseTest.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 2018, PostgreSQL Global Development Group
+ * See the LICENSE file in the project root for more information.
+ */
+
+package org.postgresql.test.jdbc3;
+
+import static org.junit.Assert.assertEquals;
+
+import org.postgresql.core.NativeQuery;
+import org.postgresql.core.Parser;
+import org.postgresql.core.SqlCommandType;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+import java.sql.SQLException;
+import java.util.Arrays;
+import java.util.List;
+
+ at RunWith(Parameterized.class)
+public class SqlCommandParseTest {
+ @Parameterized.Parameter(0)
+ public SqlCommandType type;
+ @Parameterized.Parameter(1)
+ public String sql;
+
+ @Parameterized.Parameters(name = "expected={0}, sql={1}")
+ public static Iterable<Object[]> data() {
+ return Arrays.asList(new Object[][]{
+ {SqlCommandType.INSERT, "insert/**/ into table(select) values(1)"},
+ {SqlCommandType.SELECT, "select'abc'/**/ as insert"},
+ {SqlCommandType.INSERT, "INSERT/*fool /*nest comments -- parser*/*/ INTO genkeys (b,c) VALUES ('a', 2), ('b', 4) SELECT"},
+ {SqlCommandType.INSERT, "with update as (update foo set (a=?,b=?,c=?)) insert into table(select) values(1)"},
+ {SqlCommandType.INSERT, "with update as (update foo set (a=?,b=?,c=?)) insert into table(select) select * from update"},
+ {SqlCommandType.INSERT, "with update as (update foo set (a=?,b=?,c=?)) insert/**/ into table(select) values(1)"},
+ {SqlCommandType.INSERT, "with update as (update foo set (a=?,b=?,c=?)) insert /**/ into table(select) values(1)"},
+ {SqlCommandType.SELECT, "with update as (update foo set (a=?,b=?,c=?)) insert --\nas () select 1"},
+ {SqlCommandType.SELECT, "with update as (update foo set (a=?,b=?,c=?)) insert --\n/* dfhg \n*/\nas () select 1"},
+ {SqlCommandType.SELECT, "WITH x as (INSERT INTO genkeys(a,b,c) VALUES (1, 'a', 2) returning returning a, b) select * from x"},
+ // No idea if it works, but it should be parsed as WITH
+ {SqlCommandType.WITH, "with update as (update foo set (a=?,b=?,c=?)) copy from stdin"},
+ });
+ }
+
+ @Test
+ public void run() throws SQLException {
+ List<NativeQuery> queries;
+ queries = Parser.parseJdbcSql(sql, true, true, false, true);
+ NativeQuery query = queries.get(0);
+ assertEquals(sql, type, query.command.getType());
+ }
+}
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc3/StringTypeParameterTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc3/StringTypeParameterTest.java
index c02c70d..bb1d1d7 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc3/StringTypeParameterTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc3/StringTypeParameterTest.java
@@ -5,119 +5,136 @@
package org.postgresql.test.jdbc3;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import org.postgresql.core.ServerVersion;
+import org.postgresql.jdbc.PreferQueryMode;
import org.postgresql.test.TestUtil;
+import org.postgresql.test.jdbc2.BaseTest4;
+import org.postgresql.util.PSQLState;
-import junit.framework.TestCase;
+import org.junit.Assume;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
-import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
+import java.util.ArrayList;
+import java.util.Collection;
import java.util.Properties;
-public class StringTypeParameterTest extends TestCase {
+ at RunWith(Parameterized.class)
+public class StringTypeParameterTest extends BaseTest4 {
+ private static final String UNSPECIFIED_STRING_TYPE = "unspecified";
+
+ private final String stringType;
- private Connection _conn;
+ public StringTypeParameterTest(String stringType) {
+ this.stringType = stringType;
+ }
- public StringTypeParameterTest(String name) {
- super(name);
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+ // Assume enum supported
+ Assume.assumeTrue(TestUtil.haveMinimumServerVersion(con, ServerVersion.v8_3));
+ TestUtil.createEnumType(con, "mood", "'happy', 'sad'");
+ TestUtil.createTable(con, "stringtypetest", "m mood");
}
- protected void setUp(String stringType) throws Exception {
- Properties props = new Properties();
+ @Override
+ protected void updateProperties(Properties props) {
+ super.updateProperties(props);
if (stringType != null) {
props.put("stringtype", stringType);
}
- _conn = TestUtil.openDB(props);
- TestUtil.createEnumType(_conn, "mood", "'happy', 'sad'");
- TestUtil.createTable(_conn, "stringtypetest", "m mood");
}
- protected void tearDown() throws SQLException {
- if (_conn != null) {
- TestUtil.dropTable(_conn, "stringtypetest");
- TestUtil.dropType(_conn, "mood");
- TestUtil.closeDB(_conn);
- }
+ @Override
+ public void tearDown() throws SQLException {
+ TestUtil.dropTable(con, "stringtypetest");
+ TestUtil.dropType(con, "mood");
+ super.tearDown();
}
- public void testParameterStringTypeVarchar() throws Exception {
- if (!TestUtil.isProtocolVersion(_conn, 3)) {
- return;
+ @Parameterized.Parameters(name = "stringType = {0}")
+ public static Iterable<Object[]> data() {
+ Collection<Object[]> ids = new ArrayList<Object[]>();
+ for (String stringType : new String[]{null, "varchar", UNSPECIFIED_STRING_TYPE}) {
+ ids.add(new Object[]{stringType});
}
- testParameterVarchar("varchar");
+ return ids;
}
- public void testParameterStringTypeNotSet() throws Exception {
- if (!TestUtil.isProtocolVersion(_conn, 3)) {
- return;
+ @Test
+ public void testVarcharAsEnum() throws Exception {
+ Assume.assumeFalse(UNSPECIFIED_STRING_TYPE.equals(stringType));
+ Assume.assumeTrue(preferQueryMode != PreferQueryMode.SIMPLE);
+
+ PreparedStatement update = con.prepareStatement("insert into stringtypetest (m) values (?)");
+ for (int i = 0; i < 2; i++) {
+ update.clearParameters();
+ if (i == 0) {
+ update.setString(1, "sad");
+ } else {
+ update.setObject(1, "sad", Types.VARCHAR);
+ }
+ try {
+ update.executeUpdate();
+ fail("Expected 'column \"m\" is of type mood but expression is of type character varying', "
+ + (i == 0 ? "setString(1, \"sad\")" : "setObject(1, \"sad\", Types.VARCHAR)"));
+ } catch (SQLException e) {
+ // Exception exception is
+ // ERROR: column "m" is of type mood but expression is of type character varying
+ if (!PSQLState.DATATYPE_MISMATCH.getState().equals(e.getSQLState())) {
+ throw e;
+ }
+ }
}
- testParameterVarchar(null);
+ TestUtil.closeQuietly(update);
}
- private void testParameterVarchar(String param) throws Exception {
- setUp(param);
-
- PreparedStatement update = _conn.prepareStatement("insert into stringtypetest (m) values (?)");
- update.setString(1, "sad");
- try {
- update.executeUpdate();
- fail("Expected exception thrown");
- } catch (SQLException e) {
- // expected
- }
-
- update.clearParameters();
- update.setObject(1, "sad", Types.VARCHAR);
- try {
- update.executeUpdate();
- fail("Expected exception thrown");
- } catch (SQLException e) {
- // expected
- }
-
- update.clearParameters();
+ @Test
+ public void testOtherAsEnum() throws Exception {
+ PreparedStatement update = con.prepareStatement("insert into stringtypetest (m) values (?)");
update.setObject(1, "happy", Types.OTHER);
update.executeUpdate();
// all good
- update.close();
+ TestUtil.closeQuietly(update);
+ }
+
+ @Test
+ public void testMultipleEnumBinds() throws Exception {
+ Assume.assumeFalse(UNSPECIFIED_STRING_TYPE.equals(stringType));
+ Assume.assumeTrue(preferQueryMode != PreferQueryMode.SIMPLE);
PreparedStatement query =
- _conn.prepareStatement("select * from stringtypetest where m = ? or m = ?");
+ con.prepareStatement("select * from stringtypetest where m = ? or m = ?");
query.setString(1, "sad");
- try {
- query.executeQuery();
- fail("Expected exception thrown");
- } catch (SQLException e) {
- // expected
- }
-
- query.clearParameters();
query.setObject(2, "sad", Types.VARCHAR);
try {
query.executeQuery();
- fail("Expected exception thrown");
+ fail("Expected 'operator does not exist: mood = character varying'");
} catch (SQLException e) {
- // expected
+ // Exception exception is
+ // ERROR: operator does not exist: mood = character varying
+ if (!PSQLState.UNDEFINED_FUNCTION.getState().equals(e.getSQLState())) {
+ throw e;
+ }
}
-
- query.clearParameters();
- query.setObject(1, "happy", Types.OTHER);
- ResultSet rs = query.executeQuery();
- assertTrue(rs.next());
- assertEquals("happy", rs.getObject("m"));
-
- // all good
- rs.close();
- query.close();
-
+ TestUtil.closeQuietly(query);
}
+ @Test
public void testParameterUnspecified() throws Exception {
- setUp("unspecified");
+ Assume.assumeTrue(UNSPECIFIED_STRING_TYPE.equals(stringType));
- PreparedStatement update = _conn.prepareStatement("insert into stringtypetest (m) values (?)");
+ PreparedStatement update = con.prepareStatement("insert into stringtypetest (m) values (?)");
update.setString(1, "happy");
update.executeUpdate();
// all good
@@ -128,7 +145,7 @@ public class StringTypeParameterTest extends TestCase {
// all good
update.close();
- PreparedStatement query = _conn.prepareStatement("select * from stringtypetest where m = ?");
+ PreparedStatement query = con.prepareStatement("select * from stringtypetest where m = ?");
query.setString(1, "happy");
ResultSet rs = query.executeQuery();
assertTrue(rs.next());
@@ -144,6 +161,5 @@ public class StringTypeParameterTest extends TestCase {
// all good
rs.close();
query.close();
-
}
}
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc4/ArrayTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc4/ArrayTest.java
index 2671f20..dba8f89 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc4/ArrayTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc4/ArrayTest.java
@@ -5,7 +5,9 @@
package org.postgresql.test.jdbc4;
+import org.postgresql.core.ServerVersion;
import org.postgresql.geometric.PGbox;
+import org.postgresql.jdbc.PgConnection;
import org.postgresql.jdbc.PreferQueryMode;
import org.postgresql.test.TestUtil;
import org.postgresql.test.jdbc2.BaseTest4;
@@ -26,6 +28,7 @@ import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collection;
import java.util.UUID;
@@ -47,12 +50,15 @@ public class ArrayTest extends BaseTest4 {
return ids;
}
+ @Override
public void setUp() throws Exception {
super.setUp();
_conn = con;
TestUtil.createTable(_conn, "arrtest",
- "intarr int[], decarr decimal(2,1)[], strarr text[], uuidarr uuid[], floatarr float8[]"
+ "intarr int[], decarr decimal(2,1)[], strarr text[]"
+ + (TestUtil.haveMinimumServerVersion(_conn, ServerVersion.v8_3) ? ", uuidarr uuid[]" : "")
+ + ", floatarr float8[]"
+ ", intarr2 int4[][]");
TestUtil.createTable(_conn, "arrcompprnttest", "id serial, name character(10)");
TestUtil.createTable(_conn, "arrcompchldttest",
@@ -61,6 +67,7 @@ public class ArrayTest extends BaseTest4 {
TestUtil.createTable(_conn, "\"Evil.Table\"", "id serial");
}
+ @Override
public void tearDown() throws SQLException {
TestUtil.dropTable(_conn, "arrtest");
TestUtil.dropTable(_conn, "arrcompprnttest");
@@ -70,9 +77,25 @@ public class ArrayTest extends BaseTest4 {
}
@Test
+ public void testCreateArrayOfBool() throws SQLException {
+ PreparedStatement pstmt = _conn.prepareStatement("SELECT ?::bool[]");
+ pstmt.setArray(1, _conn.unwrap(PgConnection.class).createArrayOf("boolean", new boolean[] { true, true, false }));
+
+ ResultSet rs = pstmt.executeQuery();
+ Assert.assertTrue(rs.next());
+ Array arr = rs.getArray(1);
+ Boolean[] out = (Boolean[]) arr.getArray();
+
+ Assert.assertEquals(3, out.length);
+ Assert.assertEquals(Boolean.TRUE, out[0]);
+ Assert.assertEquals(Boolean.TRUE, out[1]);
+ Assert.assertEquals(Boolean.FALSE, out[2]);
+ }
+
+ @Test
public void testCreateArrayOfInt() throws SQLException {
PreparedStatement pstmt = _conn.prepareStatement("SELECT ?::int[]");
- Integer in[] = new Integer[3];
+ Integer[] in = new Integer[3];
in[0] = 0;
in[1] = -1;
in[2] = 2;
@@ -81,7 +104,7 @@ public class ArrayTest extends BaseTest4 {
ResultSet rs = pstmt.executeQuery();
Assert.assertTrue(rs.next());
Array arr = rs.getArray(1);
- Integer out[] = (Integer[]) arr.getArray();
+ Integer[] out = (Integer[]) arr.getArray();
Assert.assertEquals(3, out.length);
Assert.assertEquals(0, out[0].intValue());
@@ -90,9 +113,29 @@ public class ArrayTest extends BaseTest4 {
}
@Test
+ public void testCreateArrayOfSmallInt() throws SQLException {
+ PreparedStatement pstmt = _conn.prepareStatement("SELECT ?::smallint[]");
+ Short[] in = new Short[3];
+ in[0] = 0;
+ in[1] = -1;
+ in[2] = 2;
+ pstmt.setArray(1, _conn.createArrayOf("int2", in));
+
+ ResultSet rs = pstmt.executeQuery();
+ Assert.assertTrue(rs.next());
+ Array arr = rs.getArray(1);
+ Short[] out = (Short[]) arr.getArray();
+
+ Assert.assertEquals(3, out.length);
+ Assert.assertEquals(0, out[0].shortValue());
+ Assert.assertEquals(-1, out[1].shortValue());
+ Assert.assertEquals(2, out[2].shortValue());
+ }
+
+ @Test
public void testCreateArrayOfMultiString() throws SQLException {
PreparedStatement pstmt = _conn.prepareStatement("SELECT ?::text[]");
- String in[][] = new String[2][2];
+ String[][] in = new String[2][2];
in[0][0] = "a";
in[0][1] = "";
in[1][0] = "\\";
@@ -102,7 +145,7 @@ public class ArrayTest extends BaseTest4 {
ResultSet rs = pstmt.executeQuery();
Assert.assertTrue(rs.next());
Array arr = rs.getArray(1);
- String out[][] = (String[][]) arr.getArray();
+ String[][] out = (String[][]) arr.getArray();
Assert.assertEquals(2, out.length);
Assert.assertEquals(2, out[0].length);
@@ -114,7 +157,7 @@ public class ArrayTest extends BaseTest4 {
@Test
public void testCreateArrayOfMultiJson() throws SQLException {
- if (!TestUtil.haveMinimumServerVersion(_conn, "9.2")) {
+ if (!TestUtil.haveMinimumServerVersion(_conn, ServerVersion.v9_2)) {
return;
}
PreparedStatement pstmt = _conn.prepareStatement("SELECT ?::json[]");
@@ -125,7 +168,7 @@ public class ArrayTest extends BaseTest4 {
PGobject p2 = new PGobject();
p2.setType("json");
p2.setValue("{\"x\": 20}");
- PGobject in[] = new PGobject[] { p1, p2 };
+ PGobject[] in = new PGobject[] { p1, p2 };
pstmt.setArray(1, _conn.createArrayOf("json", in));
ResultSet rs = pstmt.executeQuery();
@@ -141,7 +184,7 @@ public class ArrayTest extends BaseTest4 {
@Test
public void testCreateArrayWithNonStandardDelimiter() throws SQLException {
- PGbox in[] = new PGbox[2];
+ PGbox[] in = new PGbox[2];
in[0] = new PGbox(1, 2, 3, 4);
in[1] = new PGbox(5, 6, 7, 8);
@@ -160,10 +203,6 @@ public class ArrayTest extends BaseTest4 {
@Test
public void testCreateArrayOfNull() throws SQLException {
- if (!TestUtil.haveMinimumServerVersion(_conn, "8.2")) {
- return;
- }
-
String sql = "SELECT ?";
// We must provide the type information for V2 protocol
if (preferQueryMode == PreferQueryMode.SIMPLE) {
@@ -171,7 +210,7 @@ public class ArrayTest extends BaseTest4 {
}
PreparedStatement pstmt = _conn.prepareStatement(sql);
- String in[] = new String[2];
+ String[] in = new String[2];
in[0] = null;
in[1] = null;
pstmt.setArray(1, _conn.createArrayOf("int8", in));
@@ -179,7 +218,7 @@ public class ArrayTest extends BaseTest4 {
ResultSet rs = pstmt.executeQuery();
Assert.assertTrue(rs.next());
Array arr = rs.getArray(1);
- Long out[] = (Long[]) arr.getArray();
+ Long[] out = (Long[]) arr.getArray();
Assert.assertEquals(2, out.length);
Assert.assertNull(out[0]);
@@ -189,13 +228,13 @@ public class ArrayTest extends BaseTest4 {
@Test
public void testCreateEmptyArrayOfIntViaAlias() throws SQLException {
PreparedStatement pstmt = _conn.prepareStatement("SELECT ?::int[]");
- Integer in[] = new Integer[0];
+ Integer[] in = new Integer[0];
pstmt.setArray(1, _conn.createArrayOf("integer", in));
ResultSet rs = pstmt.executeQuery();
Assert.assertTrue(rs.next());
Array arr = rs.getArray(1);
- Integer out[] = (Integer[]) arr.getArray();
+ Integer[] out = (Integer[]) arr.getArray();
Assert.assertEquals(0, out.length);
@@ -205,14 +244,14 @@ public class ArrayTest extends BaseTest4 {
@Test
public void testCreateArrayWithoutServer() throws SQLException {
- String in[][] = new String[2][2];
+ String[][] in = new String[2][2];
in[0][0] = "a";
in[0][1] = "";
in[1][0] = "\\";
in[1][1] = "\"\\'z";
Array arr = _conn.createArrayOf("varchar", in);
- String out[][] = (String[][]) arr.getArray();
+ String[][] out = (String[][]) arr.getArray();
Assert.assertEquals(2, out.length);
Assert.assertEquals(2, out[0].length);
@@ -224,14 +263,14 @@ public class ArrayTest extends BaseTest4 {
@Test
public void testCreatePrimitiveArray() throws SQLException {
- double in[][] = new double[2][2];
+ double[][] in = new double[2][2];
in[0][0] = 3.5;
in[0][1] = -4.5;
in[1][0] = 10.0 / 3;
in[1][1] = 77;
Array arr = _conn.createArrayOf("float8", in);
- Double out[][] = (Double[][]) arr.getArray();
+ Double[][] out = (Double[][]) arr.getArray();
Assert.assertEquals(2, out.length);
Assert.assertEquals(2, out[0].length);
@@ -245,7 +284,8 @@ public class ArrayTest extends BaseTest4 {
public void testUUIDArray() throws SQLException {
Assume.assumeTrue("UUID is not supported in PreferQueryMode.SIMPLE",
preferQueryMode != PreferQueryMode.SIMPLE);
-
+ Assume.assumeTrue("UUID requires PostgreSQL 8.3+",
+ TestUtil.haveMinimumServerVersion(_conn, ServerVersion.v8_3));
UUID uuid1 = UUID.randomUUID();
UUID uuid2 = UUID.randomUUID();
UUID uuid3 = UUID.randomUUID();
@@ -261,7 +301,7 @@ public class ArrayTest extends BaseTest4 {
ResultSet rs = pstmt2.executeQuery();
Assert.assertTrue(rs.next());
Array arr = rs.getArray(1);
- UUID out[] = (UUID[]) arr.getArray();
+ UUID[] out = (UUID[]) arr.getArray();
Assert.assertEquals(3, out.length);
Assert.assertEquals(uuid1, out[0]);
@@ -293,27 +333,33 @@ public class ArrayTest extends BaseTest4 {
@Test
public void testSetObjectFromJavaArray() throws SQLException {
String[] strArray = new String[]{"a", "b", "c"};
+ Object[] objCopy = Arrays.copyOf(strArray, strArray.length, Object[].class);
PreparedStatement pstmt = _conn.prepareStatement("INSERT INTO arrtest(strarr) VALUES (?)");
- // Incorrect, but commonly attempted by many ORMs:
+ //cannot handle generic Object[]
try {
- pstmt.setObject(1, strArray, Types.ARRAY);
+ pstmt.setObject(1, objCopy, Types.ARRAY);
pstmt.executeUpdate();
Assert.fail("setObject() with a Java array parameter and Types.ARRAY shouldn't succeed");
} catch (org.postgresql.util.PSQLException ex) {
// Expected failure.
}
- // Also incorrect, but commonly attempted by many ORMs:
try {
- pstmt.setObject(1, strArray);
+ pstmt.setObject(1, objCopy);
pstmt.executeUpdate();
Assert.fail("setObject() with a Java array parameter and no Types argument shouldn't succeed");
} catch (org.postgresql.util.PSQLException ex) {
// Expected failure.
}
+ pstmt.setObject(1, strArray);
+ pstmt.executeUpdate();
+
+ pstmt.setObject(1, strArray, Types.ARRAY);
+ pstmt.executeUpdate();
+
// Correct way, though the use of "text" as a type is non-portable.
// Only supported for JDK 1.6 and JDBC4
Array sqlArray = _conn.createArrayOf("text", strArray);
@@ -325,6 +371,9 @@ public class ArrayTest extends BaseTest4 {
@Test
public void testGetArrayOfComposites() throws SQLException {
+ Assume.assumeTrue("array_agg(expression) requires PostgreSQL 8.4+",
+ TestUtil.haveMinimumServerVersion(_conn, ServerVersion.v8_4));
+
PreparedStatement insert_parent_pstmt =
_conn.prepareStatement("INSERT INTO arrcompprnttest (name) "
+ "VALUES ('aParent');");
@@ -390,6 +439,9 @@ public class ArrayTest extends BaseTest4 {
@Test
public void testCasingComposite() throws SQLException {
+ Assume.assumeTrue("Arrays of composite types requires PostgreSQL 8.3+",
+ TestUtil.haveMinimumServerVersion(_conn, ServerVersion.v8_3));
+
PGobject cc = new PGobject();
cc.setType("\"CorrectCasing\"");
cc.setValue("(1)");
@@ -437,6 +489,9 @@ public class ArrayTest extends BaseTest4 {
@Test
public void testEvilCasing() throws SQLException {
+ Assume.assumeTrue("Arrays of composite types requires PostgreSQL 8.3+",
+ TestUtil.haveMinimumServerVersion(_conn, ServerVersion.v8_3));
+
PGobject cc = new PGobject();
cc.setType("\"Evil.Table\"");
cc.setValue("(1)");
@@ -518,10 +573,11 @@ public class ArrayTest extends BaseTest4 {
Assert.assertNull("null array should return null on getObject", getObject);
}
- @Test(expected = NullPointerException.class)
+ @Test
public void createNullArray() throws SQLException {
Array arr = con.createArrayOf("float8", null);
- Assert.fail("createArrayOf(float8, null) should fail with NPE");
+ Assert.assertNotNull(arr);
+ Assert.assertNull(arr.getArray());
}
@Test
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc4/BlobTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc4/BlobTest.java
index 30515bb..ec5ff20 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc4/BlobTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc4/BlobTest.java
@@ -5,10 +5,16 @@
package org.postgresql.test.jdbc4;
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
import org.postgresql.test.TestUtil;
-import junit.framework.TestCase;
-import org.junit.Assert;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
@@ -23,17 +29,19 @@ import java.sql.Statement;
* This test-case is only for JDBC4 blob methods. Take a look at
* {@link org.postgresql.test.jdbc2.BlobTest} for base tests concerning blobs
*/
-public class BlobTest extends TestCase {
+public class BlobTest {
private Connection _conn;
- protected void setUp() throws Exception {
+ @Before
+ public void setUp() throws Exception {
_conn = TestUtil.openDB();
TestUtil.createTable(_conn, "testblob", "id name,lo oid");
_conn.setAutoCommit(false);
}
- protected void tearDown() throws Exception {
+ @After
+ public void tearDown() throws Exception {
_conn.setAutoCommit(true);
try {
Statement stmt = _conn.createStatement();
@@ -51,6 +59,7 @@ public class BlobTest extends TestCase {
}
}
+ @Test
public void testSetBlobWithStream() throws Exception {
byte[] data = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque bibendum dapibus varius."
.getBytes("UTF-8");
@@ -70,12 +79,13 @@ public class BlobTest extends TestCase {
Blob actualBlob = rs.getBlob(1);
byte[] actualBytes = actualBlob.getBytes(1, (int) actualBlob.length());
- Assert.assertArrayEquals(data, actualBytes);
+ assertArrayEquals(data, actualBytes);
} finally {
selectStmt.close();
}
}
+ @Test
public void testSetBlobWithStreamAndLength() throws Exception {
byte[] fullData = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse placerat tristique tellus, id tempus lectus."
.getBytes("UTF-8");
@@ -97,12 +107,13 @@ public class BlobTest extends TestCase {
Blob actualBlob = rs.getBlob(1);
byte[] actualBytes = actualBlob.getBytes(1, (int) actualBlob.length());
- Assert.assertArrayEquals(data, actualBytes);
+ assertArrayEquals(data, actualBytes);
} finally {
selectStmt.close();
}
}
+ @Test
public void testGetBinaryStreamWithBoundaries() throws Exception {
byte[] data =
"Cras vestibulum tellus eu sapien imperdiet ornare.".getBytes("UTF-8");
@@ -124,16 +135,17 @@ public class BlobTest extends TestCase {
InputStream stream = actualBlob.getBinaryStream(6, 10);
try {
stream.read(actualData);
- Assert.assertEquals("Stream should be at end", -1, stream.read(new byte[1]));
+ assertEquals("Stream should be at end", -1, stream.read(new byte[1]));
} finally {
stream.close();
}
- Assert.assertEquals("vestibulum", new String(actualData, "UTF-8"));
+ assertEquals("vestibulum", new String(actualData, "UTF-8"));
} finally {
selectStmt.close();
}
}
+ @Test
public void testFree() throws SQLException {
Statement stmt = _conn.createStatement();
stmt.execute("INSERT INTO testblob(lo) VALUES(lo_creat(-1))");
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc4/CharacterStreamTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc4/CharacterStreamTest.java
new file mode 100644
index 0000000..8320baf
--- /dev/null
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc4/CharacterStreamTest.java
@@ -0,0 +1,246 @@
+/*
+ * Copyright (c) 2016, PostgreSQL Global Development Group
+ * See the LICENSE file in the project root for more information.
+ */
+
+package org.postgresql.test.jdbc4;
+
+import org.postgresql.test.TestUtil;
+import org.postgresql.test.jdbc2.BaseTest4;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.io.Reader;
+import java.io.StringReader;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.SQLFeatureNotSupportedException;
+
+public class CharacterStreamTest extends BaseTest4 {
+
+ private static final String TEST_TABLE_NAME = "charstream";
+ private static final String TEST_COLUMN_NAME = "cs";
+
+ private static final String _delete;
+ private static final String _insert;
+ private static final String _select;
+
+ static {
+ _delete = String.format("DELETE FROM %s", TEST_TABLE_NAME);
+ _insert = String.format("INSERT INTO %s (%s) VALUES (?)", TEST_TABLE_NAME, TEST_COLUMN_NAME);
+ _select = String.format("SELECT %s FROM %s", TEST_COLUMN_NAME, TEST_TABLE_NAME);
+ }
+
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+ TestUtil.createTable(con, TEST_TABLE_NAME, "cs text");
+ }
+
+ @Override
+ public void tearDown() throws SQLException {
+ TestUtil.dropTable(con, TEST_TABLE_NAME);
+ super.tearDown();
+ }
+
+ private void insertStreamKnownIntLength(String data) throws Exception {
+ PreparedStatement insertPS = con.prepareStatement(_insert);
+ try {
+ Reader reader = (data != null) ? new StringReader(data) : null;
+ int length = (data != null) ? data.length() : 0;
+ insertPS.setCharacterStream(1, reader, length);
+ insertPS.executeUpdate();
+ } finally {
+ TestUtil.closeQuietly(insertPS);
+ }
+ }
+
+ private void insertStreamKnownLongLength(String data) throws Exception {
+ PreparedStatement insertPS = con.prepareStatement(_insert);
+ try {
+ Reader reader = (data != null) ? new StringReader(data) : null;
+ long length = (data != null) ? data.length() : 0;
+ insertPS.setCharacterStream(1, reader, length);
+ insertPS.executeUpdate();
+ } finally {
+ TestUtil.closeQuietly(insertPS);
+ }
+ }
+
+ private void insertStreamUnknownLength(String data) throws Exception {
+ PreparedStatement insertPS = con.prepareStatement(_insert);
+ try {
+ Reader reader = (data != null) ? new StringReader(data) : null;
+ insertPS.setCharacterStream(1, reader);
+ insertPS.executeUpdate();
+ } finally {
+ TestUtil.closeQuietly(insertPS);
+ }
+ }
+
+ private void validateContent(String data) throws Exception {
+ PreparedStatement selectPS = con.prepareStatement(_select);
+ try {
+ ResultSet rs = selectPS.executeQuery();
+ try {
+ if (rs.next()) {
+ String actualData = rs.getString(1);
+ Assert.assertEquals("Sent and received data are not the same", data, actualData);
+ } else {
+ Assert.fail("query returned zero rows");
+ }
+ } finally {
+ TestUtil.closeQuietly(rs);
+ }
+ } finally {
+ TestUtil.closeQuietly(selectPS);
+ }
+ }
+
+ private String getTestData(int size) {
+ StringBuilder buf = new StringBuilder(size);
+ String s = "This is a test string.\n";
+ int slen = s.length();
+ int len = 0;
+
+ while ((len + slen) < size) {
+ buf.append(s);
+ len += slen;
+ }
+
+ while (len < size) {
+ buf.append('.');
+ len++;
+ }
+
+ return buf.toString();
+ }
+
+ @Test
+ public void testKnownIntLengthNull() throws Exception {
+ String data = null;
+ insertStreamKnownIntLength(data);
+ validateContent(data);
+ }
+
+ @Test(expected = SQLFeatureNotSupportedException.class)
+ public void testKnownLongLengthNull() throws Exception {
+ String data = null;
+ insertStreamKnownLongLength(data);
+ validateContent(data);
+ }
+
+ @Test
+ public void testUnknownLengthNull() throws Exception {
+ String data = null;
+ insertStreamUnknownLength(data);
+ validateContent(data);
+ }
+
+ @Test
+ public void testKnownIntLengthEmpty() throws Exception {
+ String data = "";
+ insertStreamKnownIntLength(data);
+ validateContent(data);
+ }
+
+ @Test(expected = SQLFeatureNotSupportedException.class)
+ public void testKnownLongLengthEmpty() throws Exception {
+ String data = "";
+ insertStreamKnownLongLength(data);
+ validateContent(data);
+ }
+
+ @Test
+ public void testUnknownLengthEmpty() throws Exception {
+ String data = "";
+ insertStreamUnknownLength(data);
+ validateContent(data);
+ }
+
+ @Test
+ public void testKnownIntLength2Kb() throws Exception {
+ String data = getTestData(2 * 1024);
+ insertStreamKnownIntLength(data);
+ validateContent(data);
+ }
+
+ @Test(expected = SQLFeatureNotSupportedException.class)
+ public void testKnownLongLength2Kb() throws Exception {
+ String data = getTestData(2 * 1024);
+ insertStreamKnownLongLength(data);
+ validateContent(data);
+ }
+
+ @Test
+ public void testUnknownLength2Kb() throws Exception {
+ String data = getTestData(2 * 1024);
+ insertStreamUnknownLength(data);
+ validateContent(data);
+ }
+
+ @Test
+ public void testKnownIntLength10Kb() throws Exception {
+ String data = getTestData(10 * 1024);
+ insertStreamKnownIntLength(data);
+ validateContent(data);
+ }
+
+ @Test(expected = SQLFeatureNotSupportedException.class)
+ public void testKnownLongLength10Kb() throws Exception {
+ String data = getTestData(10 * 1024);
+ insertStreamKnownLongLength(data);
+ validateContent(data);
+ }
+
+ @Test
+ public void testUnknownLength10Kb() throws Exception {
+ String data = getTestData(10 * 1024);
+ insertStreamUnknownLength(data);
+ validateContent(data);
+ }
+
+ @Test
+ public void testKnownIntLength100Kb() throws Exception {
+ String data = getTestData(100 * 1024);
+ insertStreamKnownIntLength(data);
+ validateContent(data);
+ }
+
+ @Test(expected = SQLFeatureNotSupportedException.class)
+ public void testKnownLongLength100Kb() throws Exception {
+ String data = getTestData(100 * 1024);
+ insertStreamKnownLongLength(data);
+ validateContent(data);
+ }
+
+ @Test
+ public void testUnknownLength100Kb() throws Exception {
+ String data = getTestData(100 * 1024);
+ insertStreamUnknownLength(data);
+ validateContent(data);
+ }
+
+ @Test
+ public void testKnownIntLength200Kb() throws Exception {
+ String data = getTestData(200 * 1024);
+ insertStreamKnownIntLength(data);
+ validateContent(data);
+ }
+
+ @Test(expected = SQLFeatureNotSupportedException.class)
+ public void testKnownLongLength200Kb() throws Exception {
+ String data = getTestData(200 * 1024);
+ insertStreamKnownLongLength(data);
+ validateContent(data);
+ }
+
+ @Test
+ public void testUnknownLength200Kb() throws Exception {
+ String data = getTestData(200 * 1024);
+ insertStreamUnknownLength(data);
+ validateContent(data);
+ }
+}
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc4/ClientInfoTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc4/ClientInfoTest.java
index 76c64b0..d20337f 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc4/ClientInfoTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc4/ClientInfoTest.java
@@ -5,35 +5,27 @@
package org.postgresql.test.jdbc4;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import org.postgresql.core.ServerVersion;
import org.postgresql.test.TestUtil;
+import org.postgresql.test.jdbc2.BaseTest4;
-import junit.framework.TestCase;
+import org.junit.Test;
-import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLClientInfoException;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
-public class ClientInfoTest extends TestCase {
-
- private Connection _conn;
-
- public ClientInfoTest(String name) {
- super(name);
- }
-
- protected void setUp() throws Exception {
- _conn = TestUtil.openDB();
- }
-
- protected void tearDown() throws SQLException {
- TestUtil.closeDB(_conn);
- }
+public class ClientInfoTest extends BaseTest4 {
private String getAppName() throws SQLException {
- Statement stmt = _conn.createStatement();
+ Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("SHOW application_name");
rs.next();
String appName = rs.getString(1);
@@ -42,72 +34,77 @@ public class ClientInfoTest extends TestCase {
return appName;
}
+ @Test
public void testSetAppName() throws SQLException {
- if (!TestUtil.haveMinimumServerVersion(_conn, "9.0")) {
+ if (!TestUtil.haveMinimumServerVersion(con, ServerVersion.v9_0)) {
return;
}
- _conn.setClientInfo("ApplicationName", "my app");
+ con.setClientInfo("ApplicationName", "my app");
assertEquals("my app", getAppName());
- assertEquals("my app", _conn.getClientInfo("ApplicationName"));
- assertEquals("my app", _conn.getClientInfo().getProperty("ApplicationName"));
+ assertEquals("my app", con.getClientInfo("ApplicationName"));
+ assertEquals("my app", con.getClientInfo().getProperty("ApplicationName"));
}
+ @Test
public void testExplicitSetAppNameNotificationIsParsed() throws SQLException {
- if (!TestUtil.haveMinimumServerVersion(_conn, "9.0")) {
+ if (!TestUtil.haveMinimumServerVersion(con, ServerVersion.v9_0)) {
return;
}
String appName = "test-42";
- Statement s = _conn.createStatement();
+ Statement s = con.createStatement();
s.execute("set application_name='" + appName + "'");
s.close();
assertEquals("application_name was set to " + appName + ", and it should be visible via "
- + "con.getClientInfo", appName, _conn.getClientInfo("ApplicationName"));
+ + "con.getClientInfo", appName, con.getClientInfo("ApplicationName"));
assertEquals("application_name was set to " + appName + ", and it should be visible via "
- + "con.getClientInfo", appName, _conn.getClientInfo().get("ApplicationName"));
+ + "con.getClientInfo", appName, con.getClientInfo().get("ApplicationName"));
}
+ @Test
public void testSetAppNameProps() throws SQLException {
- if (!TestUtil.haveMinimumServerVersion(_conn, "9.0")) {
+ if (!TestUtil.haveMinimumServerVersion(con, ServerVersion.v9_0)) {
return;
}
Properties props = new Properties();
props.put("ApplicationName", "my app");
- _conn.setClientInfo(props);
+ con.setClientInfo(props);
assertEquals("my app", getAppName());
- assertEquals("my app", _conn.getClientInfo("ApplicationName"));
- assertEquals("my app", _conn.getClientInfo().getProperty("ApplicationName"));
+ assertEquals("my app", con.getClientInfo("ApplicationName"));
+ assertEquals("my app", con.getClientInfo().getProperty("ApplicationName"));
}
/**
* Test that no exception is thrown when an unknown property is set
*/
+ @Test
public void testWarningOnUnknownName() throws SQLException {
try {
- _conn.setClientInfo("UnexisingClientInfoName", "NoValue");
+ con.setClientInfo("UnexisingClientInfoName", "NoValue");
} catch (SQLClientInfoException e) {
fail("Trying to set an unexisting name must not throw an exception (spec)");
}
- assertTrue(_conn.getWarnings() != null);
+ assertNotNull(con.getWarnings());
}
/**
* Test that a name missing in the properties given to setClientInfo should be unset (spec)
*/
+ @Test
public void testMissingName() throws SQLException {
- if (!TestUtil.haveMinimumServerVersion(_conn, "9.0")) {
+ if (!TestUtil.haveMinimumServerVersion(con, ServerVersion.v9_0)) {
return;
}
- _conn.setClientInfo("ApplicationName", "my app");
+ con.setClientInfo("ApplicationName", "my app");
// According to the spec, empty properties must clear all (because all names are missing)
- _conn.setClientInfo(new Properties());
+ con.setClientInfo(new Properties());
- String applicationName = _conn.getClientInfo("ApplicationName");
+ String applicationName = con.getClientInfo("ApplicationName");
assertTrue("".equals(applicationName) || applicationName == null);
}
}
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc4/DatabaseMetaDataTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc4/DatabaseMetaDataTest.java
index eee3114..1a03543 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc4/DatabaseMetaDataTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc4/DatabaseMetaDataTest.java
@@ -5,40 +5,53 @@
package org.postgresql.test.jdbc4;
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.notNullValue;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
+
+import org.postgresql.core.ServerVersion;
import org.postgresql.test.TestUtil;
-import junit.framework.TestCase;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
-public class DatabaseMetaDataTest extends TestCase {
+public class DatabaseMetaDataTest {
private Connection _conn;
- public DatabaseMetaDataTest(String name) {
- super(name);
- }
-
- protected void setUp() throws Exception {
+ @Before
+ public void setUp() throws Exception {
_conn = TestUtil.openDB();
TestUtil.dropSequence(_conn, "sercoltest_a_seq");
TestUtil.createTable(_conn, "sercoltest", "a serial, b int");
}
- protected void tearDown() throws Exception {
+ @After
+ public void tearDown() throws Exception {
TestUtil.dropSequence(_conn, "sercoltest_a_seq");
TestUtil.dropTable(_conn, "sercoltest");
TestUtil.closeDB(_conn);
}
+ @Test
public void testGetClientInfoProperties() throws Exception {
DatabaseMetaData dbmd = _conn.getMetaData();
ResultSet rs = dbmd.getClientInfoProperties();
- if (!TestUtil.haveMinimumServerVersion(_conn, "9.0")) {
+ if (!TestUtil.haveMinimumServerVersion(_conn, ServerVersion.v9_0)) {
assertTrue(!rs.next());
return;
}
@@ -47,6 +60,7 @@ public class DatabaseMetaDataTest extends TestCase {
assertEquals("ApplicationName", rs.getString("NAME"));
}
+ @Test
public void testGetColumnsForAutoIncrement() throws Exception {
DatabaseMetaData dbmd = _conn.getMetaData();
@@ -62,19 +76,160 @@ public class DatabaseMetaDataTest extends TestCase {
assertTrue(!rs.next());
}
+ @Test
public void testGetSchemas() throws SQLException {
DatabaseMetaData dbmd = _conn.getMetaData();
ResultSet rs = dbmd.getSchemas("", "publ%");
- if (!TestUtil.haveMinimumServerVersion(_conn, "7.3")) {
- assertTrue(!rs.next());
- return;
- }
-
assertTrue(rs.next());
assertEquals("public", rs.getString("TABLE_SCHEM"));
assertNull(rs.getString("TABLE_CATALOG"));
assertTrue(!rs.next());
}
+
+ @Test
+ public void testGetFunctionsWithBlankPatterns() throws SQLException {
+ int minFuncCount = 1000;
+ DatabaseMetaData dbmd = _conn.getMetaData();
+ ResultSet rs = dbmd.getFunctions("", "", "");
+ int count = assertGetFunctionRS(rs);
+ assertThat(count > minFuncCount, is(true));
+
+ // Should be same as blank pattern
+ ResultSet rs2 = dbmd.getFunctions(null, null, null);
+ int count2 = assertGetFunctionRS(rs2);
+ assertThat(count2 > minFuncCount, is(true));
+ assertThat(count2, is(count));
+
+ // Catalog parameter has no affect on our getFunctions filtering
+ ResultSet rs3 = dbmd.getFunctions("ANYTHING_WILL_WORK", null, null);
+ int count3 = assertGetFunctionRS(rs3);
+ assertThat(count3 > minFuncCount, is(true));
+ assertThat(count3, is(count));
+
+ // Filter by schema
+ ResultSet rs4 = dbmd.getFunctions("", "pg_catalog", null);
+ int count4 = assertGetFunctionRS(rs4);
+ assertThat(count4 > minFuncCount, is(true));
+
+ // Filter by schema and function name
+ ResultSet rs5 = dbmd.getFunctions("", "pg_catalog", "abs");
+ int count5 = assertGetFunctionRS(rs5);
+ assertThat(count5 >= 1, is(true));
+
+ // Filter by function name only
+ rs5 = dbmd.getFunctions("", "", "abs");
+ count5 = assertGetFunctionRS(rs5);
+ assertThat(count5 >= 1, is(true));
+
+ rs.close();
+ rs2.close();
+ rs3.close();
+ rs4.close();
+ rs5.close();
+ }
+
+ /** Assert some basic result from ResultSet of a GetFunctions method. Return the total row count. */
+ private int assertGetFunctionRS(ResultSet rs) throws SQLException {
+ // There should be at least one row
+ assertThat(rs.next(), is(true));
+ assertThat(rs.getString("FUNCTION_CAT"), is(System.getProperty("database")));
+ assertThat(rs.getString("FUNCTION_SCHEM"), notNullValue());
+ assertThat(rs.getString("FUNCTION_NAME"), notNullValue());
+ assertThat(rs.getShort("FUNCTION_TYPE") >= 0, is(true));
+ assertThat(rs.getString("SPECIFIC_NAME"), notNullValue());
+
+ // Ensure there is enough column and column value retrieve by index should be same as column name (ordered)
+ assertThat(rs.getMetaData().getColumnCount(), is(6));
+ assertThat(rs.getString(1), is(rs.getString("FUNCTION_CAT")));
+ assertThat(rs.getString(2), is(rs.getString("FUNCTION_SCHEM")));
+ assertThat(rs.getString(3), is(rs.getString("FUNCTION_NAME")));
+ assertThat(rs.getString(4), is(rs.getString("REMARKS")));
+ assertThat(rs.getShort(5), is(rs.getShort("FUNCTION_TYPE")));
+ assertThat(rs.getString(6), is(rs.getString("SPECIFIC_NAME")));
+
+ // Get all result and assert they are ordered per javadoc spec:
+ // FUNCTION_CAT, FUNCTION_SCHEM, FUNCTION_NAME and SPECIFIC_NAME
+ List<String> result = new ArrayList<String>();
+ do {
+ result.add(rs.getString("FUNCTION_CAT")
+ + " "
+ + rs.getString("FUNCTION_SCHEM")
+ + " "
+ + rs.getString("FUNCTION_NAME")
+ + " "
+ + rs.getString("SPECIFIC_NAME"));
+ } while (rs.next());
+
+ List<String> orderedResult = new ArrayList<String>(result);
+ Collections.sort(orderedResult);
+ assertThat(result, is(orderedResult));
+
+ return result.size();
+ }
+
+ @Test
+ public void testGetFunctionsWithSpecificTypes() throws SQLException {
+ // These function creation are borrow from jdbc2/DatabaseMetaDataTest
+ // We modify to ensure new function created are returned by getFunctions()
+
+ DatabaseMetaData dbmd = _conn.getMetaData();
+ if (TestUtil.haveMinimumServerVersion(_conn, ServerVersion.v8_4)) {
+ Statement stmt = _conn.createStatement();
+ stmt.execute(
+ "CREATE OR REPLACE FUNCTION getfunc_f1(int, varchar) RETURNS int AS 'SELECT 1;' LANGUAGE SQL");
+ ResultSet rs = dbmd.getFunctions("", "", "getfunc_f1");
+ assertThat(rs.next(), is(true));
+ assertThat(rs.getString("FUNCTION_NAME"), is("getfunc_f1"));
+ assertThat(rs.getShort("FUNCTION_TYPE"), is((short)DatabaseMetaData.functionNoTable));
+ assertThat(rs.next(), is(false));
+ rs.close();
+ stmt.execute("DROP FUNCTION getfunc_f1(int, varchar)");
+
+ stmt.execute(
+ "CREATE OR REPLACE FUNCTION getfunc_f3(IN a int, INOUT b varchar, OUT c timestamptz) AS $f$ BEGIN b := 'a'; c := now(); return; END; $f$ LANGUAGE plpgsql");
+ rs = dbmd.getFunctions("", "", "getfunc_f3");
+ assertThat(rs.next(), is(true));
+ assertThat(rs.getString("FUNCTION_NAME"), is("getfunc_f3"));
+ assertThat(rs.getShort("FUNCTION_TYPE"), is((short)DatabaseMetaData.functionNoTable));
+ assertThat(rs.next(), is(false));
+ rs.close();
+ stmt.execute("DROP FUNCTION getfunc_f3(int, varchar)");
+
+ // RETURNS TABLE requires PostgreSQL 8.4+
+ stmt.execute(
+ "CREATE OR REPLACE FUNCTION getfunc_f5() RETURNS TABLE (i int) LANGUAGE sql AS 'SELECT 1'");
+
+ rs = dbmd.getFunctions("", "", "getfunc_f5");
+ assertThat(rs.next(), is(true));
+ assertThat(rs.getString("FUNCTION_NAME"), is("getfunc_f5"));
+ assertThat(rs.getShort("FUNCTION_TYPE"), is((short)DatabaseMetaData.functionReturnsTable));
+ assertThat(rs.next(), is(false));
+ rs.close();
+ stmt.execute("DROP FUNCTION getfunc_f5()");
+ } else {
+ // For PG 8.3 or 8.2 it will resulted in unknown function type
+ Statement stmt = _conn.createStatement();
+ stmt.execute(
+ "CREATE OR REPLACE FUNCTION getfunc_f1(int, varchar) RETURNS int AS 'SELECT 1;' LANGUAGE SQL");
+ ResultSet rs = dbmd.getFunctions("", "", "getfunc_f1");
+ assertThat(rs.next(), is(true));
+ assertThat(rs.getString("FUNCTION_NAME"), is("getfunc_f1"));
+ assertThat(rs.getShort("FUNCTION_TYPE"), is((short)DatabaseMetaData.functionResultUnknown));
+ assertThat(rs.next(), is(false));
+ rs.close();
+ stmt.execute("DROP FUNCTION getfunc_f1(int, varchar)");
+
+ stmt.execute(
+ "CREATE OR REPLACE FUNCTION getfunc_f3(IN a int, INOUT b varchar, OUT c timestamptz) AS $f$ BEGIN b := 'a'; c := now(); return; END; $f$ LANGUAGE plpgsql");
+ rs = dbmd.getFunctions("", "", "getfunc_f3");
+ assertThat(rs.next(), is(true));
+ assertThat(rs.getString("FUNCTION_NAME"), is("getfunc_f3"));
+ assertThat(rs.getShort("FUNCTION_TYPE"), is((short)DatabaseMetaData.functionResultUnknown));
+ assertThat(rs.next(), is(false));
+ rs.close();
+ stmt.execute("DROP FUNCTION getfunc_f3(int, varchar)");
+ }
+ }
}
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc4/IsValidTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc4/IsValidTest.java
index 84eabe8..7cfc273 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc4/IsValidTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc4/IsValidTest.java
@@ -5,66 +5,65 @@
package org.postgresql.test.jdbc4;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
import org.postgresql.core.BaseConnection;
import org.postgresql.core.TransactionState;
import org.postgresql.test.TestUtil;
+import org.postgresql.test.jdbc2.BaseTest4;
-import junit.framework.TestCase;
-import org.junit.Assert;
+import org.junit.Test;
import java.sql.Connection;
import java.sql.Statement;
-public class IsValidTest extends TestCase {
+public class IsValidTest extends BaseTest4 {
private TransactionState getTransactionState(Connection conn) {
return ((BaseConnection) conn).getTransactionState();
}
+ @Test
public void testIsValid() throws Exception {
- Connection _conn = TestUtil.openDB();
try {
- assertTrue(_conn.isValid(0));
+ assertTrue(con.isValid(0));
} finally {
- TestUtil.closeDB(_conn);
+ TestUtil.closeDB(con);
}
- assertFalse(_conn.isValid(0));
+ assertFalse(con.isValid(0));
}
/**
* Test that the transaction state is left unchanged
*/
+ @Test
public void testTransactionState() throws Exception {
- Connection conn = TestUtil.openDB();
+ TransactionState transactionState = getTransactionState(con);
+ con.isValid(0);
+ assertEquals("Transaction state has been changed", transactionState,
+ getTransactionState(con));
+
+ con.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
+ con.setAutoCommit(false);
try {
- TransactionState transactionState;
- transactionState = getTransactionState(conn);
- conn.isValid(0);
- Assert.assertEquals("Transaction state has been changed", transactionState,
- getTransactionState(conn));
+ transactionState = getTransactionState(con);
+ con.isValid(0);
+ assertEquals("Transaction state has been changed", transactionState,
+ getTransactionState(con));
- conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
- conn.setAutoCommit(false);
+ Statement stmt = con.createStatement();
+ stmt.execute("SELECT 1");
+ transactionState = getTransactionState(con);
+ con.isValid(0);
+ assertEquals("Transaction state has been changed", transactionState,
+ getTransactionState(con));
+ } finally {
try {
- transactionState = getTransactionState(conn);
- conn.isValid(0);
- Assert.assertEquals("Transaction state has been changed", transactionState,
- getTransactionState(conn));
-
- Statement stmt = conn.createStatement();
- stmt.execute("SELECT 1");
- transactionState = getTransactionState(conn);
- conn.isValid(0);
- Assert.assertEquals("Transaction state has been changed", transactionState,
- getTransactionState(conn));
- } finally {
- try {
- conn.setAutoCommit(true);
- } catch (final Exception e) {
- }
+ con.setAutoCommit(true);
+ } catch (final Exception e) {
}
- } finally {
- TestUtil.closeDB(conn);
}
}
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc4/Jdbc4TestSuite.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc4/Jdbc4TestSuite.java
index 3603683..46fcc4b 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc4/Jdbc4TestSuite.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc4/Jdbc4TestSuite.java
@@ -5,67 +5,28 @@
package org.postgresql.test.jdbc4;
-import org.postgresql.test.TestUtil;
-
-import junit.framework.JUnit4TestAdapter;
-import junit.framework.TestSuite;
-
-import java.sql.Connection;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Statement;
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
/*
* Executes all known tests for JDBC4
*/
-public class Jdbc4TestSuite extends TestSuite {
-
- /*
- * The main entry point for JUnit
- */
- public static TestSuite suite() throws Exception {
- Class.forName("org.postgresql.Driver");
- TestSuite suite = new TestSuite();
-
- suite.addTestSuite(DatabaseMetaDataTest.class);
- suite.addTest(new JUnit4TestAdapter(ArrayTest.class));
- suite.addTestSuite(WrapperTest.class);
- suite.addTest(new JUnit4TestAdapter(BinaryTest.class));
- suite.addTestSuite(IsValidTest.class);
- suite.addTestSuite(ClientInfoTest.class);
- suite.addTestSuite(PGCopyInputStreamTest.class);
- suite.addTestSuite(BlobTest.class);
- suite.addTest(new JUnit4TestAdapter(BinaryStreamTest.class));
-
- Connection connection = TestUtil.openDB();
- try {
- if (TestUtil.haveMinimumServerVersion(connection, "8.3")) {
- suite.addTest(new JUnit4TestAdapter(UUIDTest.class));
- if (isXmlEnabled(connection)) {
- suite.addTestSuite(XmlTest.class);
- }
- }
- } finally {
- connection.close();
- }
-
- return suite;
- }
-
- /**
- * Not all servers will have been complied --with-libxml.
- */
- private static boolean isXmlEnabled(Connection conn) {
- try {
- Statement stmt = conn.createStatement();
- ResultSet rs = stmt.executeQuery("SELECT '<a>b</a>'::xml");
- rs.close();
- stmt.close();
- return true;
- } catch (SQLException sqle) {
- return false;
- }
- }
-
+ at RunWith(Suite.class)
+ at Suite.SuiteClasses({
+ DatabaseMetaDataTest.class,
+ ArrayTest.class,
+ WrapperTest.class,
+ BinaryTest.class,
+ IsValidTest.class,
+ ClientInfoTest.class,
+ PGCopyInputStreamTest.class,
+ BlobTest.class,
+ BinaryStreamTest.class,
+ CharacterStreamTest.class,
+ UUIDTest.class,
+ LibPQFactoryHostNameTest.class,
+ XmlTest.class
+})
+public class Jdbc4TestSuite {
}
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc4/JsonbTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc4/JsonbTest.java
index 5bc4f0e..8529412 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc4/JsonbTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc4/JsonbTest.java
@@ -8,6 +8,8 @@ package org.postgresql.test.jdbc4;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
+import org.postgresql.core.ServerVersion;
+
import org.postgresql.test.TestUtil;
import org.postgresql.test.jdbc2.BaseTest4;
@@ -21,9 +23,10 @@ import java.sql.Statement;
public class JsonbTest extends BaseTest4 {
+ @Override
public void setUp() throws Exception {
super.setUp();
- Assume.assumeTrue("jsonb requires PostgreSQL 9.4+", TestUtil.haveMinimumServerVersion(con, "9.4"));
+ Assume.assumeTrue("jsonb requires PostgreSQL 9.4+", TestUtil.haveMinimumServerVersion(con, ServerVersion.v9_4));
TestUtil.createTable(con, "jsonbtest", "detail jsonb");
Statement stmt = con.createStatement();
stmt.executeUpdate("INSERT INTO jsonbtest (detail) VALUES ('{\"a\": 1}')");
@@ -32,6 +35,7 @@ public class JsonbTest extends BaseTest4 {
stmt.close();
}
+ @Override
public void tearDown() throws SQLException {
TestUtil.dropTable(con, "jsonbtest");
super.tearDown();
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc4/LibPQFactoryHostNameTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc4/LibPQFactoryHostNameTest.java
new file mode 100644
index 0000000..1ee140c
--- /dev/null
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc4/LibPQFactoryHostNameTest.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) 2017, PostgreSQL Global Development Group
+ * See the LICENSE file in the project root for more information.
+ */
+
+package org.postgresql.test.jdbc4;
+
+import org.postgresql.ssl.jdbc4.LibPQFactory;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+import java.util.Arrays;
+
+ at RunWith(Parameterized.class)
+public class LibPQFactoryHostNameTest {
+
+ private final String hostname;
+ private final String pattern;
+ private final boolean expected;
+
+ public LibPQFactoryHostNameTest(String hostname, String pattern, boolean expected) {
+ this.hostname = hostname;
+ this.pattern = pattern;
+ this.expected = expected;
+ }
+
+ @Parameterized.Parameters(name = "host={0}, pattern={1}")
+ public static Iterable<Object[]> data() {
+ return Arrays.asList(new Object[][]{
+ {"host.com", "pattern.com", false},
+ {"host.com", ".pattern.com", false},
+ {"host.com", "*.pattern.com", false},
+ {"host.com", "*.host.com", false},
+ {"a.com", "*.host.com", false},
+ {".a.com", "*.host.com", false},
+ {"longhostname.com", "*.com", true},
+ {"longhostname.ru", "*.com", false},
+ {"host.com", "host.com", true},
+ {"sub.host.com", "host.com", false},
+ {"sub.host.com", "sub.host.com", true},
+ {"sub.host.com", "*.host.com", true},
+ {"Sub.host.com", "sub.host.com", true},
+ {"sub.host.com", "Sub.host.com", true},
+ {"sub.host.com", "*.hoSt.com", true},
+ {"*.host.com", "host.com", false},
+ {"sub.sub.host.com", "*.host.com", false}, // Wildcard should cover just one level
+ });
+ }
+
+ @Test
+ public void checkPattern() throws Exception {
+ Assert.assertEquals(expected, LibPQFactory.verifyHostName(hostname, pattern));
+ }
+}
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc4/LogTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc4/LogTest.java
new file mode 100644
index 0000000..49d623f
--- /dev/null
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc4/LogTest.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright (c) 2007, PostgreSQL Global Development Group
+ * See the LICENSE file in the project root for more information.
+ */
+
+package org.postgresql.test.jdbc4;
+
+import org.postgresql.PGProperty;
+import org.postgresql.test.TestUtil;
+import org.postgresql.test.jdbc2.BaseTest4;
+
+import org.junit.Assert;
+import org.junit.Assume;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+import java.sql.Array;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Properties;
+
+ at RunWith(Parameterized.class)
+public class LogTest extends BaseTest4 {
+
+ private String oldLevel;
+
+ public LogTest(BinaryMode binaryMode) {
+ setBinaryMode(binaryMode);
+ long maxMemory = Runtime.getRuntime().maxMemory();
+ if (maxMemory < 6L * 1024 * 1024 * 1024) {
+ // TODO: add hamcrest matches and replace with "greaterThan" or something like that
+ Assume.assumeTrue(
+ "The test requires -Xmx6g or more. MaxMemory is " + (maxMemory / 1024.0 / 1024) + " MiB",
+ false);
+ }
+ }
+
+ @Parameterized.Parameters(name = "binary = {0}")
+ public static Iterable<Object[]> data() {
+ Collection<Object[]> ids = new ArrayList<Object[]>();
+ for (BinaryMode binaryMode : BinaryMode.values()) {
+ ids.add(new Object[]{binaryMode});
+ }
+ return ids;
+ }
+
+ @Override
+ protected void updateProperties(Properties props) {
+ super.updateProperties(props);
+ PGProperty.LOGGER_LEVEL.set(props, "TRACE");
+ }
+
+ @Test
+ public void reallyLargeArgumentsBreaksLogging() throws SQLException {
+ String[] largeInput = new String[220];
+ String largeString = String.format("%1048576s", " ");
+ for (int i = 0; i < largeInput.length; i++) {
+ largeInput[i] = largeString;
+ }
+ Array arr = con.createArrayOf("text", largeInput);
+ PreparedStatement ps = con.prepareStatement("select t from unnest(?::text[]) t");
+ ps.setArray(1, arr);
+ ResultSet rs = ps.executeQuery();
+ int x = 0;
+ while (rs.next()) {
+ x += 1;
+ String found = rs.getString(1);
+ Assert.assertEquals(largeString, found);
+ }
+ Assert.assertEquals(largeInput.length, x);
+ TestUtil.closeQuietly(rs);
+ TestUtil.closeQuietly(ps);
+ }
+}
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc4/PGCopyInputStreamTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc4/PGCopyInputStreamTest.java
index ccbdb33..f4f898a 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc4/PGCopyInputStreamTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc4/PGCopyInputStreamTest.java
@@ -5,28 +5,30 @@
package org.postgresql.test.jdbc4;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
import org.postgresql.PGConnection;
import org.postgresql.copy.PGCopyInputStream;
import org.postgresql.core.ServerVersion;
import org.postgresql.test.TestUtil;
-import junit.framework.TestCase;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
-public class PGCopyInputStreamTest extends TestCase {
+public class PGCopyInputStreamTest {
private Connection _conn;
private PGCopyInputStream sut;
private String copyParams;
- public PGCopyInputStreamTest(String name) {
- super(name);
- }
-
- protected void setUp() throws Exception {
+ @Before
+ public void setUp() throws Exception {
_conn = TestUtil.openDB();
TestUtil.createTable(_conn, "cpinstreamtest", "i int");
if (TestUtil.haveMinimumServerVersion(_conn, ServerVersion.v9_0)) {
@@ -36,12 +38,14 @@ public class PGCopyInputStreamTest extends TestCase {
}
}
- protected void tearDown() throws SQLException {
+ @After
+ public void tearDown() throws SQLException {
silentlyCloseStream(sut);
TestUtil.dropTable(_conn, "cpinstreamtest");
TestUtil.closeDB(_conn);
}
+ @Test
public void testReadBytesCorrectlyHandlesEof() throws SQLException, IOException {
insertSomeData();
@@ -54,6 +58,7 @@ public class PGCopyInputStreamTest extends TestCase {
assertEquals(-1, sut.read(buf));
}
+ @Test
public void testReadBytesCorrectlyReadsDataInChunks() throws SQLException, IOException {
insertSomeData();
@@ -72,6 +77,7 @@ public class PGCopyInputStreamTest extends TestCase {
assertEquals("0\n1\n2\n3\n", result.toString());
}
+ @Test
public void testStreamCanBeClosedAfterReadUp() throws SQLException, IOException {
insertSomeData();
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc4/UUIDTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc4/UUIDTest.java
index 25881c1..5eec48b 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc4/UUIDTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc4/UUIDTest.java
@@ -8,22 +8,50 @@ package org.postgresql.test.jdbc4;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
+import org.postgresql.core.ServerVersion;
+import org.postgresql.jdbc.PreferQueryMode;
+import org.postgresql.test.TestUtil;
import org.postgresql.test.jdbc2.BaseTest4;
+import org.postgresql.util.PSQLState;
+import org.junit.Assert;
import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
+import java.util.ArrayList;
+import java.util.Collection;
import java.util.UUID;
+ at RunWith(Parameterized.class)
public class UUIDTest extends BaseTest4 {
+ public UUIDTest(BinaryMode binaryMode, StringType stringType) {
+ setBinaryMode(binaryMode);
+ setStringType(stringType);
+ }
+
+ @Parameterized.Parameters(name = "binary={0}, stringType={1}")
+ public static Iterable<Object[]> data() {
+ Collection<Object[]> ids = new ArrayList<Object[]>();
+ for (BinaryMode binaryMode : BinaryMode.values()) {
+ for (StringType stringType : StringType.values()) {
+ ids.add(new Object[]{binaryMode, stringType});
+ }
+ }
+ return ids;
+ }
+
@Override
public void setUp() throws Exception {
super.setUp();
+ assumeMinimumServerVersion(ServerVersion.v8_3);
+
Statement stmt = con.createStatement();
stmt.execute("CREATE TEMP TABLE uuidtest(id uuid)");
stmt.close();
@@ -32,7 +60,7 @@ public class UUIDTest extends BaseTest4 {
@Override
public void tearDown() throws SQLException {
Statement stmt = con.createStatement();
- stmt.execute("DROP TABLE uuidtest");
+ stmt.execute("DROP TABLE IF EXISTS uuidtest");
stmt.close();
super.tearDown();
}
@@ -57,5 +85,30 @@ public class UUIDTest extends BaseTest4 {
stmt.close();
}
+ @Test
+ public void testUUIDString() throws SQLException {
+ String uuid = "0dcdf03a-058c-4fa3-b210-8385cb6810d5";
+ PreparedStatement ps = con.prepareStatement("INSERT INTO uuidtest VALUES (?)");
+ ps.setString(1, uuid);
+ try {
+ ps.executeUpdate();
+ if (getStringType() == StringType.VARCHAR && preferQueryMode != PreferQueryMode.SIMPLE) {
+ Assert.fail(
+ "setString(, uuid) should fail to insert value into UUID column when stringType=varchar."
+ + " Expecting error <<column \"id\" is of type uuid but expression is of type character varying>>");
+ }
+ } catch (SQLException e) {
+ if (getStringType() == StringType.VARCHAR
+ && PSQLState.DATATYPE_MISMATCH.getState().equals(e.getSQLState())) {
+ // The following error is expected in stringType=varchar mode
+ // ERROR: column "id" is of type uuid but expression is of type character varying
+ return;
+ }
+ throw e;
+ } finally {
+ TestUtil.closeQuietly(ps);
+ }
+ }
+
}
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc4/WrapperTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc4/WrapperTest.java
index b7ef005..f1a4e08 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc4/WrapperTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc4/WrapperTest.java
@@ -5,32 +5,37 @@
package org.postgresql.test.jdbc4;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
import org.postgresql.PGConnection;
import org.postgresql.PGStatement;
import org.postgresql.ds.PGSimpleDataSource;
import org.postgresql.test.TestUtil;
-import junit.framework.TestCase;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
-public class WrapperTest extends TestCase {
+public class WrapperTest {
private Connection _conn;
private Statement _statement;
- public WrapperTest(String name) {
- super(name);
- }
-
- protected void setUp() throws Exception {
+ @Before
+ public void setUp() throws Exception {
_conn = TestUtil.openDB();
_statement = _conn.prepareStatement("SELECT 1");
}
- protected void tearDown() throws SQLException {
+ @After
+ public void tearDown() throws SQLException {
_statement.close();
TestUtil.closeDB(_conn);
}
@@ -38,21 +43,25 @@ public class WrapperTest extends TestCase {
/**
* This interface is private, and so cannot be supported by any wrapper
*/
- private static interface PrivateInterface {
+ private interface PrivateInterface {
}
+ @Test
public void testConnectionIsWrapperForPrivate() throws SQLException {
assertFalse(_conn.isWrapperFor(PrivateInterface.class));
}
+ @Test
public void testConnectionIsWrapperForConnection() throws SQLException {
assertTrue(_conn.isWrapperFor(Connection.class));
}
+ @Test
public void testConnectionIsWrapperForPGConnection() throws SQLException {
assertTrue(_conn.isWrapperFor(PGConnection.class));
}
+ @Test
public void testConnectionUnwrapPrivate() throws SQLException {
try {
_conn.unwrap(PrivateInterface.class);
@@ -61,18 +70,21 @@ public class WrapperTest extends TestCase {
}
}
+ @Test
public void testConnectionUnwrapConnection() throws SQLException {
Object v = _conn.unwrap(Connection.class);
assertNotNull(v);
assertTrue(v instanceof Connection);
}
+ @Test
public void testConnectionUnwrapPGConnection() throws SQLException {
Object v = _conn.unwrap(PGConnection.class);
assertNotNull(v);
assertTrue(v instanceof PGConnection);
}
+ @Test
public void testConnectionUnwrapPGDataSource() throws SQLException {
PGSimpleDataSource dataSource = new PGSimpleDataSource();
dataSource.setDatabaseName(TestUtil.getDatabase());
@@ -86,18 +98,22 @@ public class WrapperTest extends TestCase {
v instanceof PGConnection);
}
+ @Test
public void testStatementIsWrapperForPrivate() throws SQLException {
assertFalse(_statement.isWrapperFor(PrivateInterface.class));
}
+ @Test
public void testStatementIsWrapperForStatement() throws SQLException {
assertTrue(_statement.isWrapperFor(Statement.class));
}
+ @Test
public void testStatementIsWrapperForPGStatement() throws SQLException {
assertTrue(_statement.isWrapperFor(PGStatement.class));
}
+ @Test
public void testStatementUnwrapPrivate() throws SQLException {
try {
_statement.unwrap(PrivateInterface.class);
@@ -106,12 +122,14 @@ public class WrapperTest extends TestCase {
}
}
+ @Test
public void testStatementUnwrapStatement() throws SQLException {
Object v = _statement.unwrap(Statement.class);
assertNotNull(v);
assertTrue(v instanceof Statement);
}
+ @Test
public void testStatementUnwrapPGStatement() throws SQLException {
Object v = _statement.unwrap(PGStatement.class);
assertNotNull(v);
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc4/XmlTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc4/XmlTest.java
index 630696c..94881c4 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc4/XmlTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc4/XmlTest.java
@@ -5,14 +5,25 @@
package org.postgresql.test.jdbc4;
-import org.postgresql.test.TestUtil;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+import static org.junit.Assume.assumeTrue;
+
+import org.postgresql.core.ServerVersion;
+import org.postgresql.test.jdbc2.BaseTest4;
+
+import org.junit.Test;
-import junit.framework.TestCase;
import org.w3c.dom.Node;
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
@@ -20,6 +31,9 @@ import java.sql.SQLException;
import java.sql.SQLXML;
import java.sql.Statement;
import java.sql.Types;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
import javax.xml.transform.ErrorListener;
import javax.xml.transform.Result;
@@ -36,49 +50,64 @@ import javax.xml.transform.stax.StAXSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
+public class XmlTest extends BaseTest4 {
+ private static final String _xsl =
+ "<xsl:stylesheet version=\"1.0\" xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\"><xsl:output method=\"text\" indent=\"no\" /><xsl:template match=\"/a\"><xsl:for-each select=\"/a/b\">B<xsl:value-of select=\".\" /></xsl:for-each></xsl:template></xsl:stylesheet>";
+ private static final String _xmlDocument = "<a><b>1</b><b>2</b></a>";
+ private static final String _xmlFragment = "<a>f</a><b>g</b>";
-public class XmlTest extends TestCase {
-
- private Connection _conn;
private final Transformer _xslTransformer;
private final Transformer _identityTransformer;
- private final static String _xsl =
- "<xsl:stylesheet version=\"1.0\" xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\"><xsl:output method=\"text\" indent=\"no\" /><xsl:template match=\"/a\"><xsl:for-each select=\"/a/b\">B<xsl:value-of select=\".\" /></xsl:for-each></xsl:template></xsl:stylesheet>";
- private final static String _xmlDocument = "<a><b>1</b><b>2</b></a>";
- private final static String _xmlFragment = "<a>f</a><b>g</b>";
- public XmlTest(String name) throws Exception {
- super(name);
+ public XmlTest() throws Exception {
TransformerFactory factory = TransformerFactory.newInstance();
_xslTransformer = factory.newTransformer(new StreamSource(new StringReader(_xsl)));
_xslTransformer.setErrorListener(new Ignorer());
_identityTransformer = factory.newTransformer();
}
- protected void setUp() throws Exception {
- _conn = TestUtil.openDB();
- Statement stmt = _conn.createStatement();
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+ assumeMinimumServerVersion(ServerVersion.v8_3);
+ assumeTrue("Server has been compiled --with-libxml", isXmlEnabled(con));
+
+ Statement stmt = con.createStatement();
stmt.execute("CREATE TEMP TABLE xmltest(id int primary key, val xml)");
stmt.execute("INSERT INTO xmltest VALUES (1, '" + _xmlDocument + "')");
stmt.execute("INSERT INTO xmltest VALUES (2, '" + _xmlFragment + "')");
stmt.close();
}
- protected void tearDown() throws SQLException {
- Statement stmt = _conn.createStatement();
- stmt.execute("DROP TABLE xmltest");
+ private static boolean isXmlEnabled(Connection conn) {
+ try {
+ Statement stmt = conn.createStatement();
+ ResultSet rs = stmt.executeQuery("SELECT '<a>b</a>'::xml");
+ rs.close();
+ stmt.close();
+ return true;
+ } catch (SQLException sqle) {
+ return false;
+ }
+ }
+
+ @Override
+ public void tearDown() throws SQLException {
+ Statement stmt = con.createStatement();
+ stmt.execute("DROP TABLE IF EXISTS xmltest");
stmt.close();
- TestUtil.closeDB(_conn);
+ super.tearDown();
}
private ResultSet getRS() throws SQLException {
- Statement stmt = _conn.createStatement();
+ Statement stmt = con.createStatement();
return stmt.executeQuery("SELECT val FROM xmltest");
}
+ @Test
public void testUpdateRS() throws SQLException {
- Statement stmt = _conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE);
+ Statement stmt = con.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE);
ResultSet rs = stmt.executeQuery("SELECT id, val FROM xmltest");
assertTrue(rs.next());
SQLXML xml = rs.getSQLXML(2);
@@ -86,6 +115,7 @@ public class XmlTest extends TestCase {
rs.updateRow();
}
+ @Test
public void testDOMParse() throws SQLException {
ResultSet rs = getRS();
@@ -136,29 +166,33 @@ public class XmlTest extends TestCase {
}
}
+ @Test
public void testDOMRead() throws Exception {
testRead(DOMSource.class);
}
+ @Test
public void testSAXRead() throws Exception {
testRead(SAXSource.class);
}
+ @Test
public void testStAXRead() throws Exception {
testRead(StAXSource.class);
}
+ @Test
public void testStreamRead() throws Exception {
testRead(StreamSource.class);
}
private <T extends Result> void testWrite(Class<T> resultClass) throws Exception {
- Statement stmt = _conn.createStatement();
+ Statement stmt = con.createStatement();
stmt.execute("DELETE FROM xmltest");
stmt.close();
- PreparedStatement ps = _conn.prepareStatement("INSERT INTO xmltest VALUES (?,?)");
- SQLXML xml = _conn.createSQLXML();
+ PreparedStatement ps = con.prepareStatement("INSERT INTO xmltest VALUES (?,?)");
+ SQLXML xml = con.createSQLXML();
Result result = xml.setResult(resultClass);
Source source = new StreamSource(new StringReader(_xmlDocument));
@@ -186,22 +220,27 @@ public class XmlTest extends TestCase {
assertTrue(!rs.next());
}
+ @Test
public void testDomWrite() throws Exception {
testWrite(DOMResult.class);
}
+ @Test
public void testStAXWrite() throws Exception {
testWrite(StAXResult.class);
}
+ @Test
public void testStreamWrite() throws Exception {
testWrite(StreamResult.class);
}
+ @Test
public void testSAXWrite() throws Exception {
testWrite(SAXResult.class);
}
+ @Test
public void testFree() throws SQLException {
ResultSet rs = getRS();
assertTrue(rs.next());
@@ -215,25 +254,76 @@ public class XmlTest extends TestCase {
}
}
+ @Test
public void testGetObject() throws SQLException {
ResultSet rs = getRS();
assertTrue(rs.next());
SQLXML xml = (SQLXML) rs.getObject(1);
}
+ private SQLXML newConsumableSQLXML(String content) throws Exception {
+ SQLXML xml = (SQLXML) Proxy.newProxyInstance(getClass().getClassLoader(), new Class[] { SQLXML.class }, new InvocationHandler() {
+ SQLXML xml = con.createSQLXML();
+ boolean consumed = false;
+ Set<Method> consumingMethods = new HashSet<Method>(Arrays.asList(
+ SQLXML.class.getMethod("getBinaryStream"),
+ SQLXML.class.getMethod("getCharacterStream"),
+ SQLXML.class.getMethod("getString")
+ ));
+
+ @Override
+ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
+ if (consumingMethods.contains(method)) {
+ if (consumed) {
+ fail("SQLXML-object already consumed");
+ } else {
+ consumed = true;
+ }
+ }
+ return method.invoke(xml, args);
+ }
+ });
+ xml.setString(content);
+ return xml;
+ }
+
+ @Test
+ public void testSet() throws Exception {
+ Statement stmt = con.createStatement();
+ stmt.execute("DELETE FROM xmltest");
+ stmt.close();
+
+ PreparedStatement ps = con.prepareStatement("INSERT INTO xmltest VALUES (?,?)");
+ ps.setInt(1, 1);
+ ps.setSQLXML(2, newConsumableSQLXML(_xmlDocument));
+ assertEquals(1, ps.executeUpdate());
+ ps.setInt(1, 2);
+ ps.setObject(2, newConsumableSQLXML(_xmlDocument));
+ assertEquals(1, ps.executeUpdate());
+ ResultSet rs = getRS();
+ assertTrue(rs.next());
+ Object o = rs.getObject(1);
+ assertTrue(o instanceof SQLXML);
+ assertEquals(_xmlDocument, ((SQLXML) o).getString());
+ assertTrue(rs.next());
+ assertEquals(_xmlDocument, rs.getSQLXML(1).getString());
+ assertTrue(!rs.next());
+ }
+
+ @Test
public void testSetNull() throws SQLException {
- Statement stmt = _conn.createStatement();
+ Statement stmt = con.createStatement();
stmt.execute("DELETE FROM xmltest");
stmt.close();
- PreparedStatement ps = _conn.prepareStatement("INSERT INTO xmltest VALUES (?,?)");
+ PreparedStatement ps = con.prepareStatement("INSERT INTO xmltest VALUES (?,?)");
ps.setInt(1, 1);
ps.setNull(2, Types.SQLXML);
ps.executeUpdate();
ps.setInt(1, 2);
ps.setObject(2, null, Types.SQLXML);
ps.executeUpdate();
- SQLXML xml = _conn.createSQLXML();
+ SQLXML xml = con.createSQLXML();
xml.setString(null);
ps.setInt(1, 3);
ps.setObject(2, xml);
@@ -250,8 +340,9 @@ public class XmlTest extends TestCase {
assertTrue(!rs.next());
}
+ @Test
public void testEmpty() throws SQLException, IOException {
- SQLXML xml = _conn.createSQLXML();
+ SQLXML xml = con.createSQLXML();
try {
xml.getString();
@@ -266,8 +357,9 @@ public class XmlTest extends TestCase {
}
}
+ @Test
public void testDoubleSet() throws SQLException {
- SQLXML xml = _conn.createSQLXML();
+ SQLXML xml = con.createSQLXML();
xml.setString("");
@@ -290,12 +382,15 @@ public class XmlTest extends TestCase {
// Don't print warning and errors to System.err, it just
// clutters the display.
static class Ignorer implements ErrorListener {
+ @Override
public void error(TransformerException t) {
}
+ @Override
public void fatalError(TransformerException t) {
}
+ @Override
public void warning(TransformerException t) {
}
}
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc4/jdbc41/AbortTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc4/jdbc41/AbortTest.java
index 6387c34..11aea71 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc4/jdbc41/AbortTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc4/jdbc41/AbortTest.java
@@ -5,11 +5,13 @@
package org.postgresql.test.jdbc4.jdbc41;
-import org.postgresql.test.TestUtil;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
-import junit.framework.TestCase;
+import org.postgresql.test.jdbc2.BaseTest4;
+
+import org.junit.Test;
-import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.concurrent.Callable;
@@ -19,32 +21,19 @@ import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
-public class AbortTest extends TestCase {
+public class AbortTest extends BaseTest4 {
private static final int SLEEP_SECONDS = 30;
private static final int SLEEP_MILLISECONDS = SLEEP_SECONDS * 1000;
- private Connection _conn;
-
- public AbortTest(String name) {
- super(name);
- }
-
- protected void setUp() throws Exception {
- _conn = TestUtil.openDB();
- }
-
- protected void tearDown() throws SQLException {
- TestUtil.closeDB(_conn);
- }
-
+ @Test
public void testAbort() throws SQLException, InterruptedException, ExecutionException {
final ExecutorService executor = Executors.newFixedThreadPool(2);
long startTime = System.currentTimeMillis();
Future<SQLException> workerFuture = executor.submit(new Callable<SQLException>() {
public SQLException call() {
try {
- Statement stmt = _conn.createStatement();
+ Statement stmt = con.createStatement();
stmt.execute("SELECT pg_sleep(" + SLEEP_SECONDS + ")");
} catch (SQLException e) {
return e;
@@ -56,7 +45,7 @@ public class AbortTest extends TestCase {
public SQLException call() {
ExecutorService abortExecutor = Executors.newSingleThreadExecutor();
try {
- _conn.abort(abortExecutor);
+ con.abort(abortExecutor);
} catch (SQLException e) {
return e;
}
@@ -80,16 +69,17 @@ public class AbortTest extends TestCase {
// suppose that if it took at least 95% of sleep time, aborting has failed and we've waited the
// full time
assertTrue(endTime - startTime < SLEEP_MILLISECONDS * 95 / 100);
- assertTrue(_conn.isClosed());
+ assertTrue(con.isClosed());
}
/**
* According to the javadoc, calling abort on a closed connection is a no-op.
*/
+ @Test
public void testAbortOnClosedConnection() throws SQLException {
- _conn.close();
+ con.close();
try {
- _conn.abort(Executors.newSingleThreadExecutor());
+ con.abort(Executors.newSingleThreadExecutor());
} catch (SQLException e) {
fail(e.getMessage());
}
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc4/jdbc41/CloseOnCompletionTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc4/jdbc41/CloseOnCompletionTest.java
index 78b5d99..0b34770 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc4/jdbc41/CloseOnCompletionTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc4/jdbc41/CloseOnCompletionTest.java
@@ -5,29 +5,31 @@
package org.postgresql.test.jdbc4.jdbc41;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
import org.postgresql.test.TestUtil;
-import junit.framework.TestCase;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
-public class CloseOnCompletionTest extends TestCase {
-
+public class CloseOnCompletionTest {
private Connection _conn;
- public CloseOnCompletionTest(String name) {
- super(name);
- }
-
- protected void setUp() throws Exception {
+ @Before
+ public void setUp() throws Exception {
_conn = TestUtil.openDB();
TestUtil.createTable(_conn, "table1", "id integer");
}
- protected void tearDown() throws SQLException {
+ @After
+ public void tearDown() throws SQLException {
TestUtil.dropTable(_conn, "table1");
TestUtil.closeDB(_conn);
}
@@ -35,6 +37,7 @@ public class CloseOnCompletionTest extends TestCase {
/**
* Test that the statement is not automatically closed if we do not ask for it
*/
+ @Test
public void testWithoutCloseOnCompletion() throws SQLException {
Statement stmt = _conn.createStatement();
@@ -46,6 +49,7 @@ public class CloseOnCompletionTest extends TestCase {
/**
* Test the behavior of closeOnCompletion with a single result set
*/
+ @Test
public void testSingleResultSet() throws SQLException {
Statement stmt = _conn.createStatement();
stmt.closeOnCompletion();
@@ -58,6 +62,7 @@ public class CloseOnCompletionTest extends TestCase {
/**
* Test the behavior of closeOnCompletion with a multiple result sets
*/
+ @Test
public void testMultipleResultSet() throws SQLException {
Statement stmt = _conn.createStatement();
stmt.closeOnCompletion();
@@ -76,6 +81,7 @@ public class CloseOnCompletionTest extends TestCase {
* Test that when execution does not produce any result sets, closeOnCompletion has no effect
* (spec)
*/
+ @Test
public void testNoResultSet() throws SQLException {
Statement stmt = _conn.createStatement();
stmt.closeOnCompletion();
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc4/jdbc41/GetObjectTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc4/jdbc41/GetObjectTest.java
index fb19c51..56e74e1 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc4/jdbc41/GetObjectTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc4/jdbc41/GetObjectTest.java
@@ -5,6 +5,10 @@
package org.postgresql.test.jdbc4.jdbc41;
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
import org.postgresql.core.BaseConnection;
import org.postgresql.core.ServerVersion;
@@ -19,11 +23,13 @@ import org.postgresql.test.TestUtil;
import org.postgresql.util.PGInterval;
import org.postgresql.util.PGmoney;
-import junit.framework.TestCase;
-
-import org.junit.Assert;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Test;
import java.math.BigDecimal;
+import java.math.BigInteger;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.sql.Array;
@@ -47,8 +53,7 @@ import java.util.UUID;
import javax.sql.rowset.serial.SerialBlob;
import javax.sql.rowset.serial.SerialClob;
-public class GetObjectTest extends TestCase {
-
+public class GetObjectTest {
private static final TimeZone UTC = TimeZone.getTimeZone("UTC"); // +0000 always
private static final TimeZone GMT03 = TimeZone.getTimeZone("GMT+03"); // +0300 always
private static final TimeZone GMT05 = TimeZone.getTimeZone("GMT-05"); // -0500 always
@@ -56,11 +61,8 @@ public class GetObjectTest extends TestCase {
private Connection _conn;
- public GetObjectTest(String name) {
- super(name);
- }
-
- protected void setUp() throws Exception {
+ @Before
+ public void setUp() throws Exception {
_conn = TestUtil.openDB();
TestUtil.createTable(_conn, "table1", "varchar_column varchar(16), "
+ "char_column char(10), "
@@ -93,15 +95,16 @@ public class GetObjectTest extends TestCase {
+ "circle_column circle,"
+ "money_column money,"
+ "interval_column interval,"
- + "uuid_column uuid,"
+ + (TestUtil.haveMinimumServerVersion(_conn, ServerVersion.v8_3) ? "uuid_column uuid," : "")
+ "inet_column inet,"
+ "cidr_column cidr,"
- + "macaddr_column macaddr,"
- + "xml_column xml"
+ + "macaddr_column macaddr"
+ + (TestUtil.haveMinimumServerVersion(_conn, ServerVersion.v8_3) ? ",xml_column xml" : "")
);
}
- protected void tearDown() throws SQLException {
+ @After
+ public void tearDown() throws SQLException {
TestUtil.dropTable(_conn, "table1");
TestUtil.closeDB( _conn );
}
@@ -109,6 +112,7 @@ public class GetObjectTest extends TestCase {
/**
* Test the behavior getObject for string columns.
*/
+ @Test
public void testGetString() throws SQLException {
Statement stmt = _conn.createStatement();
stmt.executeUpdate(TestUtil.insertSQL("table1","varchar_column,char_column","'varchar_value','char_value'"));
@@ -128,6 +132,7 @@ public class GetObjectTest extends TestCase {
/**
* Test the behavior getObject for string columns.
*/
+ @Test
public void testGetClob() throws SQLException {
Statement stmt = _conn.createStatement();
_conn.setAutoCommit(false);
@@ -164,6 +169,7 @@ public class GetObjectTest extends TestCase {
/**
* Test the behavior getObject for big decimal columns.
*/
+ @Test
public void testGetBigDecimal() throws SQLException {
Statement stmt = _conn.createStatement();
stmt.executeUpdate(TestUtil.insertSQL("table1","decimal_column,numeric_column","0.1,0.1"));
@@ -183,6 +189,7 @@ public class GetObjectTest extends TestCase {
/**
* Test the behavior getObject for timestamp columns.
*/
+ @Test
public void testGetTimestamp() throws SQLException {
Statement stmt = _conn.createStatement();
stmt.executeUpdate(TestUtil.insertSQL("table1","timestamp_without_time_zone_column","TIMESTAMP '2004-10-19 10:23:54'"));
@@ -207,8 +214,37 @@ public class GetObjectTest extends TestCase {
}
/**
+ *
+ * Test the behavior getObject for timestamp columns.
+ */
+ @Test
+ public void testGetJavaUtilDate() throws SQLException {
+ Statement stmt = _conn.createStatement();
+ ResultSet rs = stmt.executeQuery("select TIMESTAMP '2004-10-19 10:23:54'::timestamp as timestamp_without_time_zone_column"
+ + ", null::timestamp as null_timestamp");
+ try {
+ assertTrue(rs.next());
+ Calendar calendar = GregorianCalendar.getInstance();
+ calendar.clear();
+ calendar.set(Calendar.YEAR, 2004);
+ calendar.set(Calendar.MONTH, Calendar.OCTOBER);
+ calendar.set(Calendar.DAY_OF_MONTH, 19);
+ calendar.set(Calendar.HOUR_OF_DAY, 10);
+ calendar.set(Calendar.MINUTE, 23);
+ calendar.set(Calendar.SECOND, 54);
+ java.util.Date expected = new java.util.Date(calendar.getTimeInMillis());
+ assertEquals(expected, rs.getObject("timestamp_without_time_zone_column", java.util.Date.class));
+ assertEquals(expected, rs.getObject(1, java.util.Date.class));
+ assertNull(rs.getObject(2, java.util.Date.class));
+ } finally {
+ rs.close();
+ }
+ }
+
+ /**
* Test the behavior getObject for timestamp columns.
*/
+ @Test
public void testGetTimestampWithTimeZone() throws SQLException {
runGetTimestampWithTimeZone(UTC, "Z");
runGetTimestampWithTimeZone(GMT03, "+03:00");
@@ -248,11 +284,12 @@ public class GetObjectTest extends TestCase {
/**
* Test the behavior getObject for timestamp columns.
*/
+ @Test
public void testGetCalendar() throws SQLException {
Statement stmt = _conn.createStatement();
- stmt.executeUpdate(TestUtil.insertSQL("table1","timestamp_without_time_zone_column,timestamp_with_time_zone_column","TIMESTAMP '2004-10-19 10:23:54', TIMESTAMP '2004-10-19 10:23:54+02'"));
- ResultSet rs = stmt.executeQuery(TestUtil.selectSQL("table1", "timestamp_without_time_zone_column, timestamp_with_time_zone_column"));
+ ResultSet rs = stmt.executeQuery("select TIMESTAMP '2004-10-19 10:23:54'::timestamp as timestamp_without_time_zone_column"
+ + ", TIMESTAMP '2004-10-19 10:23:54+02'::timestamp as timestamp_with_time_zone_column, null::timestamp as null_timestamp");
try {
assertTrue(rs.next());
Calendar calendar = GregorianCalendar.getInstance();
@@ -266,10 +303,12 @@ public class GetObjectTest extends TestCase {
long expected = calendar.getTimeInMillis();
assertEquals(expected, rs.getObject("timestamp_without_time_zone_column", Calendar.class).getTimeInMillis());
assertEquals(expected, rs.getObject(1, Calendar.class).getTimeInMillis());
+ assertNull(rs.getObject(3, Calendar.class));
calendar.setTimeZone(TimeZone.getTimeZone("GMT+2:00"));
expected = calendar.getTimeInMillis();
assertEquals(expected, rs.getObject("timestamp_with_time_zone_column", Calendar.class).getTimeInMillis());
assertEquals(expected, rs.getObject(2, Calendar.class).getTimeInMillis());
+ assertNull(rs.getObject(3, Calendar.class));
} finally {
rs.close();
}
@@ -278,6 +317,7 @@ public class GetObjectTest extends TestCase {
/**
* Test the behavior getObject for date columns.
*/
+ @Test
public void testGetDate() throws SQLException {
Statement stmt = _conn.createStatement();
stmt.executeUpdate(TestUtil.insertSQL("table1","date_column","DATE '1999-01-08'"));
@@ -301,6 +341,7 @@ public class GetObjectTest extends TestCase {
/**
* Test the behavior getObject for time columns.
*/
+ @Test
public void testGetTime() throws SQLException {
Statement stmt = _conn.createStatement();
stmt.executeUpdate(TestUtil.insertSQL("table1","time_without_time_zone_column","TIME '04:05:06'"));
@@ -325,8 +366,45 @@ public class GetObjectTest extends TestCase {
}
/**
+ * Test the behavior getObject for small integer columns.
+ */
+ @Test
+ public void testGetShort() throws SQLException {
+ Statement stmt = _conn.createStatement();
+ stmt.executeUpdate(TestUtil.insertSQL("table1","smallint_column","1"));
+
+ ResultSet rs = stmt.executeQuery(TestUtil.selectSQL("table1", "smallint_column"));
+ try {
+ assertTrue(rs.next());
+ assertEquals(Short.valueOf((short) 1), rs.getObject("smallint_column", Short.class));
+ assertEquals(Short.valueOf((short) 1), rs.getObject(1, Short.class));
+ } finally {
+ rs.close();
+ }
+ }
+
+ /**
+ * Test the behavior getObject for small integer columns.
+ */
+ @Test
+ public void testGetShortNull() throws SQLException {
+ Statement stmt = _conn.createStatement();
+ stmt.executeUpdate(TestUtil.insertSQL("table1","smallint_column","NULL"));
+
+ ResultSet rs = stmt.executeQuery(TestUtil.selectSQL("table1", "smallint_column"));
+ try {
+ assertTrue(rs.next());
+ assertNull(rs.getObject("smallint_column", Short.class));
+ assertNull(rs.getObject(1, Short.class));
+ } finally {
+ rs.close();
+ }
+ }
+
+ /**
* Test the behavior getObject for integer columns.
*/
+ @Test
public void testGetInteger() throws SQLException {
Statement stmt = _conn.createStatement();
stmt.executeUpdate(TestUtil.insertSQL("table1","smallint_column, integer_column","1, 2"));
@@ -346,6 +424,7 @@ public class GetObjectTest extends TestCase {
/**
* Test the behavior getObject for integer columns.
*/
+ @Test
public void testGetIntegerNull() throws SQLException {
Statement stmt = _conn.createStatement();
stmt.executeUpdate(TestUtil.insertSQL("table1","smallint_column, integer_column","NULL, NULL"));
@@ -365,6 +444,25 @@ public class GetObjectTest extends TestCase {
/**
* Test the behavior getObject for long columns.
*/
+ @Test
+ public void testGetBigInteger() throws SQLException {
+ Statement stmt = _conn.createStatement();
+ stmt.executeUpdate(TestUtil.insertSQL("table1","bigint_column","2147483648"));
+
+ ResultSet rs = stmt.executeQuery(TestUtil.selectSQL("table1", "bigint_column"));
+ try {
+ assertTrue(rs.next());
+ assertEquals(BigInteger.valueOf(2147483648L), rs.getObject("bigint_column", BigInteger.class));
+ assertEquals(BigInteger.valueOf(2147483648L), rs.getObject(1, BigInteger.class));
+ } finally {
+ rs.close();
+ }
+ }
+
+ /**
+ * Test the behavior getObject for long columns.
+ */
+ @Test
public void testGetLong() throws SQLException {
Statement stmt = _conn.createStatement();
stmt.executeUpdate(TestUtil.insertSQL("table1","bigint_column","2147483648"));
@@ -382,6 +480,7 @@ public class GetObjectTest extends TestCase {
/**
* Test the behavior getObject for long columns.
*/
+ @Test
public void testGetLongNull() throws SQLException {
Statement stmt = _conn.createStatement();
stmt.executeUpdate(TestUtil.insertSQL("table1","bigint_column","NULL"));
@@ -399,6 +498,7 @@ public class GetObjectTest extends TestCase {
/**
* Test the behavior getObject for double columns.
*/
+ @Test
public void testGetDouble() throws SQLException {
Statement stmt = _conn.createStatement();
stmt.executeUpdate(TestUtil.insertSQL("table1","double_column","1.0"));
@@ -416,6 +516,7 @@ public class GetObjectTest extends TestCase {
/**
* Test the behavior getObject for double columns.
*/
+ @Test
public void testGetDoubleNull() throws SQLException {
Statement stmt = _conn.createStatement();
stmt.executeUpdate(TestUtil.insertSQL("table1","double_column","NULL"));
@@ -433,6 +534,7 @@ public class GetObjectTest extends TestCase {
/**
* Test the behavior getObject for float columns.
*/
+ @Test
public void testGetFloat() throws SQLException {
Statement stmt = _conn.createStatement();
stmt.executeUpdate(TestUtil.insertSQL("table1","real_column","1.0"));
@@ -450,6 +552,7 @@ public class GetObjectTest extends TestCase {
/**
* Test the behavior getObject for float columns.
*/
+ @Test
public void testGetFloatNull() throws SQLException {
Statement stmt = _conn.createStatement();
stmt.executeUpdate(TestUtil.insertSQL("table1","real_column","NULL"));
@@ -467,6 +570,7 @@ public class GetObjectTest extends TestCase {
/**
* Test the behavior getObject for serial columns.
*/
+ @Test
public void testGetSerial() throws SQLException {
if (!((BaseConnection) _conn).haveMinimumServerVersion(ServerVersion.v9_2)) {
// smallserial requires 9.2 or later
@@ -490,6 +594,7 @@ public class GetObjectTest extends TestCase {
/**
* Test the behavior getObject for boolean columns.
*/
+ @Test
public void testGetBoolean() throws SQLException {
Statement stmt = _conn.createStatement();
stmt.executeUpdate(TestUtil.insertSQL("table1","boolean_column","TRUE"));
@@ -507,6 +612,7 @@ public class GetObjectTest extends TestCase {
/**
* Test the behavior getObject for boolean columns.
*/
+ @Test
public void testGetBooleanNull() throws SQLException {
Statement stmt = _conn.createStatement();
stmt.executeUpdate(TestUtil.insertSQL("table1","boolean_column","NULL"));
@@ -524,6 +630,7 @@ public class GetObjectTest extends TestCase {
/**
* Test the behavior getObject for xml columns.
*/
+ @Test
public void testGetBlob() throws SQLException {
Statement stmt = _conn.createStatement();
_conn.setAutoCommit(false);
@@ -542,12 +649,12 @@ public class GetObjectTest extends TestCase {
assertTrue(rs.next());
Blob blob = rs.getObject("lob_column", Blob.class);
assertEquals(data.length, blob.length());
- Assert.assertArrayEquals(data, blob.getBytes(1, data.length));
+ assertArrayEquals(data, blob.getBytes(1, data.length));
blob.free();
blob = rs.getObject(1, Blob.class);
assertEquals(data.length, blob.length());
- Assert.assertArrayEquals(data, blob.getBytes(1, data.length));
+ assertArrayEquals(data, blob.getBytes(1, data.length));
blob.free();
} finally {
rs.close();
@@ -560,6 +667,7 @@ public class GetObjectTest extends TestCase {
/**
* Test the behavior getObject for array columns.
*/
+ @Test
public void testGetArray() throws SQLException {
Statement stmt = _conn.createStatement();
String[] data = new String[]{"java", "jdbc"};
@@ -569,11 +677,11 @@ public class GetObjectTest extends TestCase {
try {
assertTrue(rs.next());
Array array = rs.getObject("array_column", Array.class);
- Assert.assertArrayEquals(data, (String[]) array.getArray());
+ assertArrayEquals(data, (String[]) array.getArray());
array.free();
array = rs.getObject(1, Array.class);
- Assert.assertArrayEquals(data, (String[]) array.getArray());
+ assertArrayEquals(data, (String[]) array.getArray());
array.free();
} finally {
rs.close();
@@ -583,7 +691,12 @@ public class GetObjectTest extends TestCase {
/**
* Test the behavior getObject for xml columns.
*/
+ @Test
public void testGetXml() throws SQLException {
+ if (!TestUtil.haveMinimumServerVersion(_conn, ServerVersion.v8_3)) {
+ // XML column requires PostgreSQL 8.3+
+ return;
+ }
Statement stmt = _conn.createStatement();
String content = "<book><title>Manual</title></book>";
stmt.executeUpdate(TestUtil.insertSQL("table1","xml_column","XMLPARSE (DOCUMENT '<?xml version=\"1.0\"?><book><title>Manual</title></book>')"));
@@ -608,7 +721,9 @@ public class GetObjectTest extends TestCase {
*
* The test is ignored as it is locale-dependent.
*/
- public void _testGetMoney() throws SQLException {
+ @Ignore
+ @Test
+ public void testGetMoney() throws SQLException {
Statement stmt = _conn.createStatement();
String expected = "12.34";
stmt.executeUpdate(TestUtil.insertSQL("table1","money_column","'12.34'::float8::numeric::money"));
@@ -629,6 +744,7 @@ public class GetObjectTest extends TestCase {
/**
* Test the behavior getObject for point columns.
*/
+ @Test
public void testGetPoint() throws SQLException {
Statement stmt = _conn.createStatement();
PGpoint expected = new PGpoint(1.0d, 2.0d);
@@ -647,6 +763,7 @@ public class GetObjectTest extends TestCase {
/**
* Test the behavior getObject for line columns.
*/
+ @Test
public void testGetLine() throws SQLException {
if (!((BaseConnection) _conn).haveMinimumServerVersion(ServerVersion.v9_4)) {
// only 9.4 and later ship with full line support by default
@@ -670,6 +787,7 @@ public class GetObjectTest extends TestCase {
/**
* Test the behavior getObject for lseg columns.
*/
+ @Test
public void testGetLineseg() throws SQLException {
Statement stmt = _conn.createStatement();
PGlseg expected = new PGlseg(1.0d, 2.0d, 3.0d, 4.0d);
@@ -688,6 +806,7 @@ public class GetObjectTest extends TestCase {
/**
* Test the behavior getObject for box columns.
*/
+ @Test
public void testGetBox() throws SQLException {
Statement stmt = _conn.createStatement();
PGbox expected = new PGbox(1.0d, 2.0d, 3.0d, 4.0d);
@@ -706,6 +825,7 @@ public class GetObjectTest extends TestCase {
/**
* Test the behavior getObject for path columns.
*/
+ @Test
public void testGetPath() throws SQLException {
Statement stmt = _conn.createStatement();
PGpath expected = new PGpath(new PGpoint[]{new PGpoint(1.0d, 2.0d), new PGpoint(3.0d, 4.0d)}, true);
@@ -724,6 +844,7 @@ public class GetObjectTest extends TestCase {
/**
* Test the behavior getObject for polygon columns.
*/
+ @Test
public void testGetPolygon() throws SQLException {
Statement stmt = _conn.createStatement();
PGpolygon expected = new PGpolygon(new PGpoint[]{new PGpoint(1.0d, 2.0d), new PGpoint(3.0d, 4.0d)});
@@ -742,6 +863,7 @@ public class GetObjectTest extends TestCase {
/**
* Test the behavior getObject for circle columns.
*/
+ @Test
public void testGetCircle() throws SQLException {
Statement stmt = _conn.createStatement();
PGcircle expected = new PGcircle(1.0d, 2.0d, 3.0d);
@@ -760,6 +882,7 @@ public class GetObjectTest extends TestCase {
/**
* Test the behavior getObject for interval columns.
*/
+ @Test
public void testGetInterval() throws SQLException {
Statement stmt = _conn.createStatement();
PGInterval expected = new PGInterval(0, 0, 3, 4, 5, 6.0d);
@@ -778,7 +901,12 @@ public class GetObjectTest extends TestCase {
/**
* Test the behavior getObject for uuid columns.
*/
+ @Test
public void testGetUuid() throws SQLException {
+ if (!TestUtil.haveMinimumServerVersion(_conn, ServerVersion.v8_3)) {
+ // UUID requires PostgreSQL 8.3+
+ return;
+ }
Statement stmt = _conn.createStatement();
String expected = "a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11";
stmt.executeUpdate(TestUtil.insertSQL("table1","uuid_column","'" + expected + "'"));
@@ -796,6 +924,7 @@ public class GetObjectTest extends TestCase {
/**
* Test the behavior getObject for inet columns.
*/
+ @Test
public void testGetInetAddressNull() throws SQLException, UnknownHostException {
Statement stmt = _conn.createStatement();
stmt.executeUpdate(TestUtil.insertSQL("table1","inet_column","NULL"));
@@ -813,6 +942,7 @@ public class GetObjectTest extends TestCase {
/**
* Test the behavior getObject for inet columns.
*/
+ @Test
public void testGetInet4Address() throws SQLException, UnknownHostException {
Statement stmt = _conn.createStatement();
String expected = "192.168.100.128";
@@ -831,6 +961,7 @@ public class GetObjectTest extends TestCase {
/**
* Test the behavior getObject for inet columns.
*/
+ @Test
public void testGetInet6Address() throws SQLException, UnknownHostException {
Statement stmt = _conn.createStatement();
String expected = "2001:4f8:3:ba:2e0:81ff:fe22:d1f1";
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc4/jdbc41/Jdbc41TestSuite.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc4/jdbc41/Jdbc41TestSuite.java
index 86228c5..046696a 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc4/jdbc41/Jdbc41TestSuite.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc4/jdbc41/Jdbc41TestSuite.java
@@ -5,26 +5,21 @@
package org.postgresql.test.jdbc4.jdbc41;
-import junit.framework.TestSuite;
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
/*
* Executes all known tests for JDBC4.1
*/
-public class Jdbc41TestSuite extends TestSuite {
-
- /*
- * The main entry point for JUnit
- */
- public static TestSuite suite() throws Exception {
- Class.forName("org.postgresql.Driver");
- TestSuite suite = new TestSuite();
-
- suite.addTestSuite(SchemaTest.class);
- suite.addTestSuite(AbortTest.class);
- suite.addTestSuite(CloseOnCompletionTest.class);
- suite.addTestSuite(GetObjectTest.class);
-
- return suite;
- }
+ at RunWith(Suite.class)
+ at Suite.SuiteClasses({
+ SchemaTest.class,
+ AbortTest.class,
+ CloseOnCompletionTest.class,
+ SharedTimerClassLoaderLeakTest.class,
+ NetworkTimeoutTest.class,
+ GetObjectTest.class}
+ )
+public class Jdbc41TestSuite {
}
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc4/jdbc41/NetworkTimeoutTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc4/jdbc41/NetworkTimeoutTest.java
new file mode 100644
index 0000000..8adfd3e
--- /dev/null
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc4/jdbc41/NetworkTimeoutTest.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright (c) 2007, PostgreSQL Global Development Group
+ * See the LICENSE file in the project root for more information.
+ */
+
+package org.postgresql.test.jdbc4.jdbc41;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import org.postgresql.test.TestUtil;
+
+import org.junit.Test;
+
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.concurrent.TimeUnit;
+
+public class NetworkTimeoutTest {
+ @Test
+ public void testSetNetworkTimeout() throws Exception {
+ Connection _conn = TestUtil.openDB();
+ try {
+ _conn.setNetworkTimeout(null, 0);
+ } catch (SQLException e) {
+ fail("Connection.setNetworkTimeout() throw exception");
+ } finally {
+ TestUtil.closeDB(_conn);
+ }
+ }
+
+ @Test
+ public void testSetNetworkTimeoutInvalid() throws Exception {
+ Connection _conn = TestUtil.openDB();
+ try {
+ _conn.setNetworkTimeout(null, -1);
+ fail("Connection.setNetworkTimeout() did not throw expected exception");
+ } catch (SQLException e) {
+ // Passed
+ } finally {
+ TestUtil.closeDB(_conn);
+ }
+ }
+
+ @Test
+ public void testSetNetworkTimeoutValid() throws Exception {
+ Connection _conn = TestUtil.openDB();
+ try {
+ _conn.setNetworkTimeout(null, (int) TimeUnit.SECONDS.toMillis(5));
+ assertEquals(TimeUnit.SECONDS.toMillis(5), _conn.getNetworkTimeout());
+ } catch (SQLException e) {
+ fail("Connection.setNetworkTimeout() throw exception");
+ } finally {
+ TestUtil.closeDB(_conn);
+ }
+ }
+
+ @Test
+ public void testSetNetworkTimeoutEnforcement() throws Exception {
+ Connection _conn = TestUtil.openDB();
+ Statement stmt = null;
+ try {
+ _conn.setNetworkTimeout(null, (int) TimeUnit.SECONDS.toMillis(1));
+ stmt = _conn.createStatement();
+ stmt.execute("SELECT pg_sleep(2)");
+ fail("Connection.setNetworkTimeout() did not throw expected exception");
+ } catch (SQLException e) {
+ // assertTrue(stmt.isClosed());
+ assertTrue(_conn.isClosed());
+ } finally {
+ TestUtil.closeQuietly(stmt);
+ TestUtil.closeDB(_conn);
+ }
+ }
+}
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc4/jdbc41/SchemaTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc4/jdbc41/SchemaTest.java
index 0dc5ed6..0c9c648 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc4/jdbc41/SchemaTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc4/jdbc41/SchemaTest.java
@@ -5,9 +5,14 @@
package org.postgresql.test.jdbc4.jdbc41;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
import org.postgresql.test.TestUtil;
-import junit.framework.TestCase;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
import java.sql.Connection;
import java.sql.PreparedStatement;
@@ -18,17 +23,12 @@ import java.sql.Statement;
import java.sql.Types;
import java.util.Properties;
-public class SchemaTest extends TestCase {
-
+public class SchemaTest {
private Connection _conn;
-
private boolean dropUserSchema;
- public SchemaTest(String name) {
- super(name);
- }
-
- protected void setUp() throws Exception {
+ @Before
+ public void setUp() throws Exception {
_conn = TestUtil.openDB();
Statement stmt = _conn.createStatement();
try {
@@ -51,7 +51,8 @@ public class SchemaTest extends TestCase {
TestUtil.createTable(_conn, "schema2.sptest", "id varchar");
}
- protected void tearDown() throws SQLException {
+ @After
+ public void tearDown() throws SQLException {
_conn.setAutoCommit(true);
_conn.setSchema(null);
Statement stmt = _conn.createStatement();
@@ -71,6 +72,7 @@ public class SchemaTest extends TestCase {
/**
* Test that what you set is what you get
*/
+ @Test
public void testGetSetSchema() throws SQLException {
_conn.setSchema("schema1");
assertEquals("schema1", _conn.getSchema());
@@ -90,6 +92,7 @@ public class SchemaTest extends TestCase {
* Test that setting the schema allows to access objects of this schema without prefix, hide
* objects from other schemas but doesn't prevent to prefix-access to them.
*/
+ @Test
public void testUsingSchema() throws SQLException {
Statement stmt = _conn.createStatement();
try {
@@ -137,6 +140,7 @@ public class SchemaTest extends TestCase {
/**
* Test that get schema returns the schema with the highest priority in the search path
*/
+ @Test
public void testMultipleSearchPath() throws SQLException {
execute("SET search_path TO schema1,schema2");
assertEquals("schema1", _conn.getSchema());
@@ -145,6 +149,7 @@ public class SchemaTest extends TestCase {
assertEquals("schema ,6", _conn.getSchema());
}
+ @Test
public void testSchemaInProperties() throws Exception {
Properties properties = new Properties();
properties.setProperty("currentSchema", "schema1");
@@ -166,6 +171,7 @@ public class SchemaTest extends TestCase {
}
}
+ @Test
public void testSchemaPath$User() throws Exception {
execute("SET search_path TO \"$user\",public,schema2");
assertEquals(TestUtil.getUser(), _conn.getSchema());
@@ -183,15 +189,18 @@ public class SchemaTest extends TestCase {
}
}
+ @Test
public void testSearchPathPreparedStatementAutoCommitFalse() throws SQLException {
_conn.setAutoCommit(false);
testSearchPathPreparedStatement();
}
+ @Test
public void testSearchPathPreparedStatementAutoCommitTrue() throws SQLException {
testSearchPathPreparedStatement();
}
+ @Test
public void testSearchPathPreparedStatement() throws SQLException {
execute("set search_path to schema1,public");
PreparedStatement ps = _conn.prepareStatement("select * from sptest");
diff --git a/pgjdbc/src/test/java/org/postgresql/test/util/SharedTimerClassLoaderLeakTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc4/jdbc41/SharedTimerClassLoaderLeakTest.java
similarity index 82%
rename from pgjdbc/src/test/java/org/postgresql/test/util/SharedTimerClassLoaderLeakTest.java
rename to pgjdbc/src/test/java/org/postgresql/test/jdbc4/jdbc41/SharedTimerClassLoaderLeakTest.java
index 3f32a01..0eb2435 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/util/SharedTimerClassLoaderLeakTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc4/jdbc41/SharedTimerClassLoaderLeakTest.java
@@ -3,7 +3,7 @@
* See the LICENSE file in the project root for more information.
*/
-package org.postgresql.test.util;
+package org.postgresql.test.jdbc4.jdbc41;
import org.postgresql.Driver;
@@ -17,6 +17,10 @@ import se.jiderhamn.classloader.leak.Leaks;
/**
* Test case that verifies that the use of {@link org.postgresql.util.SharedTimer} within
* {@link org.postgresql.Driver} does not cause ClassLoader leaks
+ *
+ * The class is placed in {@code jdbc41} package so it won't be tested in JRE6 build.
+ * {@link JUnitClassloaderRunner} does not support JRE6, so we have to skip the test there.
+ *
* @author Mattias Jiderhamn
*/
@RunWith(JUnitClassloaderRunner.class)
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc42/GetObject310BinaryTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc42/GetObject310BinaryTest.java
deleted file mode 100644
index 01977ea..0000000
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc42/GetObject310BinaryTest.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Copyright (c) 2004, PostgreSQL Global Development Group
- * See the LICENSE file in the project root for more information.
- */
-
-package org.postgresql.test.jdbc42;
-
-import java.util.Properties;
-
-public class GetObject310BinaryTest extends GetObject310Test {
-
- public GetObject310BinaryTest(String name) {
- super(name);
- }
-
- @Override
- protected void updateProperties(Properties props) {
- forceBinary(props);
- }
-
-}
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc42/GetObject310InfinityTests.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc42/GetObject310InfinityTests.java
new file mode 100644
index 0000000..ab30e3f
--- /dev/null
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc42/GetObject310InfinityTests.java
@@ -0,0 +1,98 @@
+/*
+ * Copyright (c) 2017, PostgreSQL Global Development Group
+ * See the LICENSE file in the project root for more information.
+ */
+
+package org.postgresql.test.jdbc42;
+
+import org.postgresql.core.ServerVersion;
+import org.postgresql.test.TestUtil;
+import org.postgresql.test.jdbc2.BaseTest4;
+
+import org.junit.Assert;
+import org.junit.Assume;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+import java.lang.reflect.Field;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.OffsetDateTime;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+
+
+ at RunWith(Parameterized.class)
+public class GetObject310InfinityTests extends BaseTest4 {
+ private final String expression;
+ private final String pgType;
+ private final Class klass;
+ private final Object expectedValue;
+
+ public GetObject310InfinityTests(BinaryMode binaryMode, String expression,
+ String pgType, Class klass, Object expectedValue) {
+ setBinaryMode(binaryMode);
+ this.expression = expression;
+ this.pgType = pgType;
+ this.klass = klass;
+ this.expectedValue = expectedValue;
+ }
+
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+ Assume.assumeTrue("PostgreSQL 8.3 does not support 'infinity' for 'date'",
+ !"date".equals(pgType) || TestUtil.haveMinimumServerVersion(con, ServerVersion.v8_4));
+ }
+
+ @Parameterized.Parameters(name = "binary = {0}, expr = {1}, pgType = {2}, klass = {3}")
+ public static Iterable<Object[]> data() throws IllegalAccessException {
+ Collection<Object[]> ids = new ArrayList<Object[]>();
+ for (BinaryMode binaryMode : BinaryMode.values()) {
+ for (String expression : Arrays.asList("-infinity", "infinity")) {
+ for (String pgType : Arrays.asList("date", "timestamp",
+ "timestamp with time zone")) {
+ for (Class klass : Arrays.asList(LocalDate.class, LocalDateTime.class,
+ OffsetDateTime.class)) {
+ if (klass.equals(LocalDate.class) && !pgType.equals("date")) {
+ continue;
+ }
+ if (klass.equals(LocalDateTime.class) && !pgType.startsWith("timestamp")) {
+ continue;
+ }
+ if (klass.equals(OffsetDateTime.class) && !pgType.startsWith("timestamp")) {
+ continue;
+ }
+ if (klass.equals(LocalDateTime.class) && pgType.equals("timestamp with time zone")) {
+ // org.postgresql.util.PSQLException: Cannot convert the column of type TIMESTAMPTZ to requested type timestamp.
+ continue;
+ }
+ Field field = null;
+ try {
+ field = klass.getField(expression.startsWith("-") ? "MIN" : "MAX");
+ } catch (NoSuchFieldException e) {
+ throw new IllegalStateException("No min/max field in " + klass, e);
+ }
+ Object expected = field.get(null);
+ ids.add(new Object[]{binaryMode, expression, pgType, klass, expected});
+ }
+ }
+ }
+ }
+ return ids;
+ }
+
+ @Test
+ public void test() throws SQLException {
+ PreparedStatement stmt = con.prepareStatement("select '" + expression + "'::" + pgType);
+ ResultSet rs = stmt.executeQuery();
+ rs.next();
+ Object res = rs.getObject(1, klass);
+ Assert.assertEquals(expectedValue, res);
+ }
+}
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc42/GetObject310Test.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc42/GetObject310Test.java
index 8bf21a2..b942a41 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc42/GetObject310Test.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc42/GetObject310Test.java
@@ -5,8 +5,19 @@
package org.postgresql.test.jdbc42;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assume.assumeTrue;
+
import org.postgresql.test.TestUtil;
-import org.postgresql.test.jdbc2.BaseTest;
+import org.postgresql.test.jdbc2.BaseTest4;
+import org.postgresql.util.PSQLException;
+import org.postgresql.util.PSQLState;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
import java.sql.ResultSet;
import java.sql.SQLException;
@@ -19,10 +30,12 @@ import java.time.ZoneId;
import java.time.ZoneOffset;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Collection;
import java.util.List;
import java.util.TimeZone;
-public class GetObject310Test extends BaseTest {
+ at RunWith(Parameterized.class)
+public class GetObject310Test extends BaseTest4 {
private static final TimeZone saveTZ = TimeZone.getDefault();
@@ -31,11 +44,22 @@ public class GetObject310Test extends BaseTest {
private static final ZoneOffset GMT05 = ZoneOffset.of("-05:00"); // -0500 always
private static final ZoneOffset GMT13 = ZoneOffset.of("+13:00"); // +1300 always
- public GetObject310Test(String name) {
- super(name);
+
+ public GetObject310Test(BinaryMode binaryMode) {
+ setBinaryMode(binaryMode);
}
- protected void setUp() throws Exception {
+ @Parameterized.Parameters(name = "binary = {0}")
+ public static Iterable<Object[]> data() {
+ Collection<Object[]> ids = new ArrayList<Object[]>();
+ for (BinaryMode binaryMode : BinaryMode.values()) {
+ ids.add(new Object[]{binaryMode});
+ }
+ return ids;
+ }
+
+ @Override
+ public void setUp() throws Exception {
super.setUp();
TestUtil.createTable(con, "table1", "timestamp_without_time_zone_column timestamp without time zone,"
+ "timestamp_with_time_zone_column timestamp with time zone,"
@@ -45,7 +69,8 @@ public class GetObject310Test extends BaseTest {
);
}
- protected void tearDown() throws SQLException {
+ @Override
+ public void tearDown() throws SQLException {
TimeZone.setDefault(saveTZ);
TestUtil.dropTable(con, "table1");
super.tearDown();
@@ -54,6 +79,7 @@ public class GetObject310Test extends BaseTest {
/**
* Test the behavior getObject for date columns.
*/
+ @Test
public void testGetLocalDate() throws SQLException {
Statement stmt = con.createStatement();
stmt.executeUpdate(TestUtil.insertSQL("table1","date_column","DATE '1999-01-08'"));
@@ -72,14 +98,15 @@ public class GetObject310Test extends BaseTest {
/**
* Test the behavior getObject for time columns.
*/
+ @Test
public void testGetLocalTime() throws SQLException {
Statement stmt = con.createStatement();
- stmt.executeUpdate(TestUtil.insertSQL("table1","time_without_time_zone_column","TIME '04:05:06'"));
+ stmt.executeUpdate(TestUtil.insertSQL("table1","time_without_time_zone_column","TIME '04:05:06.123456'"));
ResultSet rs = stmt.executeQuery(TestUtil.selectSQL("table1", "time_without_time_zone_column"));
try {
assertTrue(rs.next());
- LocalTime localTime = LocalTime.of(4, 5, 6);
+ LocalTime localTime = LocalTime.of(4, 5, 6, 123456000);
assertEquals(localTime, rs.getObject("time_without_time_zone_column", LocalTime.class));
assertEquals(localTime, rs.getObject(1, LocalTime.class));
} finally {
@@ -88,9 +115,58 @@ public class GetObject310Test extends BaseTest {
}
/**
+ * Test the behavior getObject for time columns with null.
+ */
+ @Test
+ public void testGetLocalTimeNull() throws SQLException {
+ Statement stmt = con.createStatement();
+ stmt.executeUpdate(TestUtil.insertSQL("table1","time_without_time_zone_column","NULL"));
+
+ ResultSet rs = stmt.executeQuery(TestUtil.selectSQL("table1", "time_without_time_zone_column"));
+ try {
+ assertTrue(rs.next());
+ assertNull(rs.getObject("time_without_time_zone_column", LocalTime.class));
+ assertNull(rs.getObject(1, LocalTime.class));
+ } finally {
+ rs.close();
+ }
+ }
+
+ /**
+ * Test the behavior getObject for time columns with null.
+ */
+ @Test
+ public void testGetLocalTimeInvalidType() throws SQLException {
+ Statement stmt = con.createStatement();
+ stmt.executeUpdate(TestUtil.insertSQL("table1","time_with_time_zone_column", "TIME '04:05:06.123456-08:00'"));
+
+ ResultSet rs = stmt.executeQuery(TestUtil.selectSQL("table1", "time_with_time_zone_column"));
+ try {
+ assertTrue(rs.next());
+ try {
+ assertNull(rs.getObject("time_with_time_zone_column", LocalTime.class));
+ } catch (PSQLException e) {
+ assertTrue(e.getSQLState().equals(PSQLState.DATA_TYPE_MISMATCH.getState())
+ || e.getSQLState().equals(PSQLState.BAD_DATETIME_FORMAT.getState()));
+ }
+ try {
+ assertNull(rs.getObject(1, LocalTime.class));
+ } catch (PSQLException e) {
+ assertTrue(e.getSQLState().equals(PSQLState.DATA_TYPE_MISMATCH.getState())
+ || e.getSQLState().equals(PSQLState.BAD_DATETIME_FORMAT.getState()));
+ }
+ } finally {
+ rs.close();
+ }
+ }
+
+ /**
* Test the behavior getObject for timestamp columns.
*/
+ @Test
public void testGetLocalDateTime() throws SQLException {
+ assumeTrue(TestUtil.haveIntegerDateTimes(con));
+
List<String> zoneIdsToTest = new ArrayList<String>();
zoneIdsToTest.add("Africa/Casablanca"); // It is something like GMT+0..GMT+1
zoneIdsToTest.add("America/Adak"); // It is something like GMT-10..GMT-9
@@ -106,17 +182,17 @@ public class GetObject310Test extends BaseTest {
"1997-06-30T23:59:59", "1997-07-01T00:00:00", "2012-06-30T23:59:59", "2012-07-01T00:00:00",
"2015-06-30T23:59:59", "2015-07-01T00:00:00", "2005-12-31T23:59:59", "2006-01-01T00:00:00",
"2008-12-31T23:59:59", "2009-01-01T00:00:00", /* "2015-06-30T23:59:60", */ "2015-07-31T00:00:00",
- "2015-07-31T00:00:01",
+ "2015-07-31T00:00:01", "2015-07-31T00:00:00.000001",
// On 2000-03-26 02:00:00 Moscow went to DST, thus local time became 03:00:00
"2000-03-26T01:59:59", "2000-03-26T02:00:00", "2000-03-26T02:00:01", "2000-03-26T02:59:59",
"2000-03-26T03:00:00", "2000-03-26T03:00:01", "2000-03-26T03:59:59", "2000-03-26T04:00:00",
- "2000-03-26T04:00:01",
+ "2000-03-26T04:00:01", "2000-03-26T04:00:00.000001",
// On 2000-10-29 03:00:00 Moscow went to regular time, thus local time became 02:00:00
"2000-10-29T01:59:59", "2000-10-29T02:00:00", "2000-10-29T02:00:01", "2000-10-29T02:59:59",
"2000-10-29T03:00:00", "2000-10-29T03:00:01", "2000-10-29T03:59:59", "2000-10-29T04:00:00",
- "2000-10-29T04:00:01");
+ "2000-10-29T04:00:01", "2000-10-29T04:00:00.000001");
for (String zoneId : zoneIdsToTest) {
ZoneId zone = ZoneId.of(zoneId);
@@ -138,6 +214,10 @@ public class GetObject310Test extends BaseTest {
LocalDateTime localDateTime = LocalDateTime.parse(timestamp);
assertEquals(localDateTime, rs.getObject("timestamp_without_time_zone_column", LocalDateTime.class));
assertEquals(localDateTime, rs.getObject(1, LocalDateTime.class));
+
+ //Also test that we get the correct values when retrieving the data as LocalDate objects
+ assertEquals(localDateTime.toLocalDate(), rs.getObject("timestamp_without_time_zone_column", LocalDate.class));
+ assertEquals(localDateTime.toLocalDate(), rs.getObject(1, LocalDate.class));
} finally {
rs.close();
}
@@ -150,6 +230,7 @@ public class GetObject310Test extends BaseTest {
/**
* Test the behavior getObject for timestamp with time zone columns.
*/
+ @Test
public void testGetTimestampWithTimeZone() throws SQLException {
runGetOffsetDateTime(UTC);
runGetOffsetDateTime(GMT03);
@@ -160,12 +241,12 @@ public class GetObject310Test extends BaseTest {
private void runGetOffsetDateTime(ZoneOffset offset) throws SQLException {
Statement stmt = con.createStatement();
try {
- stmt.executeUpdate(TestUtil.insertSQL("table1","timestamp_with_time_zone_column","TIMESTAMP WITH TIME ZONE '2004-10-19 10:23:54" + offset.toString() + "'"));
+ stmt.executeUpdate(TestUtil.insertSQL("table1","timestamp_with_time_zone_column","TIMESTAMP WITH TIME ZONE '2004-10-19 10:23:54.123456" + offset.toString() + "'"));
ResultSet rs = stmt.executeQuery(TestUtil.selectSQL("table1", "timestamp_with_time_zone_column"));
try {
assertTrue(rs.next());
- LocalDateTime localDateTime = LocalDateTime.of(2004, 10, 19, 10, 23, 54);
+ LocalDateTime localDateTime = LocalDateTime.of(2004, 10, 19, 10, 23, 54, 123456000);
OffsetDateTime offsetDateTime = localDateTime.atOffset(offset).withOffsetSameInstant(ZoneOffset.UTC);
assertEquals(offsetDateTime, rs.getObject("timestamp_with_time_zone_column", OffsetDateTime.class));
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc42/Jdbc42CallableStatementTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc42/Jdbc42CallableStatementTest.java
new file mode 100644
index 0000000..db277a5
--- /dev/null
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc42/Jdbc42CallableStatementTest.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright (c) 2017, PostgreSQL Global Development Group
+ * See the LICENSE file in the project root for more information.
+ */
+
+package org.postgresql.test.jdbc42;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
+import org.postgresql.test.jdbc2.BaseTest4;
+
+import org.junit.Test;
+
+import java.sql.CallableStatement;
+import java.sql.ResultSet;
+import java.sql.ResultSetMetaData;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.sql.Types;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+
+/**
+ * Tests for JDBC 4.2 features in {@link org.postgresql.jdbc.PgCallableStatement}.
+ */
+public class Jdbc42CallableStatementTest extends BaseTest4 {
+
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+
+ try (Statement stmt = con.createStatement();) {
+ stmt.execute(
+ "CREATE OR REPLACE FUNCTION testspg__getResultSetWithoutArg() "
+ + "RETURNS refcursor AS ' "
+ + "declare ref refcursor;"
+ + "begin OPEN ref FOR SELECT 1; RETURN ref; end; ' LANGUAGE plpgsql;");
+ }
+ }
+
+
+ final String func = "{ ? = call ";
+ final String pkgName = "testspg__";
+
+ @Override
+ public void tearDown() throws SQLException {
+ try (Statement stmt = con.createStatement()) {
+ stmt.execute("drop FUNCTION testspg__getResultSetWithoutArg ();");
+ }
+ super.tearDown();
+ }
+
+ @Test
+ public void testGetResultSetWithoutArg() throws SQLException {
+ assumeCallableStatementsSupported();
+ try (CallableStatement call = con.prepareCall(func + pkgName + "getResultSetWithoutArg () }")) {
+ con.setAutoCommit(false); // ref cursors only work if auto commit is off
+ call.registerOutParameter(1, Types.REF_CURSOR);
+ call.execute();
+ List<Integer> values = new ArrayList<>(1);
+ try (ResultSet rs = call.getObject(1, ResultSet.class)) {
+ while (rs.next()) {
+ values.add(rs.getInt(1));
+ }
+ }
+ assertEquals(Collections.singletonList(1), values);
+ } finally {
+ con.setAutoCommit(true);
+ }
+ }
+
+ @Test
+ public void testGetResultSetWithoutArgUnsupportedConversion() throws SQLException {
+ assumeCallableStatementsSupported();
+ try (CallableStatement call = con.prepareCall(func + pkgName + "getResultSetWithoutArg () }")) {
+ con.setAutoCommit(false); // ref cursors only work if auto commit is off
+ call.registerOutParameter(1, Types.REF_CURSOR);
+ call.execute();
+ try {
+ // this should never be allowed even if more types will be implemented in the future
+ call.getObject(1, ResultSetMetaData.class);
+ fail("conversion from ResultSet to ResultSetMetaData should not be supported");
+ } catch (SQLException e) {
+ // should reach
+ }
+ } finally {
+ con.setAutoCommit(true);
+ }
+ }
+
+}
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc42/Jdbc42TestSuite.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc42/Jdbc42TestSuite.java
index 4610bf4..d4e32c5 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc42/Jdbc42TestSuite.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc42/Jdbc42TestSuite.java
@@ -15,7 +15,8 @@ import org.junit.runners.Suite.SuiteClasses;
CustomizeDefaultFetchSizeTest.class,
GetObject310Test.class,
PreparedStatementTest.class,
- GetObject310BinaryTest.class,
+ Jdbc42CallableStatementTest.class,
+ GetObject310InfinityTests.class,
SetObject310Test.class})
public class Jdbc42TestSuite {
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc42/PreparedStatementTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc42/PreparedStatementTest.java
index f14650c..73a7d7c 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc42/PreparedStatementTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc42/PreparedStatementTest.java
@@ -6,31 +6,37 @@
package org.postgresql.test.jdbc42;
import org.postgresql.test.TestUtil;
-import org.postgresql.test.jdbc2.BaseTest;
+import org.postgresql.test.jdbc2.BaseTest4;
+
+import org.junit.Assert;
+import org.junit.Test;
import java.sql.PreparedStatement;
+import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
+import java.time.LocalTime;
-public class PreparedStatementTest extends BaseTest {
-
- public PreparedStatementTest(String name) {
- super(name);
- }
+public class PreparedStatementTest extends BaseTest4 {
- protected void setUp() throws Exception {
+ @Override
+ public void setUp() throws Exception {
super.setUp();
TestUtil.createTable(con, "timestamptztable", "tstz timestamptz");
TestUtil.createTable(con, "timetztable", "ttz timetz");
+ TestUtil.createTable(con, "timetable", "id serial, tt time");
}
- protected void tearDown() throws SQLException {
+ @Override
+ public void tearDown() throws SQLException {
TestUtil.dropTable(con, "timestamptztable");
TestUtil.dropTable(con, "timetztable");
+ TestUtil.dropTable(con, "timetable");
super.tearDown();
}
+ @Test
public void testTimestampTzSetNull() throws SQLException {
PreparedStatement pstmt = con.prepareStatement("INSERT INTO timestamptztable (tstz) VALUES (?)");
@@ -45,6 +51,7 @@ public class PreparedStatementTest extends BaseTest {
pstmt.close();
}
+ @Test
public void testTimeTzSetNull() throws SQLException {
PreparedStatement pstmt = con.prepareStatement("INSERT INTO timetztable (ttz) VALUES (?)");
@@ -58,4 +65,30 @@ public class PreparedStatementTest extends BaseTest {
pstmt.close();
}
+
+ @Test
+ public void testLocalTimeMax() throws SQLException {
+ PreparedStatement pstmt = con.prepareStatement("INSERT INTO timetable (tt) VALUES (?)");
+
+ pstmt.setObject(1, LocalTime.MAX);
+ pstmt.executeUpdate();
+
+ pstmt.setObject(1, LocalTime.MIN);
+ pstmt.executeUpdate();
+
+ ResultSet rs = con.createStatement().executeQuery("select tt from timetable order by id asc");
+ Assert.assertTrue(rs.next());
+
+ LocalTime localTime = (LocalTime)rs.getObject(1,LocalTime.class);
+
+
+ Assert.assertEquals( LocalTime.MAX, localTime);
+
+ Assert.assertTrue(rs.next());
+
+ localTime = (LocalTime)rs.getObject(1, LocalTime.class);
+
+ Assert.assertEquals( LocalTime.MIN, localTime);
+
+ }
}
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc42/SetObject310Test.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc42/SetObject310Test.java
index a5843df..654d913 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc42/SetObject310Test.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc42/SetObject310Test.java
@@ -5,9 +5,16 @@
package org.postgresql.test.jdbc42;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assume.assumeTrue;
+
import org.postgresql.test.TestUtil;
-import junit.framework.TestCase;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
import java.sql.Connection;
import java.sql.PreparedStatement;
@@ -23,23 +30,20 @@ import java.time.OffsetDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.chrono.IsoEra;
+import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoField;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.TimeZone;
-public class SetObject310Test extends TestCase {
-
- private Connection con;
-
+public class SetObject310Test {
private static final TimeZone saveTZ = TimeZone.getDefault();
- public SetObject310Test(String name) {
- super(name);
- }
+ private Connection con;
- protected void setUp() throws Exception {
+ @Before
+ public void setUp() throws Exception {
con = TestUtil.openDB();
TestUtil.createTable(con, "table1", "timestamp_without_time_zone_column timestamp without time zone,"
+ "timestamp_with_time_zone_column timestamp with time zone,"
@@ -49,7 +53,8 @@ public class SetObject310Test extends TestCase {
);
}
- protected void tearDown() throws SQLException {
+ @After
+ public void tearDown() throws SQLException {
TimeZone.setDefault(saveTZ);
TestUtil.dropTable(con, "table1");
TestUtil.closeDB(con);
@@ -95,14 +100,10 @@ public class SetObject310Test extends TestCase {
return readString(columnName);
}
- private void insertWithoutType(OffsetDateTime data, String columnName) throws SQLException {
+ private void insertWithoutType(Object data, String columnName) throws SQLException {
insert(data, columnName, null);
}
- private void insertWithType(OffsetDateTime data, String columnName) throws SQLException {
- insert(data, columnName, Types.TIMESTAMP_WITH_TIMEZONE);
- }
-
private <T> T insertThenReadWithoutType(Object data, String columnName, Class<T> expectedType) throws SQLException {
PreparedStatement ps = con.prepareStatement(TestUtil.insertSQL("table1", columnName, "?"));
try {
@@ -165,6 +166,7 @@ public class SetObject310Test extends TestCase {
/**
* Test the behavior of setObject for timestamp columns.
*/
+ @Test
public void testSetLocalDateTime() throws SQLException {
List<String> zoneIdsToTest = getZoneIdsToTest();
List<String> datesToTest = getDatesToTest();
@@ -173,7 +175,9 @@ public class SetObject310Test extends TestCase {
ZoneId zone = ZoneId.of(zoneId);
for (String date : datesToTest) {
LocalDateTime localDateTime = LocalDateTime.parse(date);
- String expected = date.replace('T', ' ');
+ String expected = localDateTime.atZone(zone)
+ .format(DateTimeFormatter.ISO_LOCAL_DATE_TIME)
+ .replace('T', ' ');
localTimestamps(zone, localDateTime, expected);
}
}
@@ -182,6 +186,7 @@ public class SetObject310Test extends TestCase {
/**
* Test the behavior of setObject for timestamp columns.
*/
+ @Test
public void testSetOffsetDateTime() throws SQLException {
List<String> zoneIdsToTest = getZoneIdsToTest();
List<TimeZone> storeZones = new ArrayList<TimeZone>();
@@ -205,17 +210,17 @@ public class SetObject310Test extends TestCase {
"1997-06-30T23:59:59", "1997-07-01T00:00:00", "2012-06-30T23:59:59", "2012-07-01T00:00:00",
"2015-06-30T23:59:59", "2015-07-01T00:00:00", "2005-12-31T23:59:59", "2006-01-01T00:00:00",
"2008-12-31T23:59:59", "2009-01-01T00:00:00", /* "2015-06-30T23:59:60", */ "2015-07-31T00:00:00",
- "2015-07-31T00:00:01",
+ "2015-07-31T00:00:01", "2015-07-31T00:00:00.000001",
// On 2000-03-26 02:00:00 Moscow went to DST, thus local time became 03:00:00
"2000-03-26T01:59:59", "2000-03-26T02:00:00", "2000-03-26T02:00:01", "2000-03-26T02:59:59",
"2000-03-26T03:00:00", "2000-03-26T03:00:01", "2000-03-26T03:59:59", "2000-03-26T04:00:00",
- "2000-03-26T04:00:01",
+ "2000-03-26T04:00:01", "2000-03-26T04:00:00.000001",
// On 2000-10-29 03:00:00 Moscow went to regular time, thus local time became 02:00:00
"2000-10-29T01:59:59", "2000-10-29T02:00:00", "2000-10-29T02:00:01", "2000-10-29T02:59:59",
"2000-10-29T03:00:00", "2000-10-29T03:00:01", "2000-10-29T03:59:59", "2000-10-29T04:00:00",
- "2000-10-29T04:00:01");
+ "2000-10-29T04:00:01", "2000-10-29T04:00:00.000001");
}
private List<String> getZoneIdsToTest() {
@@ -235,51 +240,59 @@ public class SetObject310Test extends TestCase {
private void localTimestamps(ZoneId zoneId, LocalDateTime localDateTime, String expected) throws SQLException {
TimeZone.setDefault(TimeZone.getTimeZone(zoneId));
String readBack = insertThenReadStringWithoutType(localDateTime, "timestamp_without_time_zone_column");
- assertEquals(expected, readBack);
+ assertEquals(
+ "LocalDateTime=" + localDateTime + ", with TimeZone.default=" + zoneId + ", setObject(int, Object)",
+ expected, readBack);
deleteRows();
readBack = insertThenReadStringWithType(localDateTime, "timestamp_without_time_zone_column");
- assertEquals(expected, readBack);
+ assertEquals(
+ "LocalDateTime=" + localDateTime + ", with TimeZone.default=" + zoneId + ", setObject(int, Object, TIMESTAMP)",
+ expected, readBack);
deleteRows();
}
private void offsetTimestamps(ZoneId dataZone, LocalDateTime localDateTime, String expected, List<TimeZone> storeZones) throws SQLException {
OffsetDateTime data = localDateTime.atZone(dataZone).toOffsetDateTime();
- for (TimeZone storeZone : storeZones) {
- TimeZone.setDefault(storeZone);
- insertWithoutType(data, "timestamp_with_time_zone_column");
-
- String readBack = readString("timestamp_with_time_zone_column");
- OffsetDateTime o = OffsetDateTime.parse(readBack.replace(' ', 'T') + ":00");
- assertEquals(data.toInstant(), o.toInstant());
-
- deleteRows();
- }
-
- for (TimeZone storeZone : storeZones) {
- TimeZone.setDefault(storeZone);
- insertWithType(data, "timestamp_with_time_zone_column");
-
- String readBack = readString("timestamp_with_time_zone_column");
- OffsetDateTime o = OffsetDateTime.parse(readBack.replace(' ', 'T') + ":00");
-
- assertEquals(data.toInstant(), o.toInstant());
-
- deleteRows();
+ try (PreparedStatement ps = con.prepareStatement(
+ "select ?::timestamp with time zone, ?::timestamp with time zone")) {
+ for (TimeZone storeZone : storeZones) {
+ TimeZone.setDefault(storeZone);
+ ps.setObject(1, data);
+ ps.setObject(2, data, Types.TIMESTAMP_WITH_TIMEZONE);
+ try (ResultSet rs = ps.executeQuery()) {
+ rs.next();
+ String noType = rs.getString(1);
+ OffsetDateTime noTypeRes = OffsetDateTime.parse(noType.replace(' ', 'T') + ":00");
+ assertEquals(
+ "OffsetDateTime=" + data + " (with ZoneId=" + dataZone + "), with TimeZone.default="
+ + storeZone + ", setObject(int, Object)", data.toInstant(),
+ noTypeRes.toInstant());
+ String withType = rs.getString(1);
+ OffsetDateTime withTypeRes = OffsetDateTime.parse(withType.replace(' ', 'T') + ":00");
+ assertEquals(
+ "OffsetDateTime=" + data + " (with ZoneId=" + dataZone + "), with TimeZone.default="
+ + storeZone + ", setObject(int, Object, TIMESTAMP_WITH_TIMEZONE)",
+ data.toInstant(), withTypeRes.toInstant());
+ }
+ }
}
}
/**
* Test the behavior of setObject for timestamp columns.
*/
+ @Test
public void testSetLocalDateTimeBc() throws SQLException {
+ assumeTrue(TestUtil.haveIntegerDateTimes(con));
+
// use BC for funsies
List<LocalDateTime> bcDates = new ArrayList<LocalDateTime>();
- bcDates.add(LocalDateTime.parse("1997-06-30T23:59:59").with(ChronoField.ERA, IsoEra.BCE.getValue()));
- bcDates.add(LocalDateTime.parse("0997-06-30T23:59:59").with(ChronoField.ERA, IsoEra.BCE.getValue()));
+ bcDates.add(LocalDateTime.parse("1997-06-30T23:59:59.999999").with(ChronoField.ERA, IsoEra.BCE.getValue()));
+ bcDates.add(LocalDateTime.parse("0997-06-30T23:59:59.999999").with(ChronoField.ERA, IsoEra.BCE.getValue()));
for (LocalDateTime bcDate : bcDates) {
- // -1997-06-30T23:59:59 -> 1997-06-30 23:59:59 BC
+ // -1997-06-30T23:59:59.999999 -> 1997-06-30 23:59:59.999999 BC
String expected = bcDate.toString().substring(1).replace('T', ' ') + " BC";
localTimestamps(ZoneOffset.UTC, bcDate, expected);
}
@@ -288,6 +301,7 @@ public class SetObject310Test extends TestCase {
/**
* Test the behavior setObject for date columns.
*/
+ @Test
public void testSetLocalDateWithType() throws SQLException {
LocalDate data = LocalDate.parse("1971-12-15");
java.sql.Date actual = insertThenReadWithType(data, Types.DATE, "date_column", java.sql.Date.class);
@@ -298,6 +312,7 @@ public class SetObject310Test extends TestCase {
/**
* Test the behavior setObject for date columns.
*/
+ @Test
public void testSetLocalDateWithoutType() throws SQLException {
LocalDate data = LocalDate.parse("1971-12-15");
java.sql.Date actual = insertThenReadWithoutType(data, "date_column", java.sql.Date.class);
@@ -308,6 +323,20 @@ public class SetObject310Test extends TestCase {
/**
* Test the behavior setObject for time columns.
*/
+ @Test
+ public void testSetLocalTimeAndReadBack() throws SQLException {
+ LocalTime data = LocalTime.parse("16:21:51.123456");
+
+ insertWithoutType(data, "time_without_time_zone_column");
+
+ String readBack = readString("time_without_time_zone_column");
+ assertEquals("16:21:51.123456", readBack);
+ }
+
+ /**
+ * Test the behavior setObject for time columns.
+ */
+ @Test
public void testSetLocalTimeWithType() throws SQLException {
LocalTime data = LocalTime.parse("16:21:51");
Time actual = insertThenReadWithType(data, Types.TIME, "time_without_time_zone_column", Time.class);
@@ -318,6 +347,7 @@ public class SetObject310Test extends TestCase {
/**
* Test the behavior setObject for time columns.
*/
+ @Test
public void testSetLocalTimeWithoutType() throws SQLException {
LocalTime data = LocalTime.parse("16:21:51");
Time actual = insertThenReadWithoutType(data, "time_without_time_zone_column", Time.class);
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc42/SimpleJdbc42Test.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc42/SimpleJdbc42Test.java
index d06e188..9e56d92 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/jdbc42/SimpleJdbc42Test.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc42/SimpleJdbc42Test.java
@@ -7,36 +7,20 @@ package org.postgresql.test.jdbc42;
import static org.junit.Assert.assertTrue;
-import org.postgresql.test.TestUtil;
+import org.postgresql.test.jdbc2.BaseTest4;
-import org.junit.After;
-import org.junit.Before;
import org.junit.Test;
-import java.sql.Connection;
-
/**
* Most basic test to check that the right package is compiled
*/
-public class SimpleJdbc42Test {
-
- private Connection _conn;
-
- @Before
- public void setUp() throws Exception {
- _conn = TestUtil.openDB();
- }
-
- @After
- public void tearDown() throws Exception {
- TestUtil.closeDB(_conn);
- }
+public class SimpleJdbc42Test extends BaseTest4 {
/**
* Test presence of JDBC 4.2 specific methods
*/
@Test
public void testSupportsRefCursors() throws Exception {
- assertTrue(_conn.getMetaData().supportsRefCursors());
+ assertTrue(con.getMetaData().supportsRefCursors());
}
}
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jre8/core/Jre8TestSuite.java b/pgjdbc/src/test/java/org/postgresql/test/jre8/core/Jre8TestSuite.java
new file mode 100644
index 0000000..96cee65
--- /dev/null
+++ b/pgjdbc/src/test/java/org/postgresql/test/jre8/core/Jre8TestSuite.java
@@ -0,0 +1,18 @@
+/*
+ * Copyright (c) 2017, PostgreSQL Global Development Group
+ * See the LICENSE file in the project root for more information.
+ */
+
+package org.postgresql.test.jre8.core;
+
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+
+/**
+ * @author Joe Kutner on 10/24/17.
+ * Twitter: @codefinger
+ */
+ at RunWith(Suite.class)
+ at Suite.SuiteClasses({SocksProxyTest.class})
+public class Jre8TestSuite {
+}
diff --git a/pgjdbc/src/test/java/org/postgresql/test/jre8/core/SocksProxyTest.java b/pgjdbc/src/test/java/org/postgresql/test/jre8/core/SocksProxyTest.java
new file mode 100644
index 0000000..8d01f78
--- /dev/null
+++ b/pgjdbc/src/test/java/org/postgresql/test/jre8/core/SocksProxyTest.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 2017, PostgreSQL Global Development Group
+ * See the LICENSE file in the project root for more information.
+ */
+
+package org.postgresql.test.jre8.core;
+
+import static org.junit.Assert.assertNotNull;
+
+import org.postgresql.test.TestUtil;
+
+import org.junit.After;
+import org.junit.Test;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+
+/**
+ * @author Joe Kutner on 10/9/17.
+ * Twitter: @codefinger
+ */
+public class SocksProxyTest {
+
+ @After
+ public void cleanup() {
+ System.clearProperty("socksProxyHost");
+ System.clearProperty("socksProxyPort");
+ System.clearProperty("socksNonProxyHosts");
+ }
+
+ /**
+ * Tests the connect method by connecting to the test database
+ */
+ @Test
+ public void testConnectWithSocksNonProxyHost() throws Exception {
+ System.setProperty("socksProxyHost", "fake-socks-proxy");
+ System.setProperty("socksProxyPort", "9999");
+ System.setProperty("socksNonProxyHosts", TestUtil.getServer());
+
+ TestUtil.initDriver(); // Set up log levels, etc.
+
+ Connection con =
+ DriverManager.getConnection(TestUtil.getURL(), TestUtil.getUser(), TestUtil.getPassword());
+
+ assertNotNull(con);
+ con.close();
+ }
+}
diff --git a/pgjdbc/src/test/java/org/postgresql/test/ssl/SingleCertValidatingFactoryTestSuite.java b/pgjdbc/src/test/java/org/postgresql/test/ssl/SingleCertValidatingFactoryTestSuite.java
index 42a080b..b5488bf 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/ssl/SingleCertValidatingFactoryTestSuite.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/ssl/SingleCertValidatingFactoryTestSuite.java
@@ -58,17 +58,17 @@ public class SingleCertValidatingFactoryTestSuite {
}
return Arrays.asList(new Object[][]{
- {"jdbc:postgresql://localhost:10084/test"},
- {"jdbc:postgresql://localhost:10090/test"},
- {"jdbc:postgresql://localhost:10091/test"},
- {"jdbc:postgresql://localhost:10092/test"},
- {"jdbc:postgresql://localhost:10093/test"},
+ {"jdbc:postgresql://localhost:5432/test"},
+ // {"jdbc:postgresql://localhost:10090/test"},
+ // {"jdbc:postgresql://localhost:10091/test"},
+ // {"jdbc:postgresql://localhost:10092/test"},
+ // {"jdbc:postgresql://localhost:10093/test"},
});
}
// The valid and invalid server SSL certfiicates:
- private static final String goodServerCertPath = "certdir/goodroot.crt";
- private static final String badServerCertPath = "certdir/badroot.crt";
+ private static final String goodServerCertPath = "../certdir/goodroot.crt";
+ private static final String badServerCertPath = "../certdir/badroot.crt";
private String getGoodServerCert() {
return loadFile(goodServerCertPath);
@@ -106,11 +106,6 @@ public class SingleCertValidatingFactoryTestSuite {
String url = getServerJdbcUrl();
info.setProperty("user", getUsername());
info.setProperty("password", getPassword());
- try {
- Class.forName("org.postgresql.Driver");
- } catch (ClassNotFoundException e) {
- throw new RuntimeException(e);
- }
return DriverManager.getConnection(url, info);
}
diff --git a/pgjdbc/src/test/java/org/postgresql/test/ssl/SslTest.java b/pgjdbc/src/test/java/org/postgresql/test/ssl/SslTest.java
index 89eb732..fa209a3 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/ssl/SslTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/ssl/SslTest.java
@@ -59,28 +59,27 @@ public class SslTest extends TestCase {
protected String certdir;
protected String connstr;
protected String sslmode;
- protected int protocol;
protected boolean goodclient;
protected boolean goodserver;
protected String prefix;
protected Object[] expected;
- private String makeConnStr(String sslmode, boolean goodclient, boolean goodserver, int protocol) {
- return connstr + "&protocolVersion=" + protocol
+ private String makeConnStr(String sslmode, boolean goodclient, boolean goodserver) {
+ return connstr
+ "&sslmode=" + sslmode
+ "&sslcert=" + certdir + "/" + prefix + (goodclient ? "goodclient.crt" : "badclient.crt")
+ "&sslkey=" + certdir + "/" + prefix + (goodclient ? "goodclient.pk8" : "badclient.pk8")
+ "&sslrootcert=" + certdir + "/" + prefix + (goodserver ? "goodroot.crt" : "badroot.crt")
+ // + "&sslfactory=org.postgresql.ssl.NonValidatingFactory"
+ "&loglevel=" + TestUtil.getLogLevel();
}
- public SslTest(String name, String certdir, String connstr, String sslmode, int protocol,
+ public SslTest(String name, String certdir, String connstr, String sslmode,
boolean goodclient, boolean goodserver, String prefix, Object[] expected) {
super(name);
this.certdir = certdir;
this.connstr = connstr;
this.sslmode = sslmode;
- this.protocol = protocol;
this.goodclient = goodclient;
this.goodserver = goodserver;
this.prefix = prefix;
@@ -100,24 +99,18 @@ public class SslTest extends TestCase {
expected = defaultexpected;
}
for (String sslMode : sslModes) {
- suite.addTest(new SslTest(param + "-" + sslMode + "GG2", certdir, sconnstr, sslMode,
- 2, true, true, sprefix, expected.get(sslMode + "GG")));
suite.addTest(new SslTest(param + "-" + sslMode + "GG3", certdir, sconnstr, sslMode,
- 3, true, true, sprefix, expected.get(sslMode + "GG")));
- suite.addTest(new SslTest(param + "-" + sslMode + "GB2", certdir, sconnstr, sslMode,
- 2, true, false, sprefix, expected.get(sslMode + "GB")));
+ true, true, sprefix, expected.get(sslMode + "GG")));
suite.addTest(new SslTest(param + "-" + sslMode + "GB3", certdir, sconnstr, sslMode,
- 3, true, false, sprefix, expected.get(sslMode + "GB")));
- suite.addTest(new SslTest(param + "-" + sslMode + "BG2", certdir, sconnstr, sslMode,
- 2, false, true, sprefix, expected.get(sslMode + "BG")));
+ true, false, sprefix, expected.get(sslMode + "GB")));
suite.addTest(new SslTest(param + "-" + sslMode + "BG3", certdir, sconnstr, sslMode,
- 3, false, true, sprefix, expected.get(sslMode + "BG")));
+ false, true, sprefix, expected.get(sslMode + "BG")));
}
return suite;
}
protected void runTest() throws Throwable {
- driver(makeConnStr(sslmode, goodclient, goodserver, protocol), expected);
+ driver(makeConnStr(sslmode, goodclient, goodserver), expected);
}
static Map<String, Map<String, Object[]>> expectedmap;
@@ -132,10 +125,11 @@ public class SslTest extends TestCase {
"(Connection rejected: )?FATAL: ?no pg_hba.conf entry for host .*, user .*, database .*, SSL off(?s-d:.*)";
static String FAILED = "The connection attempt failed.";
static String BROKEN =
- "SSL error: (Broken pipe|Received fatal alert: unknown_ca|Connection reset)";
- static String SSLMODE = "Invalid sslmode value: (allow|prefer)";
+ "SSL error: (Broken pipe( \\(Write failed\\))?|Received fatal alert: unknown_ca|Connection reset|Protocol wrong type for socket)";
+ static String SSLMODEALLOW = "Invalid sslmode value: allow";
+ static String SSLMODEPREFER = "Invalid sslmode value: prefer";
// static String UNKNOWN = "SSL error: Broken pipe";
- // static String UNKNOWN = "SSL error: Received fatal alert: unknown_ca";
+ //static String UNKNOWN = "SSL error: Received fatal alert: unknown_ca";
static String ANY = ".*";
static String VALIDATOR =
"SSL error: sun.security.validator.ValidatorException: PKIX path (building|validation) failed:.*";
@@ -146,12 +140,12 @@ public class SslTest extends TestCase {
defaultexpected.put("disableGG", new Object[]{null, Boolean.FALSE});
defaultexpected.put("disableGB", new Object[]{null, Boolean.FALSE});
defaultexpected.put("disableBG", new Object[]{null, Boolean.FALSE});
- defaultexpected.put("allowGG", new Object[]{SSLMODE, Boolean.TRUE});
- defaultexpected.put("allowGB", new Object[]{SSLMODE, Boolean.TRUE});
- defaultexpected.put("allowBG", new Object[]{SSLMODE, Boolean.TRUE});
- defaultexpected.put("preferGG", new Object[]{SSLMODE, Boolean.TRUE});
- defaultexpected.put("preferGB", new Object[]{SSLMODE, Boolean.TRUE});
- defaultexpected.put("preferBG", new Object[]{SSLMODE, Boolean.TRUE});
+ defaultexpected.put("allowGG", new Object[]{SSLMODEALLOW, Boolean.TRUE});
+ defaultexpected.put("allowGB", new Object[]{SSLMODEALLOW, Boolean.TRUE});
+ defaultexpected.put("allowBG", new Object[]{SSLMODEALLOW, Boolean.TRUE});
+ defaultexpected.put("preferGG", new Object[]{SSLMODEPREFER, Boolean.TRUE});
+ defaultexpected.put("preferGB", new Object[]{SSLMODEPREFER, Boolean.TRUE});
+ defaultexpected.put("preferBG", new Object[]{SSLMODEPREFER, Boolean.TRUE});
defaultexpected.put("requireGG", new Object[]{null, Boolean.TRUE});
defaultexpected.put("requireGB", new Object[]{null, Boolean.TRUE});
defaultexpected.put("requireBG", new Object[]{null, Boolean.TRUE});
@@ -169,12 +163,12 @@ public class SslTest extends TestCase {
work.put("disableGG", new Object[]{null, Boolean.FALSE});
work.put("disableGB", new Object[]{null, Boolean.FALSE});
work.put("disableBG", new Object[]{null, Boolean.FALSE});
- work.put("allowGG", new Object[]{SSLMODE, Boolean.FALSE});
- work.put("allowGB", new Object[]{SSLMODE, Boolean.FALSE});
- work.put("allowBG", new Object[]{SSLMODE, Boolean.FALSE});
- work.put("preferGG", new Object[]{SSLMODE, Boolean.FALSE});
- work.put("preferGB", new Object[]{SSLMODE, Boolean.FALSE});
- work.put("preferBG", new Object[]{SSLMODE, Boolean.FALSE});
+ work.put("allowGG", new Object[]{SSLMODEALLOW, Boolean.FALSE});
+ work.put("allowGB", new Object[]{SSLMODEALLOW, Boolean.FALSE});
+ work.put("allowBG", new Object[]{SSLMODEALLOW, Boolean.FALSE});
+ work.put("preferGG", new Object[]{SSLMODEPREFER, Boolean.FALSE});
+ work.put("preferGB", new Object[]{SSLMODEPREFER, Boolean.FALSE});
+ work.put("preferBG", new Object[]{SSLMODEPREFER, Boolean.FALSE});
work.put("requireGG", new Object[]{ANY, Boolean.TRUE});
work.put("requireGB", new Object[]{ANY, Boolean.TRUE});
work.put("requireBG", new Object[]{ANY, Boolean.TRUE});
@@ -184,20 +178,18 @@ public class SslTest extends TestCase {
work.put("verify-fullGG", new Object[]{ANY, Boolean.TRUE});
work.put("verify-fullGB", new Object[]{ANY, Boolean.TRUE});
work.put("verify-fullBG", new Object[]{ANY, Boolean.TRUE});
- expectedmap.put("ssloff8", work);
- work = (TreeMap) work.clone();
expectedmap.put("ssloff9", work);
work = (TreeMap) defaultexpected.clone();
work.put("disableGG", new Object[]{null, Boolean.FALSE});
work.put("disableGB", new Object[]{null, Boolean.FALSE});
work.put("disableBG", new Object[]{null, Boolean.FALSE});
- work.put("allowGG", new Object[]{SSLMODE, Boolean.FALSE});
- work.put("allowGB", new Object[]{SSLMODE, Boolean.FALSE});
- work.put("allowBG", new Object[]{SSLMODE, Boolean.FALSE});
- work.put("preferGG", new Object[]{SSLMODE, Boolean.FALSE});
- work.put("preferGB", new Object[]{SSLMODE, Boolean.FALSE});
- work.put("preferBG", new Object[]{SSLMODE, Boolean.FALSE});
+ work.put("allowGG", new Object[]{SSLMODEALLOW, Boolean.FALSE});
+ work.put("allowGB", new Object[]{SSLMODEALLOW, Boolean.FALSE});
+ work.put("allowBG", new Object[]{SSLMODEALLOW, Boolean.FALSE});
+ work.put("preferGG", new Object[]{SSLMODEPREFER, Boolean.FALSE});
+ work.put("preferGB", new Object[]{SSLMODEPREFER, Boolean.FALSE});
+ work.put("preferBG", new Object[]{SSLMODEPREFER, Boolean.FALSE});
work.put("requireGG", new Object[]{PG_HBA_ON, Boolean.TRUE});
work.put("requireGB", new Object[]{PG_HBA_ON, Boolean.TRUE});
work.put("requireBG", new Object[]{BROKEN, Boolean.TRUE});
@@ -207,20 +199,18 @@ public class SslTest extends TestCase {
work.put("verify-fullGG", new Object[]{PG_HBA_ON, Boolean.TRUE});
work.put("verify-fullGB", new Object[]{VALIDATOR, Boolean.TRUE});
work.put("verify-fullBG", new Object[]{BROKEN, Boolean.TRUE});
- expectedmap.put("sslhostnossl8", work);
- work = (TreeMap) work.clone();
expectedmap.put("sslhostnossl9", work);
work = (TreeMap) defaultexpected.clone();
work.put("disableGG", new Object[]{null, Boolean.FALSE});
work.put("disableGB", new Object[]{null, Boolean.FALSE});
work.put("disableBG", new Object[]{null, Boolean.FALSE});
- work.put("allowGG", new Object[]{SSLMODE, Boolean.FALSE});
- work.put("allowGB", new Object[]{SSLMODE, Boolean.FALSE});
- work.put("allowBG", new Object[]{SSLMODE, Boolean.FALSE});
- work.put("preferGG", new Object[]{SSLMODE, Boolean.TRUE});
- work.put("preferGB", new Object[]{SSLMODE, Boolean.TRUE});
- work.put("preferBG", new Object[]{SSLMODE, Boolean.FALSE});
+ work.put("allowGG", new Object[]{SSLMODEALLOW, Boolean.FALSE});
+ work.put("allowGB", new Object[]{SSLMODEALLOW, Boolean.FALSE});
+ work.put("allowBG", new Object[]{SSLMODEALLOW, Boolean.FALSE});
+ work.put("preferGG", new Object[]{SSLMODEPREFER, Boolean.TRUE});
+ work.put("preferGB", new Object[]{SSLMODEPREFER, Boolean.TRUE});
+ work.put("preferBG", new Object[]{SSLMODEPREFER, Boolean.FALSE});
work.put("requireGG", new Object[]{null, Boolean.TRUE});
work.put("requireGB", new Object[]{null, Boolean.TRUE});
work.put("requireBG", new Object[]{BROKEN, Boolean.TRUE});
@@ -230,32 +220,28 @@ public class SslTest extends TestCase {
work.put("verify-fullGG", new Object[]{null, Boolean.TRUE});
work.put("verify-fullGB", new Object[]{VALIDATOR, Boolean.TRUE});
work.put("verify-fullBG", new Object[]{BROKEN, Boolean.TRUE});
- expectedmap.put("sslhostgh8", work);
- work = (TreeMap) work.clone();
expectedmap.put("sslhostgh9", work);
work = (TreeMap) work.clone();
work.put("disableGG", new Object[]{PG_HBA_OFF, Boolean.FALSE});
work.put("disableGB", new Object[]{PG_HBA_OFF, Boolean.FALSE});
work.put("disableBG", new Object[]{PG_HBA_OFF, Boolean.FALSE});
- work.put("allowGG", new Object[]{SSLMODE, Boolean.TRUE});
- work.put("allowGB", new Object[]{SSLMODE, Boolean.TRUE});
- work.put("allowBG", new Object[]{SSLMODE, Boolean.TRUE});
- work.put("preferBG", new Object[]{SSLMODE, Boolean.FALSE});
- expectedmap.put("sslhostsslgh8", work);
- work = (TreeMap) work.clone();
+ work.put("allowGG", new Object[]{SSLMODEALLOW, Boolean.TRUE});
+ work.put("allowGB", new Object[]{SSLMODEALLOW, Boolean.TRUE});
+ work.put("allowBG", new Object[]{SSLMODEALLOW, Boolean.TRUE});
+ work.put("preferBG", new Object[]{SSLMODEPREFER, Boolean.FALSE});
expectedmap.put("sslhostsslgh9", work);
work = (TreeMap) defaultexpected.clone();
work.put("disableGG", new Object[]{null, Boolean.FALSE});
work.put("disableGB", new Object[]{null, Boolean.FALSE});
work.put("disableBG", new Object[]{null, Boolean.FALSE});
- work.put("allowGG", new Object[]{SSLMODE, Boolean.FALSE});
- work.put("allowGB", new Object[]{SSLMODE, Boolean.FALSE});
- work.put("allowBG", new Object[]{SSLMODE, Boolean.FALSE});
- work.put("preferGG", new Object[]{SSLMODE, Boolean.TRUE});
- work.put("preferGB", new Object[]{SSLMODE, Boolean.TRUE});
- work.put("preferBG", new Object[]{SSLMODE, Boolean.FALSE});
+ work.put("allowGG", new Object[]{SSLMODEALLOW, Boolean.FALSE});
+ work.put("allowGB", new Object[]{SSLMODEALLOW, Boolean.FALSE});
+ work.put("allowBG", new Object[]{SSLMODEALLOW, Boolean.FALSE});
+ work.put("preferGG", new Object[]{SSLMODEPREFER, Boolean.TRUE});
+ work.put("preferGB", new Object[]{SSLMODEPREFER, Boolean.TRUE});
+ work.put("preferBG", new Object[]{SSLMODEPREFER, Boolean.FALSE});
work.put("requireGG", new Object[]{null, Boolean.TRUE});
work.put("requireGB", new Object[]{null, Boolean.TRUE});
work.put("requireBG", new Object[]{BROKEN, Boolean.TRUE});
@@ -265,32 +251,28 @@ public class SslTest extends TestCase {
work.put("verify-fullGG", new Object[]{HOSTNAME, Boolean.TRUE});
work.put("verify-fullGB", new Object[]{VALIDATOR, Boolean.TRUE});
work.put("verify-fullBG", new Object[]{BROKEN, Boolean.TRUE});
- expectedmap.put("sslhostbh8", work);
- work = (TreeMap) work.clone();
expectedmap.put("sslhostbh9", work);
work = (TreeMap) work.clone();
work.put("disableGG", new Object[]{PG_HBA_OFF, Boolean.FALSE});
work.put("disableGB", new Object[]{PG_HBA_OFF, Boolean.FALSE});
work.put("disableBG", new Object[]{PG_HBA_OFF, Boolean.FALSE});
- work.put("allowGG", new Object[]{SSLMODE, Boolean.TRUE});
- work.put("allowGB", new Object[]{SSLMODE, Boolean.TRUE});
- work.put("allowBG", new Object[]{SSLMODE, Boolean.TRUE});
- work.put("preferBG", new Object[]{SSLMODE, Boolean.FALSE});
- expectedmap.put("sslhostsslbh8", work);
- work = (TreeMap) work.clone();
+ work.put("allowGG", new Object[]{SSLMODEALLOW, Boolean.TRUE});
+ work.put("allowGB", new Object[]{SSLMODEALLOW, Boolean.TRUE});
+ work.put("allowBG", new Object[]{SSLMODEALLOW, Boolean.TRUE});
+ work.put("preferBG", new Object[]{SSLMODEPREFER, Boolean.FALSE});
expectedmap.put("sslhostsslbh9", work);
work = (TreeMap) defaultexpected.clone();
work.put("disableGG", new Object[]{PG_HBA_OFF, Boolean.FALSE});
work.put("disableGB", new Object[]{PG_HBA_OFF, Boolean.FALSE});
work.put("disableBG", new Object[]{PG_HBA_OFF, Boolean.FALSE});
- work.put("allowGG", new Object[]{SSLMODE, Boolean.TRUE});
- work.put("allowGB", new Object[]{SSLMODE, Boolean.TRUE});
- work.put("allowBG", new Object[]{SSLMODE, Boolean.TRUE});
- work.put("preferGG", new Object[]{SSLMODE, Boolean.TRUE});
- work.put("preferGB", new Object[]{SSLMODE, Boolean.TRUE});
- work.put("preferBG", new Object[]{SSLMODE, Boolean.TRUE});
+ work.put("allowGG", new Object[]{SSLMODEALLOW, Boolean.TRUE});
+ work.put("allowGB", new Object[]{SSLMODEALLOW, Boolean.TRUE});
+ work.put("allowBG", new Object[]{SSLMODEALLOW, Boolean.TRUE});
+ work.put("preferGG", new Object[]{SSLMODEPREFER, Boolean.TRUE});
+ work.put("preferGB", new Object[]{SSLMODEPREFER, Boolean.TRUE});
+ work.put("preferBG", new Object[]{SSLMODEPREFER, Boolean.TRUE});
work.put("requireGG", new Object[]{null, Boolean.TRUE});
work.put("requireGB", new Object[]{null, Boolean.TRUE});
work.put("requireBG", new Object[]{BROKEN, Boolean.TRUE});
@@ -300,20 +282,18 @@ public class SslTest extends TestCase {
work.put("verify-fullGG", new Object[]{null, Boolean.TRUE});
work.put("verify-fullGB", new Object[]{VALIDATOR, Boolean.TRUE});
work.put("verify-fullBG", new Object[]{BROKEN, Boolean.TRUE});
- expectedmap.put("sslhostsslcertgh8", work);
- work = (TreeMap) work.clone();
expectedmap.put("sslhostsslcertgh9", work);
work = (TreeMap) defaultexpected.clone();
work.put("disableGG", new Object[]{PG_HBA_OFF, Boolean.FALSE});
work.put("disableGB", new Object[]{PG_HBA_OFF, Boolean.FALSE});
work.put("disableBG", new Object[]{PG_HBA_OFF, Boolean.FALSE});
- work.put("allowGG", new Object[]{SSLMODE, Boolean.TRUE});
- work.put("allowGB", new Object[]{SSLMODE, Boolean.TRUE});
- work.put("allowBG", new Object[]{SSLMODE, Boolean.TRUE});
- work.put("preferGG", new Object[]{SSLMODE, Boolean.TRUE});
- work.put("preferGB", new Object[]{SSLMODE, Boolean.TRUE});
- work.put("preferBG", new Object[]{SSLMODE, Boolean.TRUE});
+ work.put("allowGG", new Object[]{SSLMODEALLOW, Boolean.TRUE});
+ work.put("allowGB", new Object[]{SSLMODEALLOW, Boolean.TRUE});
+ work.put("allowBG", new Object[]{SSLMODEALLOW, Boolean.TRUE});
+ work.put("preferGG", new Object[]{SSLMODEPREFER, Boolean.TRUE});
+ work.put("preferGB", new Object[]{SSLMODEPREFER, Boolean.TRUE});
+ work.put("preferBG", new Object[]{SSLMODEPREFER, Boolean.TRUE});
work.put("requireGG", new Object[]{null, Boolean.TRUE});
work.put("requireGB", new Object[]{null, Boolean.TRUE});
work.put("requireBG", new Object[]{BROKEN, Boolean.TRUE});
@@ -323,20 +303,18 @@ public class SslTest extends TestCase {
work.put("verify-fullGG", new Object[]{HOSTNAME, Boolean.TRUE});
work.put("verify-fullGB", new Object[]{VALIDATOR, Boolean.TRUE});
work.put("verify-fullBG", new Object[]{BROKEN, Boolean.TRUE});
- expectedmap.put("sslhostsslcertbh8", work);
- work = (TreeMap) work.clone();
expectedmap.put("sslhostsslcertbh9", work);
work = (TreeMap) defaultexpected.clone();
work.put("disableGG", new Object[]{PG_HBA_OFF, Boolean.FALSE});
work.put("disableGB", new Object[]{PG_HBA_OFF, Boolean.FALSE});
work.put("disableBG", new Object[]{PG_HBA_OFF, Boolean.FALSE});
- work.put("allowGG", new Object[]{SSLMODE, Boolean.TRUE});
- work.put("allowGB", new Object[]{SSLMODE, Boolean.TRUE});
- work.put("allowBG", new Object[]{SSLMODE, Boolean.TRUE});
- work.put("preferGG", new Object[]{SSLMODE, Boolean.TRUE});
- work.put("preferGB", new Object[]{SSLMODE, Boolean.TRUE});
- work.put("preferBG", new Object[]{SSLMODE, Boolean.TRUE});
+ work.put("allowGG", new Object[]{SSLMODEALLOW, Boolean.TRUE});
+ work.put("allowGB", new Object[]{SSLMODEALLOW, Boolean.TRUE});
+ work.put("allowBG", new Object[]{SSLMODEALLOW, Boolean.TRUE});
+ work.put("preferGG", new Object[]{SSLMODEPREFER, Boolean.TRUE});
+ work.put("preferGB", new Object[]{SSLMODEPREFER, Boolean.TRUE});
+ work.put("preferBG", new Object[]{SSLMODEPREFER, Boolean.TRUE});
work.put("requireGG", new Object[]{null, Boolean.TRUE});
work.put("requireGB", new Object[]{null, Boolean.TRUE});
work.put("requireBG", new Object[]{BROKEN, Boolean.TRUE});
@@ -346,14 +324,10 @@ public class SslTest extends TestCase {
work.put("verify-fullGG", new Object[]{null, Boolean.TRUE});
work.put("verify-fullGB", new Object[]{VALIDATOR, Boolean.TRUE});
work.put("verify-fullBG", new Object[]{BROKEN, Boolean.TRUE});
- expectedmap.put("sslcertgh8", work);
- work = (TreeMap) work.clone();
expectedmap.put("sslcertgh9", work);
work = (TreeMap) work.clone();
work.put("verify-fullGG", new Object[]{HOSTNAME, Boolean.TRUE});
- expectedmap.put("sslcertbh8", work);
- work = (TreeMap) work.clone();
expectedmap.put("sslcertbh9", work);
}
diff --git a/pgjdbc/src/test/java/org/postgresql/test/ssl/SslTestSuite.java b/pgjdbc/src/test/java/org/postgresql/test/ssl/SslTestSuite.java
index ac7a126..19c3a7c 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/ssl/SslTestSuite.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/ssl/SslTestSuite.java
@@ -28,8 +28,6 @@ public class SslTestSuite extends TestSuite {
public static TestSuite suite() throws Exception {
TestSuite suite = new TestSuite();
prop = TestUtil.loadPropertyFiles("ssltest.properties");
- add(suite, "ssloff8");
- add(suite, "sslhostnossl8");
add(suite, "ssloff9");
add(suite, "sslhostnossl9");
@@ -38,7 +36,6 @@ public class SslTestSuite extends TestSuite {
for (String hostMode : hostModes) {
for (String certMode : certModes) {
- add(suite, hostMode + certMode + "8");
add(suite, hostMode + certMode + "9");
}
}
diff --git a/pgjdbc/src/test/java/org/postgresql/test/sspi/SSPITestSuite.java b/pgjdbc/src/test/java/org/postgresql/test/sspi/SSPITestSuite.java
index e281d60..6e1ae33 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/sspi/SSPITestSuite.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/sspi/SSPITestSuite.java
@@ -5,14 +5,11 @@
package org.postgresql.test.sspi;
-import org.junit.runner.RunWith;
-import org.junit.runners.Suite;
-
/*
* Executes all known tests for SSPI.
*/
- at RunWith(Suite.class)
- at Suite.SuiteClasses({ SSPITest.class })
+//@RunWith(Suite.class)
+//@Suite.SuiteClasses({ SSPITest.class })
public class SSPITestSuite {
// Empty.
}
diff --git a/pgjdbc/src/test/java/org/postgresql/test/util/BufferGenerator.java b/pgjdbc/src/test/java/org/postgresql/test/util/BufferGenerator.java
index 55ab658..2ad2c47 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/util/BufferGenerator.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/util/BufferGenerator.java
@@ -16,7 +16,7 @@ import java.util.Random;
* Created by amozhenin on 30.09.2015.
*/
public class BufferGenerator {
- public final static int ROW_COUNT = 100000;
+ public static final int ROW_COUNT = 100000;
public static void main(String[] args) throws Exception {
Random random = new Random();
diff --git a/pgjdbc/src/test/java/org/postgresql/test/util/ExpressionPropertiesTest.java b/pgjdbc/src/test/java/org/postgresql/test/util/ExpressionPropertiesTest.java
new file mode 100644
index 0000000..1a68acc
--- /dev/null
+++ b/pgjdbc/src/test/java/org/postgresql/test/util/ExpressionPropertiesTest.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) 2017, PostgreSQL Global Development Group
+ * See the LICENSE file in the project root for more information.
+ */
+
+package org.postgresql.test.util;
+
+import org.postgresql.util.ExpressionProperties;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.util.Properties;
+
+public class ExpressionPropertiesTest {
+ @Test
+ public void simpleReplace() {
+ ExpressionProperties p = new ExpressionProperties();
+ p.put("server", "app1");
+ p.put("file", "pgjdbc_${server}.txt");
+ Assert.assertEquals("${server} should be replaced", "pgjdbc_app1.txt", p.getProperty("file"));
+ }
+
+ @Test
+ public void replacementMissing() {
+ ExpressionProperties p = new ExpressionProperties();
+ p.put("file", "pgjdbc_${server}.txt");
+ Assert.assertEquals("${server} should be kept as is as there is no replacement",
+ "pgjdbc_${server}.txt", p.getProperty("file"));
+ }
+
+ @Test
+ public void multipleReplacements() {
+ ExpressionProperties p = new ExpressionProperties();
+ p.put("server", "app1");
+ p.put("file", "${server}${server}${server}${server}${server}");
+ Assert.assertEquals("All the ${server} entries should be replaced",
+ "app1app1app1app1app1", p.getProperty("file"));
+ }
+
+ @Test
+ public void multipleParentProperties() {
+ Properties p1 = new Properties();
+ p1.setProperty("server", "app1_${app.type}");
+ Properties p2 = new Properties();
+ p2.setProperty("app.type", "production");
+
+ ExpressionProperties p = new ExpressionProperties(p1, p2);
+ p.put("file", "pgjdbc_${server}.txt");
+
+ Assert.assertEquals("All the ${...} entries should be replaced",
+ "pgjdbc_app1_production.txt", p.getProperty("file"));
+ }
+
+ @Test
+ public void rawValue() {
+ ExpressionProperties p = new ExpressionProperties();
+ p.put("server", "app1");
+ p.put("file", "${server}${server}${server}${server}${server}");
+ Assert.assertEquals("No replacements in raw value expected",
+ "${server}${server}${server}${server}${server}", p.getRawPropertyValue("file"));
+ }
+}
diff --git a/pgjdbc/src/test/java/org/postgresql/test/util/HostSpecTest.java b/pgjdbc/src/test/java/org/postgresql/test/util/HostSpecTest.java
new file mode 100644
index 0000000..3f4e33c
--- /dev/null
+++ b/pgjdbc/src/test/java/org/postgresql/test/util/HostSpecTest.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 2017, PostgreSQL Global Development Group
+ * See the LICENSE file in the project root for more information.
+ */
+
+package org.postgresql.test.util;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import org.postgresql.util.HostSpec;
+
+import org.junit.After;
+import org.junit.Test;
+
+/**
+ * @author Joe Kutner on 10/19/17.
+ * Twitter: @codefinger
+ */
+public class HostSpecTest {
+
+ @After
+ public void cleanup() {
+ System.clearProperty("socksProxyHost");
+ System.clearProperty("socksProxyPort");
+ System.clearProperty("socksNonProxyHosts");
+ }
+
+ @Test
+ public void testShouldResolve() throws Exception {
+ HostSpec hostSpec = new HostSpec("localhost", 5432);
+ assertTrue(hostSpec.shouldResolve());
+ }
+
+ @Test
+ public void testShouldResolveWithEmptySocksProxyHost() throws Exception {
+ System.setProperty("socksProxyHost", "");
+ HostSpec hostSpec = new HostSpec("localhost", 5432);
+ assertFalse(hostSpec.shouldResolve());
+ }
+
+ @Test
+ public void testShouldResolveWithWhiteSpaceSocksProxyHost() throws Exception {
+ System.setProperty("socksProxyHost", " ");
+ HostSpec hostSpec = new HostSpec("localhost", 5432);
+ assertFalse(hostSpec.shouldResolve());
+ }
+
+ @Test
+ public void testShouldResolveWithSocksProxyHost() throws Exception {
+ System.setProperty("socksProxyHost", "fake-socks-proxy");
+ HostSpec hostSpec = new HostSpec("example.com", 5432);
+ assertFalse(hostSpec.shouldResolve());
+ }
+
+ @Test
+ public void testShouldResolveWithSocksProxyHostWithLocalhost() throws Exception {
+ System.setProperty("socksProxyHost", "fake-socks-proxy");
+ HostSpec hostSpec = new HostSpec("localhost", 5432);
+ assertTrue(hostSpec.shouldResolve());
+ }
+
+ @Test
+ public void testShouldResolveWithSocksNonProxyHost() throws Exception {
+ System.setProperty("socksProxyHost", "fake-socks-proxy");
+ System.setProperty("socksNonProxyHosts", "example.com");
+ HostSpec hostSpec = new HostSpec("example.com", 5432);
+ assertTrue(hostSpec.shouldResolve());
+ }
+
+ @Test
+ public void testShouldResolveWithSocksNonProxyHosts() throws Exception {
+ System.setProperty("socksProxyHost", "fake-socks-proxy");
+ System.setProperty("socksNonProxyHosts", "example.com|localhost");
+ HostSpec hostSpec = new HostSpec("example.com", 5432);
+ assertTrue(hostSpec.shouldResolve());
+ }
+
+ @Test
+ public void testShouldResolveWithSocksNonProxyHostsNotMatching() throws Exception {
+ System.setProperty("socksProxyHost", "fake-socks-proxy");
+ System.setProperty("socksNonProxyHosts", "example.com|localhost");
+ HostSpec hostSpec = new HostSpec("example.org", 5432);
+ assertFalse(hostSpec.shouldResolve());
+ }
+}
diff --git a/pgjdbc/src/test/java/org/postgresql/test/util/LruCacheTest.java b/pgjdbc/src/test/java/org/postgresql/test/util/LruCacheTest.java
index 0ee07f4..63d076a 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/util/LruCacheTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/util/LruCacheTest.java
@@ -5,10 +5,14 @@
package org.postgresql.test.util;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
import org.postgresql.util.CanEstimateSize;
import org.postgresql.util.LruCache;
-import junit.framework.TestCase;
+import org.junit.Before;
+import org.junit.Test;
import java.sql.SQLException;
import java.util.ArrayDeque;
@@ -18,7 +22,8 @@ import java.util.Deque;
/**
* Tests {@link org.postgresql.util.LruCache}
*/
-public class LruCacheTest extends TestCase {
+public class LruCacheTest {
+
private static class Entry implements CanEstimateSize {
private final int id;
@@ -43,8 +48,8 @@ public class LruCacheTest extends TestCase {
private final Entry dummy = new Entry(-999);
private LruCache<Integer, Entry> cache;
- @Override
- protected void setUp() throws Exception {
+ @Before
+ public void setUp() throws Exception {
cache = new LruCache<Integer, Entry>(4, 1000, false, new LruCache.CreateAction<Integer, Entry>() {
@Override
public Entry create(Integer key) throws SQLException {
@@ -63,6 +68,7 @@ public class LruCacheTest extends TestCase {
});
}
+ @Test
public void testEvictsByNumberOfEntries() throws SQLException {
Entry a;
Entry b;
@@ -77,6 +83,7 @@ public class LruCacheTest extends TestCase {
e = use(5, a);
}
+ @Test
public void testEvictsBySize() throws SQLException {
Entry a;
Entry b;
@@ -88,6 +95,7 @@ public class LruCacheTest extends TestCase {
use(400, a, b);
}
+ @Test
public void testEvictsLeastRecentlyUsed() throws SQLException {
Entry a;
Entry b;
@@ -102,6 +110,7 @@ public class LruCacheTest extends TestCase {
d = use(4, b); // expect b to be evicted
}
+ @Test
public void testCyclicReplacement() throws SQLException {
Entry a;
Entry b;
@@ -124,6 +133,7 @@ public class LruCacheTest extends TestCase {
}
}
+ @Test
public void testDuplicateKey() throws SQLException {
Entry a;
@@ -135,6 +145,7 @@ public class LruCacheTest extends TestCase {
assertEvict();
}
+ @Test
public void testCaching() throws SQLException {
Entry a;
Entry b;
diff --git a/pgjdbc/src/test/java/org/postgresql/test/util/ServerVersionParseTest.java b/pgjdbc/src/test/java/org/postgresql/test/util/ServerVersionParseTest.java
index cfa5cf0..88bbc95 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/util/ServerVersionParseTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/util/ServerVersionParseTest.java
@@ -31,6 +31,11 @@ public class ServerVersionParseTest {
@Parameterized.Parameters(name = "str = {0}, expected = {1}")
public static Iterable<Object[]> data() {
return Arrays.asList(new Object[][]{
+ /* 4 part version tests */
+ {"7.4.0.0", 70400, null},
+ {"9.0.0.0", 90000, null},
+ {"9.0.1.0", 90001, null},
+ {"9.2.1.0", 90201, null},
{"7.4.0", 70400, null},
{"9.0.0", 90000, null},
{"9.0.1", 90001, null},
diff --git a/pgjdbc/src/test/java/org/postgresql/test/util/ServerVersionTest.java b/pgjdbc/src/test/java/org/postgresql/test/util/ServerVersionTest.java
index 6743503..3e32089 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/util/ServerVersionTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/util/ServerVersionTest.java
@@ -19,6 +19,7 @@ public class ServerVersionTest {
Assert.assertTrue(prev + " should be less than " + serverVersion,
prev.getVersionNum() < serverVersion.getVersionNum());
}
+ prev = serverVersion;
}
}
}
diff --git a/pgjdbc/src/test/java/org/postgresql/test/util/rules/ServerVersionRule.java b/pgjdbc/src/test/java/org/postgresql/test/util/rules/ServerVersionRule.java
new file mode 100644
index 0000000..684d206
--- /dev/null
+++ b/pgjdbc/src/test/java/org/postgresql/test/util/rules/ServerVersionRule.java
@@ -0,0 +1,103 @@
+/*
+ * Copyright (c) 2016, PostgreSQL Global Development Group
+ * See the LICENSE file in the project root for more information.
+ */
+
+package org.postgresql.test.util.rules;
+
+import org.postgresql.core.ServerVersion;
+import org.postgresql.core.Version;
+import org.postgresql.jdbc.PgConnection;
+import org.postgresql.test.TestUtil;
+import org.postgresql.test.util.rules.annotation.HaveMinimalServerVersion;
+
+import org.junit.AssumptionViolatedException;
+import org.junit.rules.TestRule;
+import org.junit.runner.Description;
+import org.junit.runners.model.Statement;
+
+/**
+ * <p>Rule for ignore test if current version postgresql to old to use. And it necessary because
+ * without it test will fail. For use it method test class or test method should be annotate with
+ * {@link HaveMinimalServerVersion} annotation.
+ * Example use:
+ * <pre>
+ * @HaveMinimalServerVersion("8.4")
+ * public class CopyAPITest {
+ * @Rule
+ * private ServerVersionRule versionRule = new ServerVersionRule();
+ *
+ * @Test
+ * public void testCopyFromFile() throws Exception {
+ * // test copy api introduce in 8.4 version
+ * }
+ * }
+ * </pre>
+ * <pre>
+ * public class LogicalReplicationTest {
+ * @Rule
+ * private ServerVersionRule versionRule = new ServerVersionRule();
+ *
+ * @Test
+ * @HaveMinimalServerVersion("9.4")
+ * public void testStartLogicalReplication() throws Exception {
+ * // test logical replication introduced in 9.4
+ * }
+ * }
+ * </pre>
+ */
+public class ServerVersionRule implements TestRule {
+ /**
+ * Server version in form x.y.z.
+ */
+ private final String currentDisplayVersion;
+ private final Version currentVersion;
+
+ public ServerVersionRule() {
+ PgConnection connection = null;
+ try {
+ connection = (PgConnection) TestUtil.openDB();
+ currentDisplayVersion = connection.getDBVersionNumber();
+ currentVersion = ServerVersion.from(currentDisplayVersion);
+
+ } catch (Exception e) {
+ throw new IllegalStateException("Not available open connection", e);
+ } finally {
+ TestUtil.closeQuietly(connection);
+ }
+ }
+
+ public Statement apply(final Statement base, final Description description) {
+ return new Statement() {
+ @Override
+ public void evaluate() throws Throwable {
+ HaveMinimalServerVersion requiredVersion =
+ description.getAnnotation(HaveMinimalServerVersion.class);
+
+ if (requiredVersion == null) {
+ Class<?> testClass = description.getTestClass();
+ if (testClass != null && testClass.isAnnotationPresent(HaveMinimalServerVersion.class)) {
+ requiredVersion = testClass.getAnnotation(HaveMinimalServerVersion.class);
+ }
+ }
+
+ if (requiredVersion != null) {
+ Version version = ServerVersion.from(requiredVersion.value());
+ if (version.getVersionNum() <= 0) {
+ throw new IllegalArgumentException(
+ "Server version " + requiredVersion.value() + " not valid for "
+ + description.getDisplayName());
+ }
+
+ if (version.getVersionNum() > currentVersion.getVersionNum()) {
+ throw new AssumptionViolatedException(
+ "Required for test version " + requiredVersion.value()
+ + " but current server version " + currentDisplayVersion
+ );
+ }
+ }
+ base.evaluate();
+ }
+ };
+ }
+}
diff --git a/pgjdbc/src/test/java/org/postgresql/test/util/rules/annotation/HaveMinimalServerVersion.java b/pgjdbc/src/test/java/org/postgresql/test/util/rules/annotation/HaveMinimalServerVersion.java
new file mode 100644
index 0000000..9d5eae8
--- /dev/null
+++ b/pgjdbc/src/test/java/org/postgresql/test/util/rules/annotation/HaveMinimalServerVersion.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2016, PostgreSQL Global Development Group
+ * See the LICENSE file in the project root for more information.
+ */
+
+package org.postgresql.test.util.rules.annotation;
+
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.TYPE;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Annotation use to ignore test if the current server version less than specified version.
+ */
+ at Retention(RetentionPolicy.RUNTIME)
+ at Target(value = {METHOD, TYPE})
+public @interface HaveMinimalServerVersion {
+ /**
+ * @return not null sever version in form x.y.z like 9.4, 9.5.3, etc.
+ * @see org.postgresql.core.ServerVersion
+ */
+ String value();
+}
diff --git a/pgjdbc/src/test/java/org/postgresql/test/xa/XADataSourceTest.java b/pgjdbc/src/test/java/org/postgresql/test/xa/XADataSourceTest.java
index 8fde3bd..590dbbd 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/xa/XADataSourceTest.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/xa/XADataSourceTest.java
@@ -5,26 +5,37 @@
package org.postgresql.test.xa;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+import static org.junit.Assume.assumeTrue;
+
import org.postgresql.test.TestUtil;
import org.postgresql.test.jdbc2.optional.BaseDataSourceTest;
import org.postgresql.xa.PGXADataSource;
-import junit.framework.TestCase;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
+
import java.util.Arrays;
import java.util.Random;
import javax.sql.XAConnection;
import javax.sql.XADataSource;
+
import javax.transaction.xa.XAException;
import javax.transaction.xa.XAResource;
import javax.transaction.xa.Xid;
-public class XADataSourceTest extends TestCase {
+
+public class XADataSourceTest {
private XADataSource _ds;
@@ -36,15 +47,15 @@ public class XADataSourceTest extends TestCase {
private Connection conn;
- public XADataSourceTest(String name) {
- super(name);
-
+ public XADataSourceTest() {
_ds = new PGXADataSource();
BaseDataSourceTest.setupDataSource((PGXADataSource) _ds);
}
- protected void setUp() throws Exception {
+ @Before
+ public void setUp() throws Exception {
_conn = TestUtil.openDB();
+ assumeTrue(isPreparedTransactionEnabled(_conn));
// Check if we're operating as a superuser; some tests require it.
Statement st = _conn.createStatement();
@@ -63,10 +74,24 @@ public class XADataSourceTest extends TestCase {
conn = xaconn.getConnection();
}
- protected void tearDown() throws SQLException {
- xaconn.close();
- clearAllPrepared();
+ private static boolean isPreparedTransactionEnabled(Connection connection) throws SQLException {
+ Statement stmt = connection.createStatement();
+ ResultSet rs = stmt.executeQuery("SHOW max_prepared_transactions");
+ rs.next();
+ int mpt = rs.getInt(1);
+ rs.close();
+ stmt.close();
+ return mpt > 0;
+ }
+ @After
+ public void tearDown() throws SQLException {
+ try {
+ xaconn.close();
+ } catch (Exception ignored) {
+ }
+
+ clearAllPrepared();
TestUtil.dropTable(_conn, "testxa1");
TestUtil.closeDB(_conn);
@@ -110,19 +135,23 @@ public class XADataSourceTest extends TestCase {
bqual[2] = 6;
}
+ @Override
public int getFormatId() {
return 0;
}
+ @Override
public byte[] getGlobalTransactionId() {
return gtrid;
}
+ @Override
public byte[] getBranchQualifier() {
return bqual;
}
+ @Override
public boolean equals(Object o) {
if (!(o instanceof Xid)) {
return false;
@@ -157,10 +186,12 @@ public class XADataSourceTest extends TestCase {
* Check that the equals method works for the connection wrapper returned by
* PGXAConnection.getConnection().
*/
+ @Test
public void testWrapperEquals() throws Exception {
assertTrue("Wrappers should be equal", conn.equals(conn));
}
+ @Test
public void testOnePhase() throws Exception {
Xid xid = new CustomXid(1);
xaRes.start(xid, XAResource.TMNOFLAGS);
@@ -169,6 +200,7 @@ public class XADataSourceTest extends TestCase {
xaRes.commit(xid, true);
}
+ @Test
public void testTwoPhaseCommit() throws Exception {
Xid xid = new CustomXid(1);
xaRes.start(xid, XAResource.TMNOFLAGS);
@@ -178,6 +210,7 @@ public class XADataSourceTest extends TestCase {
xaRes.commit(xid, false);
}
+ @Test
public void testCloseBeforeCommit() throws Exception {
Xid xid = new CustomXid(5);
xaRes.start(xid, XAResource.TMNOFLAGS);
@@ -191,6 +224,7 @@ public class XADataSourceTest extends TestCase {
assertEquals(1, rs.getInt(1));
}
+ @Test
public void testRecover() throws Exception {
Xid xid = new CustomXid(12345);
xaRes.start(xid, XAResource.TMNOFLAGS);
@@ -203,8 +237,8 @@ public class XADataSourceTest extends TestCase {
boolean recoveredXid = false;
- for (int i = 0; i < recoveredXidArray.length; i++) {
- if (xid.equals(recoveredXidArray[i])) {
+ for (Xid aRecoveredXidArray : recoveredXidArray) {
+ if (xid.equals(aRecoveredXidArray)) {
recoveredXid = true;
break;
}
@@ -221,8 +255,8 @@ public class XADataSourceTest extends TestCase {
boolean recoveredXid = false;
- for (int c = 0; c < recoveredXidArray.length; c++) {
- if (xaRes.equals(recoveredXidArray[c])) {
+ for (Xid aRecoveredXidArray : recoveredXidArray) {
+ if (xaRes.equals(aRecoveredXidArray)) {
recoveredXid = true;
break;
}
@@ -232,6 +266,7 @@ public class XADataSourceTest extends TestCase {
}
}
+ @Test
public void testRollback() throws XAException {
Xid xid = new CustomXid(3);
@@ -241,6 +276,7 @@ public class XADataSourceTest extends TestCase {
xaRes.rollback(xid);
}
+ @Test
public void testRollbackWithoutPrepare() throws XAException {
Xid xid = new CustomXid(4);
@@ -249,6 +285,7 @@ public class XADataSourceTest extends TestCase {
xaRes.rollback(xid);
}
+ @Test
public void testAutoCommit() throws Exception {
Xid xid = new CustomXid(6);
@@ -327,6 +364,7 @@ public class XADataSourceTest extends TestCase {
return rs.getTimestamp(1);
}
+ @Test
public void testEndThenJoin() throws XAException {
Xid xid = new CustomXid(5);
@@ -337,6 +375,7 @@ public class XADataSourceTest extends TestCase {
xaRes.commit(xid, true);
}
+ @Test
public void testRestoreOfAutoCommit() throws Exception {
conn.setAutoCommit(false);
@@ -363,6 +402,7 @@ public class XADataSourceTest extends TestCase {
}
+ @Test
public void testRestoreOfAutoCommitEndThenJoin() throws Exception {
// Test with TMJOIN
conn.setAutoCommit(true);
@@ -385,6 +425,7 @@ public class XADataSourceTest extends TestCase {
* Check the driver reports the xid does not exist. The db knows the fact. ERROR: prepared
* transaction with identifier "blah" does not exist
*/
+ @Test
public void testRepeatedRolledBack() throws Exception {
Xid xid = new CustomXid(654321);
xaRes.start(xid, XAResource.TMNOFLAGS);
@@ -398,10 +439,347 @@ public class XADataSourceTest extends TestCase {
fail("Rollback was successful");
} catch (XAException xae) {
assertEquals("Checking the errorCode is XAER_NOTA indicating the " + "xid does not exist.",
+ xae.errorCode, XAException.XAER_NOTA);
+ }
+ }
+
+ /**
+ * Invoking prepare on already prepared {@link Xid} causes {@link XAException} being thrown
+ * with error code {@link XAException#XAER_PROTO}.
+ */
+ @Test
+ public void testPreparingPreparedXid() throws Exception {
+ Xid xid = new CustomXid(1);
+ xaRes.start(xid, XAResource.TMNOFLAGS);
+ xaRes.end(xid, XAResource.TMSUCCESS);
+ xaRes.prepare(xid);
+ try {
+ xaRes.prepare(xid);
+ fail("Prepare is expected to fail with XAER_PROTO as xid was already prepared");
+ } catch (XAException xae) {
+ assertEquals("Prepare call on already prepared xid " + xid + " expects XAER_PROTO",
+ XAException.XAER_PROTO, xae.errorCode);
+ } finally {
+ xaRes.rollback(xid);
+ }
+ }
+
+ /**
+ * Invoking commit on already committed {@link Xid} causes {@link XAException} being thrown
+ * with error code {@link XAException#XAER_NOTA}.
+ */
+ @Test
+ public void testCommitingCommittedXid() throws Exception {
+ Xid xid = new CustomXid(1);
+ xaRes.start(xid, XAResource.TMNOFLAGS);
+ xaRes.end(xid, XAResource.TMSUCCESS);
+ xaRes.prepare(xid);
+ xaRes.commit(xid, false);
+
+ try {
+ xaRes.commit(xid, false);
+ fail("Commit is expected to fail with XAER_NOTA as xid was already committed");
+ } catch (XAException xae) {
+ assertEquals("Commit call on already committed xid " + xid + " expects XAER_NOTA",
+ XAException.XAER_NOTA, xae.errorCode);
+ }
+ }
+
+ /**
+ * Invoking commit on {@link Xid} committed by different connection.
+ * That different connection could be for example transaction manager recovery.
+ */
+ @Test
+ public void testCommitByDifferentConnection() throws Exception {
+ Xid xid = new CustomXid(1);
+ xaRes.start(xid, XAResource.TMNOFLAGS);
+ xaRes.end(xid, XAResource.TMSUCCESS);
+ xaRes.prepare(xid);
+
+ XADataSource secondDs = null;
+ try {
+ secondDs = new PGXADataSource();
+ BaseDataSourceTest.setupDataSource((PGXADataSource) secondDs);
+ XAResource secondXaRes = secondDs.getXAConnection().getXAResource();
+ secondXaRes.recover(XAResource.TMSTARTRSCAN | XAResource.TMENDRSCAN);
+ secondXaRes.commit(xid, false);
+ } finally {
+ if (secondDs != null) {
+ secondDs.getXAConnection().close();
+ }
+ }
+
+ try {
+ xaRes.commit(xid, false);
+ fail("Commit is expected to fail with XAER_RMERR as somebody else already committed");
+ } catch (XAException xae) {
+ assertEquals("Commit call on already committed xid " + xid + " expects XAER_RMERR",
+ XAException.XAER_RMERR, xae.errorCode);
+ }
+ }
+
+ /**
+ * Invoking rollback on {@link Xid} rolled-back by different connection.
+ * That different connection could be for example transaction manager recovery.
+ */
+ @Test
+ public void testRollbackByDifferentConnection() throws Exception {
+ Xid xid = new CustomXid(1);
+ xaRes.start(xid, XAResource.TMNOFLAGS);
+ xaRes.end(xid, XAResource.TMSUCCESS);
+ xaRes.prepare(xid);
+
+ XADataSource secondDs = null;
+ try {
+ secondDs = new PGXADataSource();
+ BaseDataSourceTest.setupDataSource((PGXADataSource) secondDs);
+ XAResource secondXaRes = secondDs.getXAConnection().getXAResource();
+ secondXaRes.recover(XAResource.TMSTARTRSCAN | XAResource.TMENDRSCAN);
+ secondXaRes.rollback(xid);
+ } finally {
+ if (secondDs != null) {
+ secondDs.getXAConnection().close();
+ }
+ }
+
+ try {
+ xaRes.rollback(xid);
+ fail("Rollback is expected to fail with XAER_RMERR as somebody else already rolled-back");
+ } catch (XAException xae) {
+ assertEquals("Rollback call on already rolled-back xid " + xid + " expects XAER_RMERR",
+ XAException.XAER_RMERR, xae.errorCode);
+ }
+ }
+
+ /**
+ * One-phase commit of prepared {@link Xid} should throw exception.
+ */
+ @Test
+ public void testOnePhaseCommitOfPrepared() throws Exception {
+ Xid xid = new CustomXid(1);
+ xaRes.start(xid, XAResource.TMNOFLAGS);
+ xaRes.end(xid, XAResource.TMSUCCESS);
+ xaRes.prepare(xid);
+
+ try {
+ xaRes.commit(xid, true);
+ fail("One-phase commit is expected to fail with XAER_PROTO when called on prepared xid");
+ } catch (XAException xae) {
+ assertEquals("One-phase commit of prepared xid " + xid + " expects XAER_PROTO",
+ XAException.XAER_PROTO, xae.errorCode);
+ }
+ }
+
+ /**
+ * Invoking one-phase commit on already one-phase committed {@link Xid} causes
+ * {@link XAException} being thrown with error code {@link XAException#XAER_NOTA}.
+ */
+ @Test
+ public void testOnePhaseCommitingCommittedXid() throws Exception {
+ Xid xid = new CustomXid(1);
+ xaRes.start(xid, XAResource.TMNOFLAGS);
+ xaRes.end(xid, XAResource.TMSUCCESS);
+ xaRes.commit(xid, true);
+
+ try {
+ xaRes.commit(xid, true);
+ fail("One-phase commit is expected to fail with XAER_NOTA as xid was already committed");
+ } catch (XAException xae) {
+ assertEquals("One-phase commit call on already committed xid " + xid + " expects XAER_NOTA",
+ XAException.XAER_NOTA, xae.errorCode);
+ }
+ }
+
+ /**
+ * When unknown xid is tried to be prepared the expected {@link XAException#errorCode}
+ * is {@link XAException#XAER_NOTA}.
+ */
+ @Test
+ public void testPrepareUnknownXid() throws Exception {
+ Xid xid = new CustomXid(1);
+ try {
+ xaRes.prepare(xid);
+ fail("Prepare is expected to fail with XAER_NOTA as used unknown xid");
+ } catch (XAException xae) {
+ assertEquals("Prepare call on unknown xid " + xid + " expects XAER_NOTA",
XAException.XAER_NOTA, xae.errorCode);
}
}
+ /**
+ * When unknown xid is tried to be committed the expected {@link XAException#errorCode}
+ * is {@link XAException#XAER_NOTA}.
+ */
+ @Test
+ public void testCommitUnknownXid() throws Exception {
+ Xid xid = new CustomXid(1);
+ Xid unknownXid = new CustomXid(42);
+ xaRes.start(xid, XAResource.TMNOFLAGS);
+ xaRes.end(xid, XAResource.TMSUCCESS);
+ xaRes.prepare(xid);
+ try {
+ xaRes.commit(unknownXid, false);
+ fail("Commit is expected to fail with XAER_NOTA as used unknown xid");
+ } catch (XAException xae) {
+ assertEquals("Commit call on unknown xid " + unknownXid + " expects XAER_NOTA",
+ XAException.XAER_NOTA, xae.errorCode);
+ } finally {
+ xaRes.rollback(xid);
+ }
+ }
+
+ /**
+ * When unknown xid is tried to be committed with one-phase commit optimization
+ * the expected {@link XAException#errorCode} is {@link XAException#XAER_NOTA}.
+ */
+ @Test
+ public void testOnePhaseCommitUnknownXid() throws Exception {
+ Xid xid = new CustomXid(1);
+ Xid unknownXid = new CustomXid(42);
+ xaRes.start(xid, XAResource.TMNOFLAGS);
+ xaRes.end(xid, XAResource.TMSUCCESS);
+ try {
+ xaRes.commit(unknownXid, true);
+ fail("One-phase commit is expected to fail with XAER_NOTA as used unknown xid");
+ } catch (XAException xae) {
+ assertEquals("Commit call on unknown xid " + unknownXid + " expects XAER_NOTA",
+ XAException.XAER_NOTA, xae.errorCode);
+ } finally {
+ xaRes.rollback(xid);
+ }
+ }
+
+ /**
+ * When unknown xid is tried to be rolled-back the expected {@link XAException#errorCode}
+ * is {@link XAException#XAER_NOTA}.
+ */
+ @Test
+ public void testRollbackUnknownXid() throws Exception {
+ Xid xid = new CustomXid(1);
+ Xid unknownXid = new CustomXid(42);
+ xaRes.start(xid, XAResource.TMNOFLAGS);
+ xaRes.end(xid, XAResource.TMSUCCESS);
+ xaRes.prepare(xid);
+ try {
+ xaRes.rollback(unknownXid);
+ fail("Rollback is expected to fail as used unknown xid");
+ } catch (XAException xae) {
+ assertEquals("Commit call on unknown xid " + unknownXid + " expects XAER_NOTA",
+ XAException.XAER_NOTA, xae.errorCode);
+ } finally {
+ xaRes.rollback(xid);
+ }
+ }
+
+ /**
+ * When trying to commit xid which was already removed by arbitrary action of database.
+ * Resource manager can't expect state of the {@link Xid}.
+ */
+ @Test
+ public void testDatabaseRemovesPreparedBeforeCommit() throws Exception {
+ Xid xid = new CustomXid(1);
+ xaRes.start(xid, XAResource.TMNOFLAGS);
+ xaRes.end(xid, XAResource.TMSUCCESS);
+ xaRes.prepare(xid);
+
+ clearAllPrepared();
+
+ try {
+ xaRes.commit(xid, false);
+ fail("Commit is expected to fail as committed xid was removed before");
+ } catch (XAException xae) {
+ assertEquals("Commit call on xid " + xid + " not known to DB expects XAER_RMERR",
+ XAException.XAER_RMERR, xae.errorCode);
+ }
+ }
+
+ /**
+ * When trying to rollback xid which was already removed by arbitrary action of database.
+ * Resource manager can't expect state of the {@link Xid}.
+ */
+ @Test
+ public void testDatabaseRemovesPreparedBeforeRollback() throws Exception {
+ Xid xid = new CustomXid(1);
+ xaRes.start(xid, XAResource.TMNOFLAGS);
+ xaRes.end(xid, XAResource.TMSUCCESS);
+ xaRes.prepare(xid);
+
+ clearAllPrepared();
+
+ try {
+ xaRes.rollback(xid);
+ fail("Rollback is expected to fail as committed xid was removed before");
+ } catch (XAException xae) {
+ assertEquals("Rollback call on xid " + xid + " not known to DB expects XAER_RMERR",
+ XAException.XAER_RMERR, xae.errorCode);
+ }
+ }
+
+ /**
+ * When trying to commit and connection issue happens then
+ * {@link XAException} error code {@link XAException#XAER_RMFAIL} is expected.
+ */
+ @Test
+ public void testNetworkIssueOnCommit() throws Exception {
+ Xid xid = new CustomXid(1);
+ xaRes.start(xid, XAResource.TMNOFLAGS);
+ xaRes.end(xid, XAResource.TMSUCCESS);
+ xaRes.prepare(xid);
+
+ xaconn.close();
+
+ try {
+ xaRes.commit(xid, false);
+ fail("Commit is expected to fail as connection was closed");
+ } catch (XAException xae) {
+ assertEquals("Commit call on closed connection expects XAER_RMFAIL",
+ XAException.XAER_RMFAIL, xae.errorCode);
+ }
+ }
+
+ /**
+ * When trying to one-phase commit and connection issue happens then
+ * {@link XAException} error code {@link XAException#XAER_RMFAIL} is expected.
+ */
+ @Test
+ public void testNetworkIssueOnOnePhaseCommit() throws Exception {
+ Xid xid = new CustomXid(1);
+ xaRes.start(xid, XAResource.TMNOFLAGS);
+ xaRes.end(xid, XAResource.TMSUCCESS);
+
+ xaconn.close();
+
+ try {
+ xaRes.commit(xid, true);
+ fail("One-phase commit is expected to fail as connection was closed");
+ } catch (XAException xae) {
+ assertEquals("One-phase commit call on closed connection expects XAER_RMFAIL",
+ XAException.XAER_RMFAIL, xae.errorCode);
+ }
+ }
+
+ /**
+ * When trying to rollback and connection issue happens then
+ * {@link XAException} error code {@link XAException#XAER_RMFAIL} is expected.
+ */
+ @Test
+ public void testNetworkIssueOnRollback() throws Exception {
+ Xid xid = new CustomXid(1);
+ xaRes.start(xid, XAResource.TMNOFLAGS);
+ xaRes.end(xid, XAResource.TMSUCCESS);
+ xaRes.prepare(xid);
+
+ xaconn.close();
+
+ try {
+ xaRes.rollback(xid);
+ fail("Rollback is expected to fail as connection was closed");
+ } catch (XAException xae) {
+ assertEquals("Rollback call on closed connection expects XAER_RMFAIL",
+ XAException.XAER_RMFAIL, xae.errorCode);
+ }
+ }
+
/*
* We don't support transaction interleaving. public void testInterleaving1() throws Exception {
* Xid xid1 = new CustomXid(1); Xid xid2 = new CustomXid(2);
diff --git a/pgjdbc/src/test/java/org/postgresql/test/xa/XATestSuite.java b/pgjdbc/src/test/java/org/postgresql/test/xa/XATestSuite.java
index adc514e..787ebc7 100644
--- a/pgjdbc/src/test/java/org/postgresql/test/xa/XATestSuite.java
+++ b/pgjdbc/src/test/java/org/postgresql/test/xa/XATestSuite.java
@@ -5,37 +5,10 @@
package org.postgresql.test.xa;
-import org.postgresql.test.TestUtil;
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
-import junit.framework.TestSuite;
-
-import java.sql.Connection;
-import java.sql.ResultSet;
-import java.sql.Statement;
-
-public class XATestSuite extends TestSuite {
- public static TestSuite suite() throws Exception {
- Class.forName("org.postgresql.Driver");
- TestSuite suite = new TestSuite();
- Connection connection = TestUtil.openDB();
-
- try {
- if (TestUtil.haveMinimumServerVersion(connection, "8.1")) {
- Statement stmt = connection.createStatement();
- ResultSet rs = stmt.executeQuery("SHOW max_prepared_transactions");
- rs.next();
- int mpt = rs.getInt(1);
- if (mpt > 0) {
- suite.addTestSuite(XADataSourceTest.class);
- } else {
- System.out.println("Skipping XA tests because max_prepared_transactions = 0.");
- }
- rs.close();
- stmt.close();
- }
- } finally {
- connection.close();
- }
- return suite;
- }
+ at RunWith(Suite.class)
+ at Suite.SuiteClasses(XADataSourceTest.class)
+public class XATestSuite {
}
diff --git a/pgjdbc/src/test/java/org/postgresql/util/NullOutputStream.java b/pgjdbc/src/test/java/org/postgresql/util/NullOutputStream.java
new file mode 100644
index 0000000..764dc1a
--- /dev/null
+++ b/pgjdbc/src/test/java/org/postgresql/util/NullOutputStream.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (c) 2017, PostgreSQL Global Development Group
+ * See the LICENSE file in the project root for more information.
+ */
+
+package org.postgresql.util;
+
+import java.io.OutputStream;
+import java.io.PrintStream;
+
+/**
+ * Created by davec on 3/14/17.
+ */
+public class NullOutputStream extends PrintStream {
+
+ public NullOutputStream(OutputStream out) {
+ super(out);
+ }
+
+ @Override
+ public void write(int b) {
+
+ }
+
+ @Override
+ public void write(byte[] buf, int off, int len) {
+
+ }
+}
diff --git a/pgjdbc/src/test/java/org/postgresql/util/PSQLWarningTest.java b/pgjdbc/src/test/java/org/postgresql/util/PSQLWarningTest.java
new file mode 100644
index 0000000..04853dd
--- /dev/null
+++ b/pgjdbc/src/test/java/org/postgresql/util/PSQLWarningTest.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2016, PostgreSQL Global Development Group
+ * See the LICENSE file in the project root for more information.
+ */
+
+package org.postgresql.util;
+
+import static org.junit.Assert.assertTrue;
+
+import org.postgresql.test.TestUtil;
+
+import org.junit.Test;
+
+import java.io.ByteArrayOutputStream;
+import java.io.OutputStreamWriter;
+import java.io.PrintWriter;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.Statement;
+
+
+public class PSQLWarningTest {
+
+ @Test
+ public void testPSQLLogsToDriverManagerMessage() throws Exception {
+ Connection con = TestUtil.openDB();
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ DriverManager.setLogWriter(new PrintWriter(new OutputStreamWriter(baos, "ASCII")));
+
+ Statement stmt = con.createStatement();
+ stmt.execute("DO language plpgsql $$ BEGIN RAISE NOTICE 'test notice'; END $$;");
+ assertTrue(baos.toString().contains("NOTICE: test notice"));
+
+ stmt.close();
+ con.close();
+ }
+}
diff --git a/pgjdbc/src/test/java/org/postgresql/util/ReaderInputStreamTest.java b/pgjdbc/src/test/java/org/postgresql/util/ReaderInputStreamTest.java
new file mode 100644
index 0000000..d05a625
--- /dev/null
+++ b/pgjdbc/src/test/java/org/postgresql/util/ReaderInputStreamTest.java
@@ -0,0 +1,227 @@
+/*
+ * Copyright (c) 2016, PostgreSQL Global Development Group
+ * See the LICENSE file in the project root for more information.
+ */
+
+package org.postgresql.util;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+
+import java.io.ByteArrayInputStream;
+import java.io.CharArrayReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.io.StringReader;
+import java.nio.charset.MalformedInputException;
+import java.util.Arrays;
+
+public class ReaderInputStreamTest {
+ // 132878 = U+2070E - chosen because it is the first supplementary character
+ // in the International Ideographic Core (IICore)
+ // see http://www.i18nguy.com/unicode/supplementary-test.html for further explanation
+
+ // Character.highSurrogate(132878) = 0xd841
+ private static final char LEADING_SURROGATE = 0xd841;
+
+ // Character.lowSurrogate(132878) = 0xdf0e
+ private static final char TRAILING_SURROGATE = 0xdf0e;
+
+ @Test(expected = IllegalArgumentException.class)
+ public void NullReaderTest() {
+ new ReaderInputStream(null);
+ }
+
+ @Test(expected = IllegalArgumentException.class)
+ public void cbufTooSmallReaderTest() {
+ new ReaderInputStream(new StringReader("abc"), 1);
+ }
+
+ private static void read(InputStream is, int... expected) throws IOException {
+ byte[] actual = new byte[4];
+ Arrays.fill(actual, (byte) 0x00);
+ int nActual = is.read(actual);
+ int[] actualInts = new int[4];
+ for (int i = 0; i < actual.length; i++) {
+ actualInts[i] = actual[i] & 0xff;
+ }
+ if (expected.length > 0) {
+ // Ensure "expected" has 4 bytes
+ expected = Arrays.copyOf(expected, 4);
+ assertEquals(Arrays.toString(expected), Arrays.toString(actualInts));
+ } else {
+ assertEquals("should be end-of-stream", -1, nActual);
+ is.close();
+ }
+ }
+
+ @Test
+ public void SimpleTest() throws IOException {
+ char[] chars = {'a', 'b', 'c'};
+ Reader reader = new CharArrayReader(chars);
+ InputStream is = new ReaderInputStream(reader);
+ read(is, 0x61, 0x62, 0x63);
+ read(is);
+ }
+
+ @Test
+ public void inputSmallerThanCbufsizeTest() throws IOException {
+ char[] chars = {'a'};
+ Reader reader = new CharArrayReader(chars);
+ InputStream is = new ReaderInputStream(reader, 2);
+ read(is, 0x61);
+ read(is);
+ }
+
+ @Test
+ public void tooManyReadsTest() throws IOException {
+ char[] chars = {'a'};
+ Reader reader = new CharArrayReader(chars);
+ InputStream is = new ReaderInputStream(reader, 2);
+ read(is, 0x61);
+ assertEquals("should be end-of-stream", -1, is.read());
+ assertEquals("should be end-of-stream", -1, is.read());
+ assertEquals("should be end-of-stream", -1, is.read());
+ is.close();
+ }
+
+ @Test
+ public void surrogatePairSpansCharBufBoundaryTest() throws IOException {
+ char[] chars = {'a', LEADING_SURROGATE, TRAILING_SURROGATE};
+ Reader reader = new CharArrayReader(chars);
+ InputStream is = new ReaderInputStream(reader, 2);
+ read(is, 0x61, 0xF0, 0xA0, 0x9C);
+ read(is, 0x8E);
+ read(is);
+ }
+
+ @Test(expected = MalformedInputException.class)
+ public void invalidInputTest() throws IOException {
+ char[] chars = {'a', LEADING_SURROGATE, LEADING_SURROGATE};
+ Reader reader = new CharArrayReader(chars);
+ InputStream is = new ReaderInputStream(reader, 2);
+ read(is);
+ }
+
+ @Test(expected = MalformedInputException.class)
+ public void unmatchedLeadingSurrogateInputTest() throws IOException {
+ char[] chars = {LEADING_SURROGATE};
+ Reader reader = new CharArrayReader(chars);
+ InputStream is = new ReaderInputStream(reader, 2);
+ read(is, 0x00);
+ }
+
+ @Test(expected = MalformedInputException.class)
+ public void unmatchedTrailingSurrogateInputTest() throws IOException {
+ char[] chars = {TRAILING_SURROGATE};
+ Reader reader = new CharArrayReader(chars);
+ InputStream is = new ReaderInputStream(reader, 2);
+ read(is);
+ }
+
+ @Test(expected = NullPointerException.class)
+ public void nullArrayReadTest() throws IOException {
+ Reader reader = new StringReader("abc");
+ InputStream is = new ReaderInputStream(reader);
+ is.read(null, 0, 4);
+ }
+
+ @Test(expected = IndexOutOfBoundsException.class)
+ public void invalidOffsetArrayReadTest() throws IOException {
+ Reader reader = new StringReader("abc");
+ InputStream is = new ReaderInputStream(reader);
+ byte[] bytes = new byte[4];
+ is.read(bytes, 5, 4);
+ }
+
+ @Test(expected = IndexOutOfBoundsException.class)
+ public void negativeOffsetArrayReadTest() throws IOException {
+ Reader reader = new StringReader("abc");
+ InputStream is = new ReaderInputStream(reader);
+ byte[] bytes = new byte[4];
+ is.read(bytes, -1, 4);
+ }
+
+ @Test(expected = IndexOutOfBoundsException.class)
+ public void invalidLengthArrayReadTest() throws IOException {
+ Reader reader = new StringReader("abc");
+ InputStream is = new ReaderInputStream(reader);
+ byte[] bytes = new byte[4];
+ is.read(bytes, 1, 4);
+ }
+
+ @Test(expected = IndexOutOfBoundsException.class)
+ public void negativeLengthArrayReadTest() throws IOException {
+ Reader reader = new StringReader("abc");
+ InputStream is = new ReaderInputStream(reader);
+ byte[] bytes = new byte[4];
+ is.read(bytes, 1, -2);
+ }
+
+ @Test
+ public void zeroLengthArrayReadTest() throws IOException {
+ Reader reader = new StringReader("abc");
+ InputStream is = new ReaderInputStream(reader);
+ byte[] bytes = new byte[4];
+ assertEquals("requested 0 byte read", 0, is.read(bytes, 1, 0));
+ }
+
+ @Test
+ public void singleCharArrayReadTest() throws IOException {
+ Reader reader = new SingleCharPerReadReader(LEADING_SURROGATE, TRAILING_SURROGATE);
+ InputStream is = new ReaderInputStream(reader);
+ read(is, 0xF0, 0xA0, 0x9C, 0x8E);
+ read(is);
+ }
+
+ @Test(expected = MalformedInputException.class)
+ public void malformedSingleCharArrayReadTest() throws IOException {
+ Reader reader = new SingleCharPerReadReader(LEADING_SURROGATE, LEADING_SURROGATE);
+ InputStream is = new ReaderInputStream(reader);
+ read(is, 0xF0, 0xA0, 0x9C, 0x8E);
+ }
+
+ @Test
+ public void readsEqualToBlockSizeTest() throws Exception {
+ final int blockSize = 8 * 1024;
+ final int dataSize = blockSize + 57;
+ final byte[] data = new byte[dataSize];
+ final byte[] buffer = new byte[blockSize];
+
+ InputStreamReader isr = new InputStreamReader(new ByteArrayInputStream(data), "UTF-8");
+ ReaderInputStream r = new ReaderInputStream(isr, blockSize);
+
+ int total = 0;
+
+ total += r.read(buffer, 0, blockSize);
+ total += r.read(buffer, 0, blockSize);
+
+ assertEquals("Data not read completely: missing " + (dataSize - total) + " bytes", dataSize, total);
+ }
+
+ private static class SingleCharPerReadReader extends Reader {
+ private final char[] data;
+ private int i;
+
+ private SingleCharPerReadReader(char... data) {
+ this.data = data;
+ }
+
+ @Override
+ public int read(char[] cbuf, int off, int len) throws IOException {
+ if (i < data.length) {
+ cbuf[off] = data[i++];
+ return 1;
+ }
+
+ return -1;
+ }
+
+ @Override
+ public void close() throws IOException {
+ }
+ }
+}
diff --git a/pom.xml b/pom.xml
index ea42542..869e5ea 100644
--- a/pom.xml
+++ b/pom.xml
@@ -3,13 +3,13 @@
<parent>
<groupId>org.postgresql</groupId>
<artifactId>pgjdbc-versions</artifactId>
- <version>1.1.2</version>
+ <version>1.1.3</version>
</parent>
<artifactId>pgjdbc-aggregate</artifactId>
<packaging>pom</packaging>
<name>PostgreSQL JDBC Driver aggregate</name>
- <version>9.4.1212</version>
+ <version>42.2.2</version>
<description>PgJDBC aggregate project</description>
<url>https://github.com/pgjdbc/pgjdbc</url>
@@ -23,7 +23,7 @@
<url>https://github.com/pgjdbc/pgjdbc</url>
<connection>scm:git:https://github.com/pgjdbc/pgjdbc.git</connection>
<developerConnection>scm:git:git at github.com:pgjdbc/pgjdbc.git</developerConnection>
- <tag>REL9.4.1212</tag>
+ <tag>REL42.2.2</tag>
</scm>
</project>
diff --git a/release_notes.sh b/release_notes.sh
index e60933c..d099437 100755
--- a/release_notes.sh
+++ b/release_notes.sh
@@ -1,15 +1,55 @@
-#!/bin/sh
+#!/bin/bash
CURRENT_VERSION=`mvn -B -N org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate -Dexpression=project.version | grep -v '\['`
VERS=${CURRENT_VERSION/-SNAPSHOT}
+DATE_YMD=$(date '+%Y-%m-%d')
+RELEASE_FILE=$(find docs/_posts -name "*-$VERS-release.md" | head -n 1)
+if [[ "x$RELEASE_FILE" == "x" ]]; then
+ RELEASE_FILE=docs/_posts/$DATE_YMD-$VERS-release.md
+fi
+echo file: $RELEASE_FILE
+
+if [ -f $RELEASE_FILE ]; then
+ if [[ "x$1" == "x-o" ]]; then
+ echo Removing file $RELEASE_FILE
+ rm "$RELEASE_FILE"
+ fi
+fi
+
+if [ -f $RELEASE_FILE ]; then
+ echo File $RELEASE_FILE already exists. If you want to overwrite it, pass -o parameter
+else
+ # Makes all the output get printed to the file as well (concept from http://stackoverflow.com/a/3403786/267224)
+ exec > >(tee -a $RELEASE_FILE)
+ exec 2>&1
+fi
PREV_VERSION=`git describe --match 'REL*' --abbrev=0`
-echo "<a name=\"version_${VERS}\"></a>"
-echo "## Version ${VERS} (2016-16-16)"
+echo ---
+echo title: "PostgreSQL JDBC Driver ${VERS} Released"
+echo date: $(date '+%Y-%m-%d %H:%M:%S %z')
+echo categories:
+echo ' - new_release'
+echo version: ${VERS}
+echo ---
+
+
+echo **Notable changes**
echo
-echo Notable changes:
+awk "/^## \[Unreleased\]/,/^## \[${PREV_VERSION:3}\]/ {print}" CHANGELOG.md | sed -e '1d' -e '$d'
echo
+echo '<!--more-->'
+echo
+echo **Commits by author**
+echo
+
+git shortlog --format="%s@@@%H@@@%h@@@" --grep="maven-release-plugin|update versions in readme.md" --extended-regexp --invert-grep --no-merges $PREV_VERSION..HEAD | perl release_notes_filter.pl ${VERS}
-git shortlog --format="%s@@@%H@@@%h@@@" --grep="maven-release-plugin|update versions in readme.md" --extended-regexp --invert-grep --no-merges $PREV_VERSION..HEAD | perl release_notes_filter.pl
+# Update CHANGELOG.md with the new version
+sed -i -e "s/^## \[Unreleased\]$/## \[${VERS}\] (${DATE_YMD})/" CHANGELOG.md
+sed -i -e "s/^\[Unreleased\]: /\[${VERS}\]: /" CHANGELOG.md
+sed -i -e "s/$PREV_VERSION\.\.\.HEAD/$PREV_VERSION\.\.\.REL${VERS}/" CHANGELOG.md
+sed -i -e "s/^## \[${VERS}\] (${DATE_YMD})$/## \[Unreleased\]\n\n&/g" CHANGELOG.md
+echo "[Unreleased]: https://github.com/pgjdbc/pgjdbc/compare/REL${VERS}...HEAD" >> CHANGELOG.md
diff --git a/release_notes_filter.pl b/release_notes_filter.pl
index ed5285a..32c497d 100644
--- a/release_notes_filter.pl
+++ b/release_notes_filter.pl
@@ -1,10 +1,85 @@
#!/bin/perl
use strict;
+my $version = shift;
+
+my %author_url = (
+ 'Alexander Kjäll' => 'https://github.com/alexanderkjall',
+ 'AlexElin' => 'https://github.com/AlexElin',
+ 'Álvaro Hernández Tortosa' => 'https://github.com/ahachete',
+ 'aryabukhin' => 'https://github.com/aryabukhin',
+ 'Barnabas Bodnar' => 'https://github.com/bbodnar',
+ 'bd-infor' => 'https://github.com/bd-infor',
+ 'bpd0018' => 'https://github.com/bpd0018',
+ 'Brett Okken' => 'https://github.com/bokken',
+ 'Brett Wooldridge' => 'https://github.com/brettwooldridge',
+ 'chalda' => 'https://github.com/ochaloup',
+ 'Chen Huajun' => 'https://github.com/ChenHuajun',
+ 'Christian Ullrich' => 'https://github.com/chrullrich',
+ 'Christopher Deckers' => 'https://github.com/Chrriis',
+ 'Daniel Gustafsson' => 'https://github.com/danielgustafsson',
+ 'Daniel Migowski' =>'https://github.com/dmigowski',
+ 'Dave Cramer' => 'davec at postgresintl.com',
+ 'djydewang' => 'https://github.com/djydewang',
+ 'eperez' => 'https://github.com/eperez',
+ 'Eric McCormack' => 'https://github.com/ericmack',
+ 'Florin Asăvoaie' => 'https://github.com/FlorinAsavoaie',
+ 'George Kankava' => 'https://github.com/georgekankava',
+ 'goeland86' => 'https://github.com/goeland86',
+ 'Hugh Cole-Baker' => 'https://github.com/sigmaris',
+ 'Jacques Fuentes' => 'https://github.com/jpfuentes2',
+ 'James' => 'https://github.com/jamesthomp',
+ 'Jamie Pullar' => 'https://github.com/JamiePullar',
+ 'JCzogalla' => 'https://github.com/JCzogalla',
+ 'Jeff Klukas' => 'https://github.com/jklukas',
+ 'Jeremy Whiting' => 'https://github.com/whitingjr',
+ 'Joe Kutner' => 'https://github.com/jkutner',
+ 'Jordan Lewis' => 'https://github.com/jordanlewis',
+ 'Jorge Solorzano' => 'https://github.com/jorsol',
+ 'Laurenz Albe' => 'https://github.com/laurenz',
+ 'Magnus Hagander' => 'https://github.com/mhagander',
+ 'Magnus' => 'https://github.com/magJ',
+ 'Marc Petzold' => 'https://github.com/dosimeta',
+ 'Marios Trivyzas' => 'https://github.com/matriv',
+ 'Mathias Fußenegger' => 'https://github.com/mfussenegger',
+ 'Michael Glaesemann' => 'https://github.com/grzm',
+ 'MichaelZg' => 'https://github.com/michaelzg',
+ 'Minglei Tu' => 'https://github.com/tminglei',
+ 'mjanczykowski' => 'https://github.com/mjanczykowski',
+ 'Pavel Raiskup' => 'https://github.com/praiskup',
+ 'Pawel' => 'https://github.com/veselov',
+ 'Petro Semeniuk' => 'https://github.com/PetroSemeniuk',
+ 'Philippe Marschall' => 'https://github.com/marschall',
+ 'Piyush Sharma' => 'https://github.com/ps-sp',
+ 'Rikard Pavelic' => 'https://github.com/zapov',
+ 'rnveach' => 'https://github.com/rnveach',
+ 'Robert Zenz' => 'https://github.com/RobertZenz',
+ 'Robert \'Bobby\' Zenz' => 'https://github.com/RobertZenz',
+ 'Roman Ivanov' => 'https://github.com/romani',
+ 'Sebastian Utz' => 'https://github.com/seut',
+ 'Sehrope Sarkuni' => 'https://github.com/sehrope',
+ 'Selene Feigl' => 'https://github.com/sfeigl',
+ 'Simon Stelling' => 'https://github.com/stellingsimon',
+ 'slmsbrhgn' => 'https://github.com/slmsbrhgn',
+ 'Steve Ungerer' => 'https://github.com/scubasau',
+ 'Tanya Gordeeva' => 'https://github.com/tmgordeeva',
+ 'Thach Hoang' => 'https://github.com/thachhoang',
+ 'trtrmitya' => 'https://github.com/trtrmitya',
+ 'Trygve Laugstøl' => 'https://github.com/trygvis',
+ 'Vladimir Gordiychuk' => 'https://github.com/Gordiychuk',
+ 'Vladimir Sitnikov' => 'https://github.com/vlsi',
+ 'zapov' => 'https://github.com/zapov',
+ 'Zemian Deng' => 'https://github.com/zemian',
+);
+
+
+my %authors;
+
while(<>) {
if ($_ !~ /@@@/) {
print $_;
- if ($_ =~ /:/) {
+ if ($_ =~ /(.*) \(\d+\):/) {
+ $authors{$1} = 1;
print "\n";
}
next;
@@ -13,16 +88,16 @@ while(<>) {
my $subject = @c[0];
my $sha = @c[1];
my $shortSha = @c[2];
- my $body = `git log --format='%B' -n 1 $sha`;
- my $mergeSha = `git log --reverse --ancestry-path --merges --format=%H $sha..HEAD | head -1`;
- my $mergeSubject = `git log --format=%B -n 1 $mergeSha`;
my $pr = '';
- if ($body =~ /(?:fix|fixes|close|closes) *#?(\d+)/) {
- $pr = $1;
- }
- if ($pr == '' && $mergeSubject =~ /Merge pull request #(\d+)/) {
- $pr = $1;
+ if ($subject =~ /\(#(\d+)\)/) {
+ $subject =~ s;\(#(\d+)\);[PR#\1](https://github.com/pgjdbc/pgjdbc/pull/\1);;
+ } else {
+ my $body = `git log --format='%B' -n 1 $sha`;
+
+ if ($body =~ /(?:fix|fixes|close|closes) *#?(\d+)/) {
+ $pr = $1;
+ }
}
if ($pr != '') {
$pr = ' [PR#'.$pr.'](https://github.com/pgjdbc/pgjdbc/pull/'.$pr.')';
@@ -31,3 +106,16 @@ while(<>) {
print $subject.$pr." [".$shortSha."](https://github.com/pgjdbc/pgjdbc/commit/$sha)\n";
}
+
+print "<a name=\"contributors_{{ page.version }}\"></a>\n";
+print "### Contributors to this release\n\n";
+
+print "We thank the following people for their contributions to this release.\n\n";
+for my $c (sort keys(%authors)) {
+ if ($author_url{$c}) {
+ print "[$c](".$author_url{$c}.")";
+ } else {
+ print $c;
+ }
+ print " \n"
+}
diff --git a/release_stage.sh b/release_stage.sh
new file mode 100755
index 0000000..f36e142
--- /dev/null
+++ b/release_stage.sh
@@ -0,0 +1,69 @@
+#!/bin/bash -x
+
+# This script should be run from pgjdbc clone, and it deploys pgjdbc, pgjdbc-jre7, and pgjdbc-jre6 to Staging repository
+# Later the staged repositories can be inspected or promoted
+# Note: if script fails in the middle, manual git reset, and removal of the tag might be required
+# Note: the script should be run like ./release_stage.sh 42.1.1 42.1.2
+
+RELEASE_VERSION=$1
+NEXT_VERSION=$2
+
+if [ -z "$RELEASE_VERSION" ]; then
+ echo "Release version is not set"
+ exit 1
+fi
+if [ -z "$NEXT_VERSION" ]; then
+ echo "Next version is not set"
+ exit 1
+fi
+
+function clone_prev {
+ JRE=$1
+ if [ -d pgjdbc-jre$JRE ]; then
+ echo pgjdbc-jre$JRE already exists
+ return
+ fi
+ echo Cloning pgjdbc-jre$JRE
+ echo git clone https://github.com/pgjdbc/pgjdbc-jre$JRE
+ echo cd pgjdbc-jre$JRE
+ echo git submodule update --init
+}
+
+(clone_prev 6)
+(clone_prev 7)
+
+function mvn_release {
+ SUFFIX=$1
+ if [ -f "released_$SUFFIX" ]
+ then
+ echo "$SUFFIX has already been released"
+ return
+ fi
+ echo
+ echo
+ echo Releasing $SUFFIX
+ echo =================
+ echo
+
+ git reset --hard
+ mvn release:clean release:prepare -DreleaseVersion=$RELEASE_VERSION$SUFFIX -DdevelopmentVersion=$NEXT_VERSION$SUFFIX-SNAPSHOT -Dtag=REL$RELEASE_VERSION$SUFFIX &&\
+ mvn release:perform &&\
+ echo https://oss.sonatype.org/content/repositories/staging/org/postgresql/postgresql/$RELEASE_VERSION$SUFFIX/ > released_$SUFFIX
+}
+
+function release_prev {
+ JRE=$1
+ cd pgjdbc-$JRE/pgjdbc &&\
+ git fetch &&\
+ git reset --hard REL$RELEASE_VERSION &&\
+ cd .. &&\
+ git checkout master &&\
+ git reset --hard origin/master &&\
+ git add pgjdbc &&\
+ git commit -m "Update pgjdbc to $RELEASE_VERSION" &&\
+ mvn_release .$JRE
+}
+
+mvn_release &&\
+(release_prev jre7) &&\
+(release_prev jre6)
diff --git a/settings.xml b/settings.xml
index abb5373..ea6b367 100644
--- a/settings.xml
+++ b/settings.xml
@@ -4,7 +4,11 @@
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<servers>
<server>
- <!-- Deploy only snapshots from Travis -->
+ <id>ossrh</id>
+ <username>${env.SONATYPE_USERNAME}</username>
+ <password>${env.SONATYPE_PASSWORD}</password>
+ </server>
+ <server>
<id>ossrh-snapshots</id>
<username>${env.SONATYPE_USERNAME}</username>
<password>${env.SONATYPE_PASSWORD}</password>
diff --git a/ssltest.properties b/ssltest.properties
index b6ab41d..21d1d45 100644
--- a/ssltest.properties
+++ b/ssltest.properties
@@ -4,32 +4,6 @@ certdir=certdir
# Uncomment to enable testing of SingleCertValidatingFactory
#testsinglecertfactory=true
-
-ssloff8=
-ssloff8prefix=
-
-#sslhostnossl8=jdbc:postgresql://localhost:5432/hostnossldb?sslpassword=sslpwd
-sslhostnossl8prefix=
-
-#sslhostgh8=jdbc:postgresql://localhost:5432/hostdb?sslpassword=sslpwd
-sslhostgh8prefix=
-#sslhostbh8=jdbc:postgresql://127.0.0.1:5432/hostdb?sslpassword=sslpwd
-sslhostbh8prefix=
-
-#sslhostsslgh8=jdbc:postgresql://localhost:5432/hostssldb?sslpassword=sslpwd
-sslhostsslgh8prefix=
-#sslhostsslbh8=jdbc:postgresql://127.0.0.1:5432/hostssldb?sslpassword=sslpwd
-sslhostsslbh8prefix=
-
-#sslhostsslcertgh8=jdbc:postgresql://localhost:5432/hostsslcertdb?sslpassword=sslpwd
-sslhostsslcertgh8prefix=
-#sslhostsslcertbh8=jdbc:postgresql://127.0.0.1:5432/hostsslcertdb?sslpassword=sslpwd
-sslhostsslcertbh8prefix=
-
-#sslcertgh8=jdbc:postgresql://localhost:5432/certdb?sslpassword=sslpwd
-sslcertgh8prefix=
-#sslcertbh8=jdbc:postgresql://127.0.0.1:5432/certdb?sslpassword=sslpwd
-sslcertbh8prefix=
ssloff9=
ssloff9prefix=
@@ -55,4 +29,4 @@ sslhostsslcertbh9prefix=
#sslcertgh9=jdbc:postgresql://localhost:5432/certdb?sslpassword=sslpwd
sslcertgh9prefix=
#sslcertbh9=jdbc:postgresql://127.0.0.1:5432/certdb?sslpassword=sslpwd
-sslcertbh9prefix=
+sslcertbh9prefix=
\ No newline at end of file
diff --git a/ubenchmark/pom.xml b/ubenchmark/pom.xml
index d86b05a..dc207e4 100644
--- a/ubenchmark/pom.xml
+++ b/ubenchmark/pom.xml
@@ -31,21 +31,17 @@ POSSIBILITY OF SUCH DAMAGE.
<parent>
<groupId>org.postgresql</groupId>
<artifactId>pgjdbc-versions</artifactId>
- <version>1.1.2</version>
+ <version>1.1.3</version>
<relativePath />
</parent>
<artifactId>pgjdbc-benchmark</artifactId>
<packaging>jar</packaging>
<name>PostgreSQL JDBC Driver - benchmarks</name>
- <version>9.4.1212</version>
+ <version>42.2.2</version>
<description>PostgreSQL JDBC Driver - benchmarks</description>
<url>https://github.com/pgjdbc/pgjdbc</url>
- <prerequisites>
- <maven>3.0</maven>
- </prerequisites>
-
<dependencies>
<dependency>
<groupId>org.openjdk.jmh</groupId>
@@ -67,7 +63,7 @@ POSSIBILITY OF SUCH DAMAGE.
</dependencies>
<properties>
- <jmh.version>1.12</jmh.version>
+ <jmh.version>1.17.4</jmh.version>
<uberjar.name>benchmarks</uberjar.name>
<current.jdk>1.8</current.jdk>
<javac.target>${current.jdk}</javac.target>
@@ -84,7 +80,7 @@ POSSIBILITY OF SUCH DAMAGE.
<dependency>
<groupId>com.puppycrawl.tools</groupId>
<artifactId>checkstyle</artifactId>
- <version>6.13</version>
+ <version>8.5</version>
</dependency>
</dependencies>
<configuration>
@@ -239,6 +235,6 @@ POSSIBILITY OF SUCH DAMAGE.
</profiles>
<scm>
- <tag>REL9.4.1212</tag>
+ <tag>REL42.2.2</tag>
</scm>
</project>
diff --git a/ubenchmark/src/main/java/org/postgresql/benchmark/encoding/UTF8Decoding.java b/ubenchmark/src/main/java/org/postgresql/benchmark/encoding/UTF8Decoding.java
new file mode 100644
index 0000000..4a23db5
--- /dev/null
+++ b/ubenchmark/src/main/java/org/postgresql/benchmark/encoding/UTF8Decoding.java
@@ -0,0 +1,107 @@
+/*
+ * Copyright (c) 2017, PostgreSQL Global Development Group
+ * See the LICENSE file in the project root for more information.
+ */
+
+package org.postgresql.benchmark.encoding;
+
+import org.postgresql.core.Encoding;
+
+import org.openjdk.jmh.annotations.Benchmark;
+import org.openjdk.jmh.annotations.BenchmarkMode;
+import org.openjdk.jmh.annotations.Fork;
+import org.openjdk.jmh.annotations.Measurement;
+import org.openjdk.jmh.annotations.Mode;
+import org.openjdk.jmh.annotations.OutputTimeUnit;
+import org.openjdk.jmh.annotations.Param;
+import org.openjdk.jmh.annotations.Scope;
+import org.openjdk.jmh.annotations.Setup;
+import org.openjdk.jmh.annotations.State;
+import org.openjdk.jmh.annotations.Threads;
+import org.openjdk.jmh.annotations.Warmup;
+import org.openjdk.jmh.runner.Runner;
+import org.openjdk.jmh.runner.RunnerException;
+import org.openjdk.jmh.runner.options.Options;
+import org.openjdk.jmh.runner.options.OptionsBuilder;
+
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.nio.ByteBuffer;
+import java.nio.CharBuffer;
+import java.nio.charset.CharacterCodingException;
+import java.nio.charset.Charset;
+import java.nio.charset.CharsetDecoder;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Tests the performance of UTF-8 decoding. UTF-8 is used a lot, so we need to know the performance
+ */
+ at Fork(value = 1, jvmArgsPrepend = "-Xmx128m")
+ at Measurement(iterations = 10, time = 1, timeUnit = TimeUnit.SECONDS)
+ at Warmup(iterations = 10, time = 1, timeUnit = TimeUnit.SECONDS)
+ at State(Scope.Thread)
+ at Threads(1)
+ at BenchmarkMode(Mode.AverageTime)
+ at OutputTimeUnit(TimeUnit.NANOSECONDS)
+public class UTF8Decoding {
+
+ @Param({"1", "5", "10", "50", "100"})
+ public int length;
+
+ private byte[] source;
+ private CharsetDecoder decoder;
+ private Encoding encoding;
+ private CharBuffer buf;
+ private static final Charset UTF_8 = Charset.forName("UTF-8");
+
+ @Setup
+ public void setup() {
+ StringBuilder sb = new StringBuilder();
+ for (int i = 0; i < length; i++) {
+ sb.append("Hello мир,");
+ }
+ source = sb.toString().getBytes(UTF_8);
+ decoder = UTF_8.newDecoder();
+ encoding = Encoding.getJVMEncoding("UTF-8");
+ buf = CharBuffer.allocate(10240);
+ }
+
+ @Benchmark
+ public char[] utilsDecodeUTF8_old() {
+ CharBuffer buf = UTF_8.decode(ByteBuffer.wrap(source));
+ char[] c = new char[buf.limit()];
+ buf.get(c, 0, buf.limit());
+ return c;
+ }
+
+ @Benchmark
+ public String encodingDecodeUTF8_current() throws IOException {
+ return encoding.decode(source, 0, source.length);
+ }
+
+ @Benchmark
+ public String string_string() throws UnsupportedEncodingException {
+ return new String(source, 0, source.length, "UTF-8");
+ }
+
+ @Benchmark
+ public String string_charset() {
+ return new String(source, 0, source.length, UTF_8);
+ }
+
+ @Benchmark
+ public Object decoder_byteBufferReuse() throws CharacterCodingException {
+ buf.clear();
+ return decoder.decode(ByteBuffer.wrap(source), buf, true);
+ }
+
+ public static void main(String[] args) throws RunnerException {
+ Options opt = new OptionsBuilder()
+ .include(UTF8Decoding.class.getSimpleName())
+ //.addProfiler(GCProfiler.class)
+ .detectJvmArgs()
+ .build();
+
+ new Runner(opt).run();
+ }
+}
diff --git a/ubenchmark/src/main/java/org/postgresql/benchmark/statement/BindArray.java b/ubenchmark/src/main/java/org/postgresql/benchmark/statement/BindArray.java
new file mode 100644
index 0000000..2882b2f
--- /dev/null
+++ b/ubenchmark/src/main/java/org/postgresql/benchmark/statement/BindArray.java
@@ -0,0 +1,97 @@
+/*
+ * Copyright (c) 2017, PostgreSQL Global Development Group
+ * See the LICENSE file in the project root for more information.
+ */
+
+package org.postgresql.benchmark.statement;
+
+import org.postgresql.benchmark.profilers.FlightRecorderProfiler;
+import org.postgresql.util.ConnectionUtil;
+
+import org.openjdk.jmh.annotations.Benchmark;
+import org.openjdk.jmh.annotations.BenchmarkMode;
+import org.openjdk.jmh.annotations.Fork;
+import org.openjdk.jmh.annotations.Level;
+import org.openjdk.jmh.annotations.Measurement;
+import org.openjdk.jmh.annotations.Mode;
+import org.openjdk.jmh.annotations.OutputTimeUnit;
+import org.openjdk.jmh.annotations.Param;
+import org.openjdk.jmh.annotations.Scope;
+import org.openjdk.jmh.annotations.Setup;
+import org.openjdk.jmh.annotations.State;
+import org.openjdk.jmh.annotations.TearDown;
+import org.openjdk.jmh.annotations.Warmup;
+import org.openjdk.jmh.profile.GCProfiler;
+import org.openjdk.jmh.runner.Runner;
+import org.openjdk.jmh.runner.RunnerException;
+import org.openjdk.jmh.runner.options.Options;
+import org.openjdk.jmh.runner.options.OptionsBuilder;
+
+import java.sql.Array;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.sql.Types;
+import java.util.Properties;
+import java.util.concurrent.TimeUnit;
+
+ at Fork(value = 1, jvmArgsPrepend = "-Xmx128m")
+ at Measurement(iterations = 10, time = 1, timeUnit = TimeUnit.SECONDS)
+ at Warmup(iterations = 10, time = 1, timeUnit = TimeUnit.SECONDS)
+ at State(Scope.Thread)
+ at BenchmarkMode(Mode.AverageTime)
+ at OutputTimeUnit(TimeUnit.NANOSECONDS)
+public class BindArray {
+ private Connection connection;
+ private PreparedStatement ps;
+
+ Integer[] ints;
+
+ @Param({"1", "5", "10", "50", "100", "1000"})
+ int arraySize;
+
+ @Setup(Level.Trial)
+ public void setUp() throws SQLException {
+ Properties props = ConnectionUtil.getProperties();
+
+ connection = DriverManager.getConnection(ConnectionUtil.getURL(), props);
+ ps = connection.prepareStatement("SELECT ?");
+ ints = new Integer[arraySize];
+ for (int i = 0; i < arraySize; i++) {
+ ints[i] = i + 1;
+ }
+ }
+
+ @TearDown(Level.Trial)
+ public void tearDown() throws SQLException {
+ ps.close();
+ connection.close();
+ }
+
+ @Benchmark
+ public Statement setObject() throws SQLException {
+ Array sqlInts = connection.createArrayOf("int", ints);
+ ps.setObject(1, sqlInts, Types.ARRAY);
+ return ps;
+ }
+
+ @Benchmark
+ public Statement setArray() throws SQLException {
+ Array sqlInts = connection.createArrayOf("int", ints);
+ ps.setArray(1, sqlInts);
+ return ps;
+ }
+
+ public static void main(String[] args) throws RunnerException {
+ Options opt = new OptionsBuilder()
+ .include(BindArray.class.getSimpleName())
+ .addProfiler(GCProfiler.class)
+ .addProfiler(FlightRecorderProfiler.class)
+ .detectJvmArgs()
+ .build();
+
+ new Runner(opt).run();
+ }
+}
diff --git a/ubenchmark/src/main/java/org/postgresql/benchmark/statement/ProcessBoolean.java b/ubenchmark/src/main/java/org/postgresql/benchmark/statement/ProcessBoolean.java
new file mode 100644
index 0000000..785cd29
--- /dev/null
+++ b/ubenchmark/src/main/java/org/postgresql/benchmark/statement/ProcessBoolean.java
@@ -0,0 +1,97 @@
+/*
+ * Copyright (c) 2017, PostgreSQL Global Development Group
+ * See the LICENSE file in the project root for more information.
+ */
+
+package org.postgresql.benchmark.statement;
+
+import org.postgresql.util.ConnectionUtil;
+
+import org.openjdk.jmh.annotations.Benchmark;
+import org.openjdk.jmh.annotations.BenchmarkMode;
+import org.openjdk.jmh.annotations.Fork;
+import org.openjdk.jmh.annotations.Level;
+import org.openjdk.jmh.annotations.Measurement;
+import org.openjdk.jmh.annotations.Mode;
+import org.openjdk.jmh.annotations.OutputTimeUnit;
+import org.openjdk.jmh.annotations.Param;
+import org.openjdk.jmh.annotations.Scope;
+import org.openjdk.jmh.annotations.Setup;
+import org.openjdk.jmh.annotations.State;
+import org.openjdk.jmh.annotations.TearDown;
+import org.openjdk.jmh.annotations.Threads;
+import org.openjdk.jmh.annotations.Warmup;
+import org.openjdk.jmh.infra.Blackhole;
+import org.openjdk.jmh.runner.Runner;
+import org.openjdk.jmh.runner.RunnerException;
+import org.openjdk.jmh.runner.options.Options;
+import org.openjdk.jmh.runner.options.OptionsBuilder;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.Properties;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Benchmark to test performance of ResultSet.getBoolean() method.
+ *
+ * @author jorsol
+ */
+ at Fork(value = 1, jvmArgsPrepend = "-Xmx128m")
+ at Measurement(iterations = 10, time = 1, timeUnit = TimeUnit.SECONDS)
+ at Warmup(iterations = 3, time = 1, timeUnit = TimeUnit.SECONDS)
+ at State(Scope.Thread)
+ at Threads(1)
+ at BenchmarkMode(Mode.AverageTime)
+ at OutputTimeUnit(TimeUnit.NANOSECONDS)
+public class ProcessBoolean {
+
+ private Connection connection;
+ private PreparedStatement ps;
+ private ResultSet rs;
+
+ @Param({"5", "10", "50", "100", "10000"})
+ public int rowsize;
+
+ @Param({"0", "10", "50", "100"})
+ private int tokens;
+
+ @Setup(Level.Trial)
+ public void setUp() throws SQLException {
+ Properties props = ConnectionUtil.getProperties();
+
+ connection = DriverManager.getConnection(ConnectionUtil.getURL(), props);
+ ps = connection.prepareStatement("select (random() > 0.5) from generate_series(1, ?)",
+ ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
+ ps.setInt(1, rowsize);
+ rs = ps.executeQuery();
+ }
+
+ @TearDown(Level.Trial)
+ public void tearDown() throws SQLException {
+ rs.close();
+ ps.close();
+ connection.close();
+ }
+
+ @Benchmark
+ public void getBoolean(Blackhole b) throws SQLException {
+ Blackhole.consumeCPU(tokens);
+ rs.first();
+ while (rs.next()) {
+ b.consume(rs.getBoolean(1));
+ }
+ }
+
+ public static void main(String[] args) throws RunnerException {
+ Options opt = new OptionsBuilder()
+ .include(ProcessBoolean.class.getSimpleName())
+ .detectJvmArgs()
+ .build();
+
+ new Runner(opt).run();
+ }
+}
diff --git a/ubenchmark/src/main/java/org/postgresql/benchmark/statement/ProcessResultSet.java b/ubenchmark/src/main/java/org/postgresql/benchmark/statement/ProcessResultSet.java
index c2b9e0d..aa42e9c 100644
--- a/ubenchmark/src/main/java/org/postgresql/benchmark/statement/ProcessResultSet.java
+++ b/ubenchmark/src/main/java/org/postgresql/benchmark/statement/ProcessResultSet.java
@@ -54,6 +54,7 @@ public class ProcessResultSet {
STRING,
TIMESTAMP,
TIMESTAMPTZ,
+ BOOL
}
public enum ColumnIndexType {
@@ -132,6 +133,8 @@ public class ProcessResultSet {
sb.append("localtimestamp");
} else if (type == FieldType.TIMESTAMPTZ) {
sb.append("current_timestamp");
+ } else if (type == FieldType.BOOL) {
+ sb.append("TRUE");
}
String columnName = "c" + String.valueOf(System.currentTimeMillis()) + String.valueOf(i);
columnNames[i] = columnName;
@@ -190,6 +193,8 @@ public class ProcessResultSet {
b.consume(rs.getTimestamp(i));
} else if (type == FieldType.TIMESTAMPTZ) {
b.consume(rs.getTimestamp(i));
+ } else if (type == FieldType.BOOL) {
+ b.consume(rs.getBoolean(i));
}
}
@@ -208,6 +213,8 @@ public class ProcessResultSet {
b.consume(rs.getTimestamp(i));
} else if (type == FieldType.TIMESTAMPTZ) {
b.consume(rs.getTimestamp(i));
+ } else if (type == FieldType.BOOL) {
+ b.consume(rs.getBoolean(i));
}
}
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-java/libpostgresql-jdbc-java.git
More information about the pkg-java-commits
mailing list